Java 使用数据报通道时无法访问端口

Java 使用数据报通道时无法访问端口,java,networking,nio,datagram,channels,Java,Networking,Nio,Datagram,Channels,在使用数据报通道时,我得到了一个PortUnreachableException。这就是我的代码的样子: 这是发送方 //Open a non-blocking socket to send data to Receiver DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); channel.socket().bind(new InetSocketAddress(10000));

在使用数据报通道时,我得到了一个
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在评论中指出的,绑定需要在接收方完成,连接需要在发送方完成。发件人的更新代码为:

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.portUnreachableeException
。当
channel.isConnected()
选项返回“true”时,channel.write(buffer)命令会给出一个异常

更新2:


PortUnreachableException
现在不存在了。现在代码中唯一的区别是我使用选择器来接受接收方的连接。我仍然不明白为什么在没有使用选择器时会出现错误。如果有人无意中发现了这个问题并知道了,请发布您的答案。

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

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

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

UDPort必须等于您用于在接收器中绑定的端口

UDPort的值是多少?你为什么要约束发件人?你应该绑定接收者并从发送者那里连接,不是吗?谢谢你指出这一点。我从发送方取出了绑定,并在接收方进行了绑定。连接现在发生,但有一个警告。如果“主机”设置为“本地主机”而不是“192.168.1.3”,则会连接。为什么IP地址不能连接。IP地址是否需要以字符串以外的格式传递?似乎您正在同一台机器上测试发送方和接收方。你确定机器的IP吗?是的,目前正在同一台机器上测试。使用ifconfig找到IP。所以应该是正确的。回答是Thnx。我刚刚尝试将主机字符串设置为“localhost”,而不是“192.168.1.3”。在这种情况下,将发生连接。有没有想过为什么一个IP地址失败了,而一个名字却起作用了?因为当我连接到远程机器时,我需要传入该机器的IP地址。“连接发生了”,但数据通过了吗?从根本上说,要么IP地址无法访问(请使用
ping(1)
),要么该端口没有侦听任何内容。如果将“localhost”作为“host”而不是IP地址传递,则数据将正确通过。但是当使用实际的IP地址时,我会得到java.net.portUnreachBaleCeption。顺便说一下,没有必要正确使用选择器,因为我只有一个发送者和一个接收者。知道我为什么会有例外吗?channel.isConnected()在IP地址的情况下返回“true”,但channel.write(缓冲区)或channel.send(缓冲区,地址)给出此异常。@Aditya UDP connect在网络上不做任何操作,因此它永远不会实际失败,除非参数无效,例如0.0.0.0。绑定时删除主机参数:仅绑定到端口。这将您绑定到0.0.0.0,这意味着所有接口。