【发布时间】:2012-07-04 22:56:19
【问题描述】:
当我使用类文件测试 RMI 客户端和服务器时,它可以在两台不同的机器上正常工作。现在,当我对 jar 执行相同操作时,客户端无法连接到服务器上的 RMIRegistry。然后当我在同一台机器上用 jar 进行测试时,客户端可以连接到服务器(即使是通过网络 ip 而不是 localhost)。
我怀疑这与 RMI 注册表有关,但我是 RMI 的新手,所以我不知道...
我像这样创建一个 RMIRegistry:
rmiregistry = LocateRegistry.createRegistry(ServiceConstraints.REGISTRY_PORT);
rmiService = (RmiSubjectService) UnicastRemoteObject.exportObject(this,
ServiceConstraints.REGISTRY_PORT);
rmiregistry.rebind("RmiService", rmiService);
客户端连接如下:
remoteService = (RmiSubjectService) Naming.lookup("/" + host + ":"+ port + "/RmiService");
使用 jar 运行时客户端出现的错误:
java.rmi.ConnectException: Connection refused to host: 192.168.2.132; nested exception is:
java.net.ConnectException: Connection timed out: 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.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at ch.uzh.ifi.group10.client.Client.subscribe(Client.java:148)
at ch.uzh.ifi.group10.client.Client.main(Client.java:242)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.net.ConnectException: Connection timed out: 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 S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
... 13 more
【问题讨论】:
-
从类文件更改为 JAR 文件不可能导致网络错误。您确定网络中没有其他任何变化吗?
-
是的,我一个接一个地尝试,除了执行环境之外没有更改任何参数,这就是我难过的原因。我应该注意到这个错误只会在一段时间后发生(代码挂在 Naming.lookup() 上)。此外,奇怪的是,即使我将线程打开 5 分钟,我也遇到了没有任何反应(没有错误,只是挂起)的情况。这可能是因为 RMI 中的超时参数。
-
不,这是您网络中的超时情况。更改为 JAR 文件与此无关,这只是一个巧合。除非您自己设置,否则 RMI 中没有连接超时,只有默认值,即 system 默认值,而不是 Java 的默认值,大约为 70 秒。如果您无法在几秒钟内建立连接,则说明您的网络存在严重问题。
-
虽然我已经测试了很多次,但运行类文件从未失败似乎很奇怪。我不太确定,但代码库可能与它有关吗?难道是客户端无法下载服务器存根?
-
如果是这样,您将获得
ClassNotFoundException。192.168.2.132是您希望看到的 IP 地址吗?你能从客户端主机ping那个IP地址吗?如果没有,请参阅 RMI 常见问题解答中的 A.1 项。
标签: java rmi executable-jar