Java 带有类文件的RMI可以工作,但不适用于JAR

Java 带有类文件的RMI可以工作,但不适用于JAR,java,rmi,executable-jar,Java,Rmi,Executable Jar,当我使用类文件测试RMI客户机和服务器时,它在两台不同的机器上运行时不会出现任何问题。现在,当我对jar执行同样的操作时,客户机无法连接到服务器上的注册中心。然后,当我在同一台机器上使用jar进行测试时,客户机可以连接到服务器(甚至通过网络ip而不是本地主机) 我怀疑这与RMI注册表有关,但我是RMI的新手,所以我不知道 我创建了一个注册表,如下所示: rmiregistry = LocateRegistry.createRegistry(ServiceConstraints.REGISTRY_

当我使用类文件测试RMI客户机和服务器时,它在两台不同的机器上运行时不会出现任何问题。现在,当我对jar执行同样的操作时,客户机无法连接到服务器上的注册中心。然后,当我在同一台机器上使用jar进行测试时,客户机可以连接到服务器(甚至通过网络ip而不是本地主机)

我怀疑这与RMI注册表有关,但我是RMI的新手,所以我不知道

我创建了一个注册表,如下所示:

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
java.rmi.ConnectException:拒绝主机连接:192.168.2.132;嵌套异常是:
java.net.ConnectException:连接超时:连接
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(未知源)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(未知源)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(未知源)
位于sun.rmi.server.UnicastRef.newCall(未知源)
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
位于java.rmi.Naming.lookup(未知源)
位于ch.uzh.ifi.group10.client.client.subscribe(client.java:148)
位于ch.uzh.ifi.group10.client.client.main(client.java:242)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
原因:java.net.ConnectException:连接超时:连接
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(未知源)
位于java.net.PlainSocketImpl.connectToAddress(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(未知S
(来源)
位于sun.rmi.transport.proxy.rmisMasterSocketFactory.createSocket(未知S
(来源)
... 还有13个

问题确实出在网络上。特别是我没有意识到我的防火墙阻止了套接字,所以我无法连接。

从类文件更改为JAR文件不可能导致网络错误。你确定网络中没有其他改变吗?是的,我一个接一个地尝试了,除了执行环境之外,没有改变任何参数,这就是为什么我被难住了。我应该注意,这个错误只会在一段时间后发生(代码挂起在Naming.lookup()上)。另外,奇怪的是,我也遇到了这样的情况:即使我让线程打开5分钟,也不会发生任何事情(没有错误,只是挂起)。这可能是因为RMI中的超时参数。不,这是网络中的超时条件。更改JAR文件与此无关,这只是巧合。RMI中没有连接超时,除非您自己设置,只有默认值,即系统默认值,而不是Java默认值,大约为70秒。如果你不能在几秒钟内建立连接,你的网络就会出现严重问题。运行类文件从未失败似乎很奇怪,尽管我已经对它进行了多次测试。我不太确定,但代码库是否与此有关?可能是客户端无法下载服务器存根吗?如果是这样,您将得到一个
ClassNotFoundException
192.168.2.132
是您希望看到的IP地址吗?你能从客户端主机ping这个IP地址吗?如果没有,请参阅RMI常见问题解答中的项目A.1。