浏览 1172 次
|
锁定老贴子 主题:一个关于RMI的奇怪的问题
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间: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(); } } 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-05
会不会是防火墙的问题,检查下。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-05
这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单
就是在客户端代码中指定要连接rmi服务器ip。
System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-06
codeutil 写道 这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单 就是在客户端代码中指定要连接rmi服务器ip。
System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");
曾经写过两个RMI 的程序,也在实际使用中应用了。现在真被这个问题给搞糊涂了,感觉对它还是挺陌生的。 这在客户端加了这句话,仍然报跟以前同样的错误,还是连接到59服务器 |
|
| 返回顶楼 | |
|
最后更新时间:2007-08-06
chenge 写道 会不会是防火墙的问题,检查下。
防火墙不会有问题了,两台服务器的防火墙全被我给关了。端口映射也不会有问题的,现在测试的这个端口在其它的应用中使用正常 |
|
| 返回顶楼 | |
|
最后更新时间: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服务器 |
|
| 返回顶楼 | |
|
最后更新时间:2007-08-06
检查过了没有空格。我的语句是这样写的:
System.setProperty("java.rmi.server.hostname", "XX.XX.XX.244");
|
|
| 返回顶楼 | |
|
最后更新时间:2007-08-06
codeutil 写道 这个是典型的服务器有多个ip引起的rmi连接问题,解决办法非常简单 就是在客户端代码中指定要连接rmi服务器ip。
System.setProperty("java.rmi.server.hostname ", "XX.XX.XX.59");
非常感谢!现在问题已经解决了。System.setProperty这段代码是加在服务器端的。 |
|
| 返回顶楼 | |
|
最后更新时间: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>不知各位是否这样用过没有,请大家帮我看一下是什么原因?谢谢! |
|
| 返回顶楼 | |




