使用数据报通道时出现端口不可达问题

4

在使用Datagram Channel时,我遇到了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在评论中指出的那样,绑定需要在接收方进行,连接需要在发送方进行。发送方的更新后的代码如下:

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));

现在的问题是,如果设置“host”为“localhost”,程序可以正常工作,但如果我们将IP(如10.132.0.30)作为“host”传递,就会出现java.net.PortUnreachableException异常。虽然channel.isConnected()选项返回“true”,但channel.write(buffer)命令会抛出异常。
更新2: PortUnreachableException现在已经消失了。现在代码中唯一的区别是我正在使用选择器来接受接收器端的连接。我仍然不明白为什么在不使用选择器的情况下会出现错误。如果有人遇到这个问题并知道原因,请发表您的答案。

2
UDPort的值是多少?为什么要绑定发送方?你应该绑定接收方并从发送方连接,不是吗? - shazin
感谢您指出了这一点。我已经从发送方那里移除了绑定,并在接收方进行了操作。现在连接已经发生,但是有一个警告:如果“host”设置为“localhost”,则连接会成功,而如果设置为“192.168.1.3”,则连接会失败。为什么IP地址无法连接?是不是需要以其他格式传递IP地址而不是字符串? - Aditya
似乎你正在同一台机器上测试发送方和接收方。你确定这台机器的IP地址吗? - shazin
是的,目前在同一台机器上进行测试。使用ifconfig找到了IP地址。所以应该是正确的。 - Aditya
2个回答

1

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

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

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


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

谢谢回复。我刚刚尝试将主机字符串设置为“localhost”而不是“192.168.1.3”。在这种情况下,连接成功了。您有什么想法为什么IP地址会失败但名称可以正常工作吗?因为当我连接到远程计算机时,我需要传递该计算机的IP地址。 - Aditya
连接已建立,但数据是否传输成功呢?从根本上讲,要么是IP地址无法到达-请使用ping(1)进行检查-要么是该端口没有任何监听。 - user207421
如果将“localhost”作为“host”传递而不是IP地址,则数据可以正确传输。但是当使用实际的IP地址时,我会收到java.net.PortUnreachbaleException异常。顺便说一下,由于我只有一个发送器和一个接收器,所以没有必要使用选择器。你有什么关于为什么会出现异常的想法吗?在IP地址的情况下,channel.isConnected()返回“true”,但是channel.write(buffer)或channel.send(buffer,address)会产生此异常。 - Aditya
@Aditya UDP连接在网络上不会有任何作用,因此它实际上永远不会失败,除非参数无效,例如0.0.0.0。绑定时删除主机参数:只需绑定端口即可。这将使您绑定到0.0.0.0,这意味着所有接口都可以使用。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接