2

NIO を使用して複数のサーバー (その多くは同じポートに応答するように構成されている) からの UDP パケットをリッスンするクライアント コードを作成しています。既知の各サーバーNIOに専用のチャネルを設定しようとして失敗しました。2 つのクライアントが同じポートにバインドされていますが、1 つだけが読み取り可能です。

だから私は今、宛先を指定せずにポートにバインドしようとしています

DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(port));

私のセレクターは、すべてのサーバーからこのポートに向けられたすべての UDP パケットを正常に受信するようになりました

...    
  SelectionKey selKey = it.next();
  if (selKey.isValid() && selKey.isReadable()) {
    DatagramChannel sChannel = (DatagramChannel) selKey.channel();
    sChannel.getRemoteAddress();//My problem lies here
 ....

予想どおり sChannel.getRemoteAddress() は、構成していないため null を返します。では、このパケットの発信元を特定するにはどうすればよいでしょうか。

4

3 に答える 3

1

DatagramPacket の送信元アドレスはパケット内にあります。Javadoc を参照してください。または、DatagramChannel またはその基になる DatagramSocket を接続すると、そこから取得できますが、それ以外の場合は取得できません。

于 2013-02-11T08:35:25.687 に答える
1

getRemoteAddress() は、DatagramChannel 接続で null を返します。

次のコードを使用しました:

//Declare the client address to be any random value, Just for initialization                
InetSocketAddress clientAddress = new InetSocketAddress("127.0.0.1",1000);
//Declare the clientaddress' buffer 
ByteBuffer buffer = ByteBuffer.allocate(255);
// Receive from the buffer
clientAddress = (InetSocketAddress)clientChannel.receive(buffer);
//This address is retained by masking receive 
System.out.println("Client address : " + clientAddress);
于 2015-07-07T15:14:14.967 に答える