0

クラス ファイルを使用して RMI クライアントとサーバーをテストすると、2 つの異なるマシンで問題なく動作します。jar で同じことを行うと、クライアントはサーバー上の RMIRegistry への接続に失敗します。次に、同じマシンでjarをテストすると、クライアントはサーバーに接続できます(localhostではなくネットワークIPを介しても)。

これは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
4

1 に答える 1

0

問題はネットワークであることが判明しました。具体的には、ファイアウォールがソケットをブロックしていることに気付かなかったため、接続できませんでした。

于 2012-07-04T14:56:19.147 に答える