gpt4 book ai didi

java - DatagramSocket 随机停止接收 DatagramPackets

转载 作者:行者123 更新时间:2023-12-02 01:32:50 28 4
gpt4 key购买 nike

我正在创建一个 java 多人游戏,它解决了 LAN 上客户端和服务器之间不断发送 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和端口是正确的。)

我还假设您会告诉我们如果您遇到异常并看到堆栈跟踪(!)

除了上述内容之外,我认为您的代码没有任何问题。如果我没有遗漏什么,那就意味着问题出在别的地方。我能想到的唯一其他解释是:

  1. 服务器已停止发送。

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

    • 这可能是由于某些防火墙中实现了某种反 DOS 防御。
    • 如果您的客户端位于 NAT 网关后面,并且您使用“打洞”来允许 UDP 数据包通过,则“打洞”可能已超时。 (但是你说这是在 LAN 上,这意味着不应涉及 NAT。NAT 用于在两个网络之间的逻辑边界上转换 IP 地址;例如专用网络 <-> 公共(public)互联网。)

按照建议,尝试在两端使用 Wireshark,查看服务器是否仍在发送 UDP 数据包并仍到达客户端。这将帮助您缩小问题范围。

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

<小时/>

1 - 这通常涉及在某种程度上实现超时。然而,仅仅接收上设置超时(如另一个答案所建议的)并不能解决问题。

关于java - DatagramSocket 随机停止接收 DatagramPackets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778649/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com