[英]DatagramSocket randomly stops receiving DatagramPackets
我正在创建一个Java多人游戏,该游戏解决了局域网中客户端和服务器之间不断发送DatagramPackets的问题。
随机地,客户端的DatagramSocket将停止从服务器接收数据包,因此客户端不会从服务器接收更新。
看来DatagramSocket完全停止接收,并且将不会继续接收。 在每种客户端-服务器情况下都会发生此问题。
如果有人有任何想法,请说出我的想法!
Windows PC,Java 1.8
listening = true
PACKET_SIZE = 3096
buffer = new byte[PACKET_SIZE]
addr = InetAddress.getLocalHost()
port = new Random().nextInt(65536);
processor = Object
while(listening) {
DatagramPacket p = new DatagramPacket(buffer, buffer.length, addr, port);
try {
socket.receive(p); // Code stops here
processor.add(p); // sends to queue to be processed
} catch(IOException e) {
e.printStackTrace();
}
buffer = new byte[PACKET_SIZE];
}
我希望程序可以无限期运行(假设服务器继续发送数据包)。 但是,套接字在随机的时间量(不是每次都相同的随机时间)后停止接收数据包。
简短的答案:远程服务器已停止发送UDP数据报,或者网络由于某种原因已停止传送它们。
我假设您可以通过某种方式让服务器知道您用来侦听数据报的随机端口和IP。 如果服务器不使用相同的端口和IP进行发送,则UDP数据报将自动消失。 (但是您说客户代码会工作一段时间然后停止。这意味着IP和端口是正确的。)
我还假设您会告诉我们您是否正在获取异常并看到stacktraces(!)
除了上述内容,我发现您的代码没有错。 如果我没有错过任何东西,那意味着问题出在别的东西上。 我能想到的唯一其他解释是:
服务器已停止发送。
网络已停止传递UDP数据包。 很难知道为什么:
如建议的那样,请尝试在两端使用Wireshark,以查看UDP数据包是否仍由服务器发送并且仍在到达客户端。 这将帮助您缩小问题范围。
请注意,如果您尝试通过UDP实现2路或多路通信,则需要允许消息被随机丢弃。 您的应用程序级协议(使用UDP传输实现)需要能够检测到1并从中恢复,在可能丢弃消息的所有情况下。 如果您弄错了,则协议“锁定”的可能性之一就是。
1-通常将涉及在某种程度上实现超时。 但是只设置一个超时receive
(由另一个答案的建议) 并不能解决这个问题。
一些有助于调试的建议:
使用setSoTimeout(int milliseconds)为套接字设置一个合理的超时,并且还捕获SocketTimeoutException。 服务器可能已经发送了一个数据包,并且由于某种原因它从未到达过。 如果服务器在发送另一个数据包之前正在等待响应,则您的客户端将无限期等待。 然后,您可以捕获SocketTimeoutException并将适当的数据包发送/重新发送到服务器。
安装Wireshark监视从服务器发送的数据包,以及客户端接收的数据包。 您应该能够查看该数据包是否实际上是由服务器发送的,或者客户端从未收到过该数据包,还是客户端实际上已接收到该数据包,但是客户端端出了点问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.