2011-12-08 34 views
5

我有一个Java程序不断从外部系统发送UDP数据。如何“清除”Java DatagramSocket上的接收缓冲区?

定期地,我们需要停止接收数据(因为另一台机器正在处理它)。在那段时间,我的套接字阅读器线程进入睡眠循环。当是开始接收数据包的时候,我再次进入socket.receive(Packet),并且拥有一个缓冲区满了数据包,我应该而不是正在处理。 (数据来,而在“停止时间”。)

有没有办法来清除一个DatagramSocket的缓冲?

如果不是,那么最好的选择是什么?当我进入等待状态时将缓冲区大小设置为0,并在我开始再次服务数据包时将其恢复?当我等待时,关闭套接字,当我回来时打开一个新的套接字?

回答

4

而不是具有插座上的停机时间,对任何代码处理这些分组的停机时间。

所以插座继续获得像通常那样,但如果它的停工期,它只是立即丢弃该数据包。

不完全是最有效的解决方案,但它真的很容易实现,并为它的叶子在其他情况下,在不同时间接受不同类型的数据包的开放节点可能是有用的。

+0

我喜欢它。无论如何,机器都会获取数据,而实际的套接字IO比较便宜(如果正确完成:-)。然而,似乎这仍然可能导致与“停止时间”和“其他机器”的比赛条件,除非在包中有确定谁应该处理它们的额外信息... – 2011-12-08 23:41:53

+0

@pst假设数据包有某种类型识别有关它们的信息,然后无论什么信号将其关闭应该能够告诉它“在ID 1400000之后不接受数据包”或其他东西。这具有额外的优势,即使延迟了1399999处理,并且在杀死信号被击中后到达节点。 – corsiKa

+0

@pst是的,有这种竞争条件。幸运的是,切换很少发生(它是集群的一部分,当主服务器关闭时我们需要进行热备份)。在这段时间内丢失一点数据是可以接受的(确切的正确性不是必需的,但我们希望保持尽可能准确,绝对不要过分计数)。 –