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。参数“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没有了。现在代码中的唯一区别是我使用选择器来接受接收端的连接。我仍然不明白为什么在不使用选择器时会出现错误。如果有人偶然发现这个问题并且知道,请发布您的答案。

4

2 回答 2

1

代码是正确的,但端口确实无法访问。这是一个网络连接问题,或者一个没有监听器的问题,而不是一个编码问题。

于 2012-11-14T06:01:53.260 回答
1

尝试使用以下方法获取 IP 地址

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

UDPort 必须等于您用于在 Receiver 中绑定的端口。

于 2012-11-14T06:36:05.683 回答