4

データグラム チャネルの使用中に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なくなりました。現在のコードの唯一の違いは、レシーバー側で接続を受け入れるためにセレクターを使用していることです。セレクターが使用されていないときにエラーが発生した理由はまだわかりません。誰かがこの質問に出くわして知っている場合は、回答を投稿してください。

4

2 に答える 2

1

次を使用してIPアドレスを取得してみてください

channel.connect(new InetSocketAddress(InetAddress.getByName(host),UDPort));

UDPortは、Receiverでのバインドに使用しているポートと同じである必要があります。

于 2012-11-14T06:36:05.683 に答える
1

コードは正しいのですが、実際にはポートに到達できません。これはネットワーク接続の問題、またはリスナーがない問題であり、コーディングの問題ではありません。

于 2012-11-14T06:01:53.260 に答える