无阻塞服务器和线程安全

时间:2010-11-12 03:25:28

标签: java multithreading io

我有一台服务器使用一个线程从远程数据源接收UDP DatagramPackets;和一个TCP ServerSocket来监听远程客户端请求并为每个客户端生成一个专用线程。 我想通过ServerSocket将每个DatagramPackets传输到多个客户端。现在我遇到了严重的数据包丢失。有人可以提一些建议吗? 提前谢谢。

3 个答案:

答案 0 :(得分:0)

设计中的协议选择是否错误? 当你使用TCP时,对于多个客户端来说应该是可靠的。但由于在服务器端引入了对UDP槽耦合(桥接/重新广播)的依赖,可靠性失败了。

如果您考虑到数据包将在设计中丢失,则UDP或多或少适用于可靠的应用程序。

  • 解决方案1:更改协议
  • 解决方案2:如果无法更改协议,则更改客户端用户对服务质量的期望
  • 解决方案3:向UDP端添加冗余以重复请求,提前存储数据,预计未来质量下降,维护大量累积数据缓存,无论如何都为客户提供服务。

答案 1 :(得分:0)

更重要的是要在发送方上摆脱UDP ,而不是试图以某种方式将其扼杀到接收机的TCP设计中,而这已经太晚了。数据包在发送方和接收方之间丢失,而不是在接收方中丢失。修复接收器代码不会解决实际问题。

答案 2 :(得分:0)

在不了解您的应用程序设计的情况下,我可以做出以下猜测:

  • 您的UDP源发送的数据包数量超过接收方可以处理的数据包导致数据包被丢弃,因为
  • 在将数据包传递给TCP客户端时,您的接收器被阻止,因为
  • 您的TCP客户端没有足够快地获取数据包导致缓冲区填满(这会强制服务器阻塞,导致它丢失UDP数据包)。