在使用数据报通道时,我得到一个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
。参数“host”设置为:
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连接。发件人的更新代码是:
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));
现在的问题是,如果“主机”设置为“本地主机”,程序可以工作,但是如果我们传递一个 IP 说 10.132.0.30 作为“主机”,java.net.PortUnreachableException
就会发生。虽然channel.isConnected()
选项返回“true”,但 channel.write(buffer) 命令会给出异常。
更新 2:
现在PortUnreachableException
没有了。现在代码中的唯一区别是我使用选择器来接受接收端的连接。我仍然不明白为什么在不使用选择器时会出现错误。如果有人偶然发现这个问题并且知道,请发布您的答案。