Java UDP DatagramSocket 停止接收
Java UDP DatagramSocket stops receiving
我有一个 DatagramSocket,我在其中循环接收数据,它最终停止接收数据包。我向服务器发送一条建立连接的问候消息。然后我开始按预期接收数据包。最终它只是停止接收。
发送服务器已验证它们仍在通过 tcp 转储将数据包发送到同一地址,但最终此代码在接收调用时挂起。
有什么会导致套接字停止接收的吗?
String hello = "hello";
InetAddress IPAddress = InetAddress.getByName("serveraddress");
DatagramPacket outboundPacket = new DatagramPacket(hello.getBytes(),hello.getBytes().length, IPAddress, 54321 );
DatagramSocket registerSocket = new DatagramSocket(61646);
registerSocket.send(outboundPacket);
int count = 0;
while(!done){
count++;
byte[] inboundData = new byte[1368];
DatagramPacket inboundPacket = new DatagramPacket(inboundData,inboundData.length);
System.out.println(registerSocket.getPort());
System.out.println(registerSocket.getLocalPort());
//Eventually locks up here after hundreds of successful receives
registerSocket.receive(inboundPacket);
byte[] data = inboundPacket.getData();
String test = new String(data, "ISO-8859-1");
System.out.println(test+"---"+count);
}
registerSocket.close();
如果您在 NAT 后面,如果长时间没有出站流量,映射将会超时。确保每隔几分钟发送一次出站数据报,以保持映射在路由器中处于活动状态。
从问题中不清楚,您是否在一个进程中使用多个 DatagramSocket:这很重要。参见 Java: Receiving an UDP datagram packet with multiple DatagramSockets
除非使用多播,否则新创建的数据报套接字将继承进程的接收游标和钳位
收到的现有的。
我有一个 DatagramSocket,我在其中循环接收数据,它最终停止接收数据包。我向服务器发送一条建立连接的问候消息。然后我开始按预期接收数据包。最终它只是停止接收。
发送服务器已验证它们仍在通过 tcp 转储将数据包发送到同一地址,但最终此代码在接收调用时挂起。
有什么会导致套接字停止接收的吗?
String hello = "hello";
InetAddress IPAddress = InetAddress.getByName("serveraddress");
DatagramPacket outboundPacket = new DatagramPacket(hello.getBytes(),hello.getBytes().length, IPAddress, 54321 );
DatagramSocket registerSocket = new DatagramSocket(61646);
registerSocket.send(outboundPacket);
int count = 0;
while(!done){
count++;
byte[] inboundData = new byte[1368];
DatagramPacket inboundPacket = new DatagramPacket(inboundData,inboundData.length);
System.out.println(registerSocket.getPort());
System.out.println(registerSocket.getLocalPort());
//Eventually locks up here after hundreds of successful receives
registerSocket.receive(inboundPacket);
byte[] data = inboundPacket.getData();
String test = new String(data, "ISO-8859-1");
System.out.println(test+"---"+count);
}
registerSocket.close();
如果您在 NAT 后面,如果长时间没有出站流量,映射将会超时。确保每隔几分钟发送一次出站数据报,以保持映射在路由器中处于活动状态。
从问题中不清楚,您是否在一个进程中使用多个 DatagramSocket:这很重要。参见 Java: Receiving an UDP datagram packet with multiple DatagramSockets
除非使用多播,否则新创建的数据报套接字将继承进程的接收游标和钳位 收到的现有的。