データグラム チャネルの使用中にPortUnreachableException
. これは私のコードがどのように見えるかです: これは送信者側です
//Open a non-blocking socket to send data to Receiver
DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(10000));
channel.connect(new InetSocketAddress(host,UDPort));
私に与えるのはこのコードです:java.net.PortUnreachableException
。パラメータ「ホスト」は次のように設定されます。
String host = new String("192.168.1.3");
レシーバー側はこちら
//Open a Socket to listen for incoming data
DatagramChannel channel = DatagramChannel.open();
channel.connect(new InetSocketAddress(UDPort));
channel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate((recvpkt[0].length)*4);
System.out.println("Waiting for packet");
channel.receive(buffer);
System.out.println("Received packet");
なぜこの例外が発生するのか理解できません。私はネットで例を調べましたが、これはコードがどうあるべきかを示唆している方法です。
更新 1:
shazin のコメントで指摘されているように、バインディングは Receiver で、接続は Sender で行う必要があります。Sender の更新されたコードは次のとおりです。
DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress(host,UDPort));
レシーバーの場合:
DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(host,UDPort));
ここでの問題は、「ホスト」が「localhost」として設定されている場合、プログラムは機能しますが、「ホスト」として 10.132.0.30 という IP を渡すと、問題がjava.net.PortUnreachableException
発生することです。オプションはchannel.isConnected()
「true」を返しますが、channel.write(buffer) コマンドは例外を返します。
更新 2:
はPortUnreachableException
なくなりました。現在のコードの唯一の違いは、レシーバー側で接続を受け入れるためにセレクターを使用していることです。セレクターが使用されていないときにエラーが発生した理由はまだわかりません。誰かがこの質問に出くわして知っている場合は、回答を投稿してください。