Java DatagramSocket随机停止接收DatagramPack

Java DatagramSocket随机停止接收DatagramPack,java,networking,udp,Java,Networking,Udp,我正在创建一个java多人游戏,它解决了局域网上客户端和服务器之间不断发送数据包的问题 随机地,客户端的DatagramSocket将停止从服务器接收数据包,因此客户端不会从服务器接收更新 看起来DatagramSocket完全停止接收,不会恢复接收。在每种客户机-服务器情况下都会发生此问题 如果有人有任何想法,请说,因为我没有想法 Windows PC,Java 1.8 listing=true 数据包大小=3096 缓冲区=新字节[数据包大小] addr=InetAddress.getLoc

我正在创建一个java多人游戏,它解决了局域网上客户端和服务器之间不断发送数据包的问题

随机地,客户端的DatagramSocket将停止从服务器接收数据包,因此客户端不会从服务器接收更新

看起来DatagramSocket完全停止接收,不会恢复接收。在每种客户机-服务器情况下都会发生此问题

如果有人有任何想法,请说,因为我没有想法

Windows PC,Java 1.8

listing=true
数据包大小=3096
缓冲区=新字节[数据包大小]
addr=InetAddress.getLocalHost()
端口=new Random().nextInt(65536);
处理器=对象
边听{
DatagramPacket p=新的DatagramPacket(buffer,buffer.length,addr,port);
试一试{
socket.receive(p);//代码在此停止
processor.add(p);//发送到要处理的队列
}捕获(IOE异常){
e、 printStackTrace();
}
缓冲区=新字节[数据包大小];
}
我希望程序无限期地运行(假设服务器继续发送数据包)。
但是,套接字在一段随机时间后停止接收数据包(并非每次都是相同的随机时间)。

一些帮助调试的建议:

  • 使用setSoTimeout(int毫秒)为套接字设置合理的超时,并捕获SocketTimeoutException。服务器可能发送了一个数据包,但由于某种原因,它从未到达。如果服务器在发送另一个数据包之前正在等待响应,那么您的客户端将无限期地等待。然后,您可以捕获SocketTimeoutException并向服务器发送/重新发送适当的数据包

  • 安装Wireshark以监视从服务器发送的数据包,以及客户端接收的数据包。您应该能够看到数据包是否确实由服务器发送,数据包是否从未由客户端接收,或者数据包是否确实由客户端接收,但客户端出现了问题


    • 简短回答:要么远程服务器已停止发送UDP数据报,要么由于某种原因网络已停止发送UDP数据报


      我假设您有某种方法让服务器知道您用于侦听数据报的随机端口和IP。如果服务器不使用相同的端口和IP进行发送,UDP数据报将自动消失。(但您说您的客户端代码工作了一段时间后就停止了。这意味着IP和端口是正确的。)

      我还假设,如果您遇到异常并看到stacktraces,您会告诉我们(!)

      除了上面提到的,我看不出你的代码有什么问题。如果我没有遗漏什么,那就意味着问题出在其他方面。我能想到的其他解释只有:

    • 服务器已停止发送

      • 也许它已经崩溃了
      • 也许它“随机”切换到了另一个端口
      • 也许它被锁起来是因为它在等待一些不可能发生的事情。例如,已丢失的响应消息的到达
    • 网络已停止传递UDP数据包。很难知道为什么:

      • 这可能是由于某些防火墙中实施了某种反DOS防御
      • 如果您的客户端位于NAT网关后面,并且您正在使用“穿孔”来允许UDP数据包通过,那么“穿孔”可能已超时。(但你说这是在局域网上,这意味着不应该涉及NAT。NAT用于转换两个网络之间逻辑边界上的IP地址;例如,专用网络-公共互联网。)
    • 根据建议,尝试在两端使用Wireshark,查看服务器是否仍在发送UDP数据包,以及是否仍在到达客户端。那将帮助你缩小问题的范围

      请注意,如果您试图通过UDP实现双向或多路通信,则需要允许消息被随机丢弃。您的应用程序级协议(使用UDP传输实现)需要能够在所有可能丢弃消息的情况下检测T1并从中恢复。如果你弄错了,其中一个可能就是协议“锁定”



      1-这通常涉及在某个级别执行超时。但是,仅在接收上设置超时(正如另一个答案所建议的那样)并不能解决问题。

      您不需要为入站数据报指定地址或端口。它们在收到后都会被更改。那么设置一个超时如何帮助解决这个问题呢?我的意思是,我同意,你应该总是有一个读取超时,没有它你无法编写严肃的网络代码,但你需要解释你的建议。明白。非常感谢。我进一步扩展了。感谢您的建议,我已经检查了服务器是否继续发送数据包。因此,这一定是网络的问题。谢谢你的帮助