2012-04-26 12 views
0

クラスファイルを使ってRMIクライアントとサーバをテストすると、2つの異なるマシンで問題なく動作します。今では、jarで同じことをすると、クライアントはサーバー上のRMIRegistryに接続できません。次に、同じマシン上のjarでテストすると、クライアントはサーバーに接続できます(ローカルホストではなく、ネットワークip経由でも)。クラスファイルを持つRMIはjarファイルでは動作しません

私はそうのようなのrmiregistryを作成

...私は、これはRMIレジストリとは何かを持っている疑いがあるが、私はRMIでの総初心者ですので、私は見当もつかない:

rmiregistry = LocateRegistry.createRegistry(ServiceConstraints.REGISTRY_PORT); 
rmiService = (RmiSubjectService) UnicastRemoteObject.exportObject(this, 
        ServiceConstraints.REGISTRY_PORT); 
rmiregistry.rebind("RmiService", rmiService); 

クライアントは次のように接続します。jarを実行しているとき、私はクライアントに乗る

remoteService = (RmiSubjectService) Naming.lookup("/" + host + ":"+ port + "/RmiService"); 

エラー:

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 
+0

クラスファイルからJARファイルに変更すると、ネットワークエラーが発生する可能性がありません。ネットワークで何も変更されていないことは確かですか? – EJP

+0

はい実行環境以外のパラメータを変更することなく、直ちに試してみました。そのために私は困惑しています。このエラーは、しばらくしてから発生します(コードはNaming.lookup()でハングします)。また、奇妙なことは、スレッドを5分間開いたままにしても、何も起こらない状況(エラーなし、ちょうどぶら下がっている)に遭遇したことです。これは、RMIのタイムアウトパラメータが原因である可能性があります。 – Caroline

+0

いいえ、ネットワークのタイムアウト条件です。 JARファイルへの変更はそれとは無関係でしたが、それはちょうど偶然のことでした。あなた自身で設定しない限り、RMIには接続タイムアウトはありません。既定値はJavaのものではなく、* system * defaultです。約70秒です。数秒で接続できない場合は、ネットワークに深刻な問題があります。 – EJP

答えて

0

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

関連する問題