java - 使用数据报 channel 时无法访问端口

标签 java networking nio datagram channels

在使用数据报 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");

Receiver端是这样的

//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 在评论中指出的那样,绑定(bind)需要在接收方完成,连接需要在发送方完成。发件人的更新代码是:

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

最佳答案

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

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

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

关于java - 使用数据报 channel 时无法访问端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373394/

相关文章:

java - Vaadin 网格表 : how to draw border for certain columns?

java - 部署时间 list

java - 启动一个线程后,我们如何保持 run 函数运行?我有很多想法,但我不确定哪个更专业?

google-chrome - 为什么 chrome devtools 网络面板中的大小选项卡有 2 个单元格?

java - 使用 Java NIO 发送数据时出现延迟

java - Android - Java空指针异常

java - Spark Java 错误 : Size exceeds Integer. MAX_VALUE

amazon-web-services - Horton Sandbox - AWS EC2 上的 Ambari 未加载(公共(public) IP)

java - 如何跳转到特定行并从 java 中读取

java - Files.walk(),计算总大小