2016-12-13 14 views
0

私はチャットを開発しています。まず、ソケットとストリームを使用してサーバーとクライアントの間で通信しました。今私はRMIに変換しようとしています。RMIへのアドレスとポートのバインド

ローカルで動作していますが、接続しようとすると接続が拒否されます。それはサーバーのローカルIP(192.168.25.28)を示しています。

私のコードは次のようになります。

public void conectar() throws RemoteException, MalformedURLException, NotBoundException{ 
    // COMUNICADOR SERVIDOR (USADO PELO CLIENTE) 
    comunicadorServidor = new ComunicadorServidor(id); // cria um novo comunicador 
    LocateRegistry.createRegistry(8081); // inicia o registro RMI na porta 8081 
    Naming.rebind("//:8081/ComunicadorServidor", comunicadorServidor); // vincula o objeto comunicador ao endereço RMI 
    // COMUNICADOR CLIENTE (USADO PELO SERVIDOR) 
    comunicador = (IComunicadorCliente) Naming.lookup("//" + conexao.getInetAddress().getHostAddress() + ":8082/ComunicadorCliente"); // procura o comunicador no cliente 
} 

だから私は、サーバーとクライアントの両方でRMIを使用し、もう1つは、サーバに、私は認証のようなメソッドを持っているので、それぞれ別のものに接続して、メッセージ、clienteの用途を送りますクライアントでは、サーバーが使用する更新ユーザーリストと受信メッセージのようなメソッドがあります。

まず、RMIクラス(サーバー側)のインスタンスを作成し、ポート8081でレジストリを作成し、オブジェクトをポート8081に「ComunicadorServidor」という名前でバインドします。

その後、サーバーはクライアントRMIに接続しようとします。

私はリバインドメソッドについて読んでいます。アドレスを指定しないと、ローカルホストアドレスにバインドされます。ローカルマシンにバインドされていても、それはまだ外部で利用できますか?そうでなければ、ソケットと同じ場所にバインドするにはどうすればいいですか?ここではポートを指定するだけで、localhost、local ip、またはexternal ipなどの任意のアドレスで使用できるようになります。

クライアントIPを取得するにはどうすればよいですか(今はソケットから取得しています)、どうすれば正しいIPが得られるのでしょうか?ソケットなしでクライアントのRMIに接続できますか?

クライアント側では、RMIクラスを8082にバインドし、提供されたIPとポートを使用してサーバー側でRMIクラスを検索する点を除いて、同じことが不可欠です。

答えて

0

これは、サーバーのローカルIP(192.168.25.28)を示しています。

これは正しいです。パブリックIPアドレスに表示する必要がある場合は、java.rmi.server.hostnameを検索し、RMI FAQの項目A.1を参照する必要があります。

私はリバインドメソッドについて読んでいます。アドレスを指定しないと、ローカルホストのアドレスにバインドされます。ローカルマシンにバインドされていてもまだ利用可能です外側?

レジストリは、サーバー側のファイアウォールルールで許可されている場合は、外部から利用できます。 RMIの意味におけるbindは、リモートオブジェクトをレジストリ内の名前に関連付けることを意味するだけで、Socket.bind()とは何の関係もありません。

そして、ルックアップについては、クライアントIP(現在は私はソケットから取得しています)を取得する最良の方法は何ですか、私は正しいIPを取得することができますか?ソケットなしでクライアントのRMIに接続できますか?

RMIでは「接続」できませんが、クライアントのIPアドレスは必要ありません。クライアントは、リモートオブジェクトをサーバーリモートメソッド(例: register(Client client) throws RemoteException。次に、サーバーには、クライアントのリモートメソッドを直接呼び出すことができるスタブがあります(クライアント側のファイアウォールで許可されています)。

+0

私はあなたが言ったことについてちょうど読んでいました。それはうまくいくようですが、オブジェクトをサーバーにエクスポートするために、独自のリモートオブジェクトを使用してください。私は明日それを試し、あなたにここで知らせるでしょう。 – Deeh

+0

それは働いて、ありがとう!私はサーバがクライアントから取得すべきクラスからユニキャストの拡張を削除しました。それでexporteObjectメソッドを使うことができました。 – Deeh

関連する問題