【问题标题】:Java UDP DatagramSocket stops receivingJava UDP DatagramSocket 停止接收
【发布时间】:2015-12-16 21:31:34
【问题描述】:

我有一个 DatagramSocket,我在其中循环接收,它最终只是停止接收数据包。我向服务器发送一条建立连接的问候消息。然后我开始按预期接收数据包。最终它只是停止接收。

发送服务器已验证它们仍在通过 tcp 转储向同一地址发送数据包,但最终此代码在接收调用上挂起。

有什么会导致socket停止接收吗?

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

【问题讨论】:

  • 你确定它没有崩溃
  • 确定。进程继续运行,没有抛出异常,它肯定会在 registerSocket.receive(inboundPacket);
  • 你在 NAT 后面吗?如果是这样,则可能由于缺乏出站活动而导致映射超时。
  • 我什至没有想到,但一定是这样。给定我的 IP 地址,可能是我的 comcast 调制解调器充当 nat。我会看看我的 nat 超时设置。谢谢。
  • @DavidSchwartz 就是这样。如果您将其发布为答案,我会接受。

标签: java sockets udp


【解决方案1】:

如果您在 NAT 之后,如果长时间没有出站流量,映射将会超时。确保每隔几分钟发送一个出站数据报,以保持路由器中的映射处于活动状态。

【讨论】:

    【解决方案2】:

    从问题中不清楚,您是否在一个进程中使用多个 DatagramSocket:这将是非常重要的。见Java: Receiving an UDP datagram packet with multiple DatagramSockets

    除非使用多播,否则新创建的数据报套接字将继承进程的接收光标和钳位 现有的从接收。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2021-12-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多