java - DatagramSocket 暂时停止接收数据包(Java)

标签 java sockets udp datagram

我在 Lua 中为游戏编写了一个插件,它通过 UDP 数据包(512 字节)将玩家信息发送到远程服务器,远程服务器从数据包中读取数据并将所有玩家信息聚合到一个 xml 文件中(然后可以是所有玩家都可以在网络上查看,这样他们就可以看到彼此的当前状态)。

我已经用 Java 使用 DatagramSocket 对服务器进行编程来处理传入的数据包,但是我注意到一些奇怪的行为。一段时间后,DatagramSocket 似乎暂时停止接受连接大约 10-12 秒,然后再次恢复正常行为(我可以看到没有抛出异常)。客户端发送数据包的频率与此行为发生的速度之间肯定存在关系。如果我增加客户端的更新频率,DatagramSocket 将更快“失败”。

值得一提的是,每个接收到的数据包都会产生一个线程来处理数据包中的数据。如果它有所作为,我将在 Linux 上运行服务器!

有谁知道是什么导致了这种行为的发生?

安德鲁

最佳答案

UDP 是一种完全没有传递保证的网络协议(protocol)。沿途任何位置的任何网络组件(包括客户端和服务器 PC 本身)都可以出于任何原因决定丢弃数据包,例如高负载或网络拥塞。

这意味着您必须进行一些探索才能找出数据包丢失发生的位置。您可以使用 wireshark 之类的工具来查看数据包是否到达服务器。

如果可靠传输比低延迟更重要,请切换到 TCP。如果您坚持使用 UDP,则无论您是否在这个特定时间修复了这个特定问题,都必须允许数据包丢失。

关于java - DatagramSocket 暂时停止接收数据包(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8314174/

相关文章:

java - 未知方法 foo 的输出

java - 将对象初始化为 null 还是 new?

java - 使用 H2 数据库对 DAO 层进行单元测试

java - Camel-Kafka 安全协议(protocol) SASL_PLAINTEXT 不支持

php - 检测 fsockopen() 打开的套接字上的连接中止

node.js - Socket IO 无法发出

java - 为什么我可以在不重置长度的情况下重用 DatagramPacket

php - 使用php套接字向所有连接的客户端发送广播消息

c# - 加密 UDP 数据包

c++ - UDP 客户端到 UDP 服务器的问题,出现 10057 错误