2009-06-01 30 views
4

私は非常に単純なrmiクライアント/サーバーアプリケーションを持っています。私は、サーバーを作成するためにこれを使用、しかし「のrmiregistry」アプリケーションを使用していない:サーバーへのJava RMI接続

server = new RemoteServer(); 
registry = LocateRegistry.createRegistry(PORT); 
registry.bind("RemoteServer", server); 

クライアント部分がある:ここでは

registry = LocateRegistry.getRegistry(IPADDRESS, PORT); 
remote = (IRemoteServer) registry.lookup("RemoteServer"); 

は魅力的な問題です:アプリケーションは、時に完璧に動作しますサーバーとクライアントの両方が私の(私有の)ローカルネットワークで動作しています。できるだけ早く私は、公開サーバー上のサーバーを置くように、アプリケーションが分間ハング、そして私に次のエラーを与える:私は思う

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.ConnectException: Connection refused to host: 192.168.x.y; nested exception is: 
    java.net.ConnectException: Connection timed out: connect 
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source ... (the rest is truncated) 

キーは(私のプライベートネットワーク上で実行されている)クライアントが接続できないということです自分自身(私のアドレスは192.168.xyです。ここでxyは他の数字ですが実際のエラーメッセージに私のIPアドレスが表示されています)

公共のインターネットでrmiサーバーを殺すと、 "host:abcdへの接続が拒否されました")というメッセージが表示されるので、サーバー側のものが少なくとも動作していることがわかります。

提案がありますか?

EDIT:もう少し明確にする:192.168.x.yはクライアントアドレス、a.b.c.dはサーバーアドレスです。 stacktraceは、クライアントがクライアントに接続できないことを示しています。

+0

あなたはRMIクライアントコールバックを使用していますか? –

答えて

1

192.168。*にはプライベートIPアドレスが含まれます(10. *と同じです)。これらは開いているインターネット上でルーティングされません。サーバーのパブリックIPアドレスを使用していることを確認し、アクセスできるようにファイアウォール(NATを含む)が構成されていることを確認する必要があります。必要なポートでtelnetを使って素早く確認できます。

+0

はい、私は理解し、公共rmiサーバーにtelnetingが動作します:しかし、私の質問は、クライアントが接続に失敗し、私のスタックトレースに私のアドレスを表示している理由ですか?クライアントがサーバーに接続している場合、クライアントのアドレスがスタックトレースに表示されるのはなぜですか? – user85116

0

私は、サーバーがクライアントにソケットを開いてみようとしているが、失敗していると思われますが、例外はその言葉には少し不明です。

RMIはNAT対応ではありませんが、IIRCです。

3

は、仮想マシンのために、このパラメータを使用してサーバーを実行してみてください:

-Djava.rmi.server.hostname=hostname_of_the_server 
関連する問題