2010-11-12 33 views
0

我有一个服务器,它使用一个线程从远程数据源接收UDP DatagramPackets;和一个TCP ServerSocket来监听远程客户端请求并为每个客户端产生一个专用线程。 我想通过ServerSocket将每个DatagramPackets传输给多个客户端。而现在我遇到了重大的数据包丢失。有人可以提供一些建议吗? 在此先感谢。无阻塞服务器和线程安全

+0

哪里(在服务器和数据源或服务器和客户端之间)以及您在哪个方向发生这种严重的数据包丢失? – 2010-11-12 03:32:36

回答

0

设计中的协议可能只是错误的选择吗? 对于多个客户端应该可靠,因为您使用TCP。但是由于在服务器端引入了对UDP槽耦合(桥接/转播)的依赖性,可靠性失败了。

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

  • 解决方案1:改变协议
  • 解决方案2:如果不可能改变协议,则改变关于服务质量上的客户端侧的用户的期望
  • 解决方案3:添加冗余到UDP侧重复请求,股票数据提前预计未来的质量下降,无论如何维持大量累积的数据缓存以供给客户端。
+1

4.通过UDP重新实现TCP O.o – 2010-11-12 03:51:16

+0

谢谢您的回答。恐怕这是多线程编程中的一个典型的生产者 - 消费者问题。现在我正在努力。任何指导方针表示赞赏。 – 2010-11-15 09:28:35

0

这将是更重要的是在发送而不是试图以某种方式硬塞到你的TCP设计的接收器,它是为时已晚摆脱UDP 的。数据包在发送者和接收者之间丢失,而不是在你的接收者中。修复接收器代码不会解决实际问题。

0

不知道你的应用程序设计的话,我可以做如下的猜测:

  • 你的UDP源发送更多的数据包不是你的接收机可以处理造成数据包被丢弃,因为
  • 你的接收器因为
  • 您的TCP客户端没有足够快地拾取数据包导致缓冲区填满(这会强制服务器阻止导致它丢失UDP数据包的数据包)。
+0

谢谢你的回答。我找到了丢包的原因,就像你说的那样。接收缓冲区由UDP接收线程和TCP发送线程共享,如果发送线程在新数据包到来之前未完成发送过程,则会导致数据包丢失。我尝试了wait-notify机制来安排这些写入和读取线程,但它很容易死锁。由于我没有太多的多线程编程经验,我不知道是否有其他一些机制。你能提出一些建议吗?万分感谢! – 2010-11-15 09:19:55

+0

@Xu DXn:尝试使用类似[BlockingQueue](http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html)或[ConcurrentLinkedQueue](http ://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html)。每个TCP连接可能有一个队列。但是您必须处理您接收到的UDP包比一个或多个TCP客户端可以应付并决定丢弃哪些包的可能性。 – 2010-11-16 22:02:59