如何";清除“;Java DatagramSocket上的接收缓冲区?

如何";清除“;Java DatagramSocket上的接收缓冲区?,java,sockets,udp,Java,Sockets,Udp,我有一个Java程序,它不断地从外部系统发送UDP数据 我们需要定期停止接收数据(因为另一台机器正在处理数据)。在这些时间里,我的套接字读取器线程进入睡眠循环。当开始接收数据包时,我再次进入socket.receive(Packet),缓冲区中充满了我不应该处理的数据包。(数据在“停止时间”时出现。) 有没有办法清除DatagramSocket的缓冲区 如果没有,最好的选择是什么?当我进入等待状态时,将缓冲区大小设置为0,并在我再次开始服务数据包时将其恢复?当我等待时关闭套接字,当我回来时打开一

我有一个Java程序,它不断地从外部系统发送UDP数据

我们需要定期停止接收数据(因为另一台机器正在处理数据)。在这些时间里,我的套接字读取器线程进入睡眠循环。当开始接收数据包时,我再次进入
socket.receive(Packet)
,缓冲区中充满了我不应该处理的数据包。(数据在“停止时间”时出现。)

有没有办法清除DatagramSocket的缓冲区


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

不要在套接字上停机,而是在任何代码处理数据包时停机

所以套接字继续像平常一样接收数据,但是如果它处于停机状态,它会立即丢弃数据包


这并不是最有效的解决方案,但它确实很容易实现,而且可能很有用,因为在其他情况下,它使节点保持打开状态,以便在不同的时间接受不同类型的数据包。

我喜欢它。机器无论如何都会获取数据,而实际的套接字IO相对来说是相当便宜的(如果操作正确:-)。然而,这似乎仍然可能导致“停止时间”和“其他机器”的竞争条件,除非数据包中有额外的信息来确定谁应该处理它们…@pst假设数据包有关于它们的某种识别信息,那么无论关闭什么信号都应该能够告诉它“不要接受id 1400000之后的数据包”之类的内容。这样做的另一个好处是,即使1399999被延迟并在kill信号到达节点后到达节点,它也会被处理。@pst是的,存在竞争条件。幸运的是,切换很少发生(它是群集的一部分,在主服务器停机时触发,我们需要进行热备份)。在这些时间段内丢失一点数据是可以接受的(不需要精确的正确性,但我们希望尽可能保持准确,并且绝对不希望计数过多)。