3
MulticastSocket multicast_socket = new MulticastSocket(Dialogos.MULTICAST_PORTA);
InetAddress group = InetAddress.getByName(Dialogos.MULTICAST_IP_GRUPO);
multicast_socket.joinGroup(group);
byte[] msg = new byte[1024];
DatagramPacket packet = new DatagramPacket(msg, msg.length);
multicast_socket.receive(packet);

上記のコードでは、サーバーはマルチキャストを介してクライアントから要求を受信して​​います。サーバーは、クライアントに「どこに」あるかを通知することになっています。これは、クライアントが接続先を推測するための1つの方法にすぎず、完全に依存しているわけではありません。

ただし、サーバーはさまざまな環境にインストールできるため、クライアントとの通信にどのインターフェイス/アドレスを使用するかはわかりません。したがって、クライアントにそれがどこにあるかを伝えるために、サーバーで使用可能なすべてのIPアドレスをコンパイルし、それらをすべてマルチキャストで送り返して、クライアントが成功するまでそれらを試すことができるようにします。

私の質問:このメカニズムを改善する方法はありますか?サーバーアプリで、クライアントからマルチキャストを受信したローカルIPを取得できたら、どちらを返送するかがわかります。しかし、それを行うメソッドを見つけることができません。たぶん、クライアントがどのローカルアドレスを選択するかを知るためだけに、クライアントへの接続を試みる方法はありますか?

4

1 に答える 1

2

ユニキャストUDPパケットをクライアントに送り返すだけで、クライアントは送信元IPアドレスを抽出できるようになります。これにより、クライアントとサーバーが相互に通信できるインターフェイス/ルート上のアドレスが確保されます。もちろん、リスニングポート番号を通知するためにそのパケットが必要になります。

于 2012-12-13T18:19:40.597 に答える