繁体   English   中英

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

[英]DatagramSocket temporarily stops receiving packets (Java)

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

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

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

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

安德鲁

UDP是一种绝对没有交付保证的网络协议。 沿途任何地方的任何网络组件(包括客户端和服务器PC本身)都可以出于任何原因(例如高负载或网络拥塞)决定丢弃数据包。

这意味着您必须花点时间找出丢包发生的位置。 您可以使用wireshark之​​类的工具查看数据包是否完全到达服务器。

如果可靠的传送比降低延迟更重要,请切换到TCP。 如果您坚持使用UDP,则无论您是否在此特定时间解决此特定问题,都必须允许数据包丢失。

我的推测是您的服务器端接收缓冲区空间不足。

您可能需要重新设计:生成线程是一项非常昂贵的操作。 对每个传入的数据包执行此操作将导致系统具有相对较低的吞吐量,这可以轻松解释为什么接收队列不断增加。

另请参阅在Linux中在运行时指定UDP接收缓冲区大小

PS,我确定您已经知道UDP不保证消息传递,因此我不会为此而努力。

为每个UDP数据包启动线程是Bad Idea TM UDP服务器传统上被编码为简单的接收循环(毕竟,您只需要一个套接字)。 这样,您可以避免线程,同步等所有开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM