论坛首页 入门讨论版 企业应用

一个关于RMI的奇怪的问题

浏览 1172 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2007-08-05
我们有两台服务器,JDK都是1.5.0_12,在一个局域网内,内网IP分别为192.168.10.10,192.168.10.11,对应的外见IP分别为59,244。我写了一个RMI服务器和客户端,在本地调试没有问题。把服务器端布署到244这台服务器上后,在本地启客户端连接,客户端却总是抛这种错误:
java.rmi.ConnectException: Connection refused to host: XX.XX.XX.59; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod
(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy0.call(Unknown Source)
at RMI.Client.callRMI(Client.java:39)
at RMI.Client.main(Client.java:53)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket
(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket
(Unknown Source)
... 9 more
也就是IP被指向59了,而客户端发起连接的时候IP绝对是写的244的IP。
      当我在59服务器上布署服务器,客户端连接59的时候抛的是这个错误:
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect

也就是说不管我写什么样的服务器IP,它总是指向59,换了端口也是一样。很奇怪的问

题。
下面是我的程序代码,服务器端:
public class Server extends UnicastRemoteObject implements Function
{
    public Server() throws RemoteException
    {
    }
    public void call () throws RemoteException
    {
        System.out.println("Receive a call..");
    }
    public static void main (String[] args)
    {
        try
        {
            Server server = new Server();         
             Registry registry = LocateRegistry.createRegistry(3737);        


            Naming.rebind("rmi://127.0.0.1:3737/server", server);
            System.out.println("ComputeEngine bound");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
客户端:
public class Client
{
    public void callRMI ()
    {
        try
        {           
            String IPAPP="rmi://XX.XX.XX.244:3737/server";
            String IPDB="rmi://XX.XX.XX.59:3737/server";
            String IPLOCAL="rmi://127.0.0.1:3737/server";
            Function function=(Function)Naming.lookup(IPAPP);
            function.call();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void main (String[] args)
    {
        Client client=new Client();
        client.callRMI();
    }
}
   
最后更新时间:2007-08-05
会不会是防火墙的问题,检查下。
   
0 请登录后投票
最后更新时间:2007-08-05
这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。


 System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");

   
0 请登录后投票
最后更新时间:2007-08-06
codeutil 写道

这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。


 System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");




曾经写过两个RMI 的程序,也在实际使用中应用了。现在真被这个问题给搞糊涂了,感觉对它还是挺陌生的。
这在客户端加了这句话,仍然报跟以前同样的错误,还是连接到59服务器
   
0 请登录后投票
最后更新时间:2007-08-06
chenge 写道
会不会是防火墙的问题,检查下。

防火墙不会有问题了,两台服务器的防火墙全被我给关了。端口映射也不会有问题的,现在测试的这个端口在其它的应用中使用正常
   
0 请登录后投票
最后更新时间:2007-08-06
你把 java.rmi.server.hostname 属性设置的ip是??

不好意思,我给你的例子代码里,属性名多了个空格,你仔细再检查一下这个语句.


GodJohnny 写道
codeutil 写道

这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。


 System.setProperty("java.rmi.server.hostname", "XX.XX.XX.59");




曾经写过两个RMI 的程序,也在实际使用中应用了。现在真被这个问题给搞糊涂了,感觉对它还是挺陌生的。
这在客户端加了这句话,仍然报跟以前同样的错误,还是连接到59服务器
   
0 请登录后投票
最后更新时间:2007-08-06
检查过了没有空格。我的语句是这样写的:
System.setProperty("java.rmi.server.hostname", "XX.XX.XX.244");
   
0 请登录后投票
最后更新时间:2007-08-06
codeutil 写道

这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。


 System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");




非常感谢!现在问题已经解决了。System.setProperty这段代码是加在服务器端的。
   
0 请登录后投票
最后更新时间:2007-12-12
GodJohnny 写道
codeutil 写道

这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。

 System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");



非常感谢!现在问题已经解决了。System.setProperty这段代码是加在服务器端的。


如果我用的是Spring的RMI又该怎样来解决这个问题呢?

在Spring配置RMI服务的配置文件中好像有那个指定服务IP的property元素叫registryHost,但现在发现一个问题就是当使用该property时连服务都启动不了了!抛出的异常信息如下:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmiService' defined in URL [file:/E:/WorkSpace/OMAS/WebRoot/WEB-INF/classes/config/omasAgent-rmi-service.xml]: Invocation of init method failed; nested exception is java.rmi.ConnectException: Connection refused to host: 192.168.100.7; nested exception is:
java.net.ConnectException: Connection refused: connect
Caused by: java.rmi.ConnectException: Connection refused to host: 192.168.100.7; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
at sun.rmi.registry.RegistryImpl_Stub.list(Unknown Source)

而我的配置如下(其中192.168.100.7是我机器的IP):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="byName">
	<!-- service实现类的配置 -->
	<bean id="omasAgent" class="com.ce.omas.agent.service.impl.OmasAgentImpl" />
	<bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
		<property name="serviceName" value="omasAgentService" />
		<property name="service" ref="omasAgent" />
		<property name="serviceInterface" value="com.ce.omas.agent.service.IOmasAgent" />
		<property name="registryHost" value="192.168.100.7"/>	
		<property name="registryPort" value="1199" />
	</bean>
</beans>
不知各位是否这样用过没有,请大家帮我看一下是什么原因?谢谢!
   
0 请登录后投票
论坛首页 入门讨论版 企业应用

跳转论坛:
JavaEye推荐