【问题标题】:How to "clear out" the receive buffer on a Java DatagramSocket?如何“清除”Java DatagramSocket 上的接收缓冲区?
【发布时间】:2011-12-08 23:15:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java sockets udp


    【解决方案1】:

    与其让套接字停机,不如让处理数据包的任何代码都停机。

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

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

    【讨论】:

    • 我喜欢。无论如何,机器都会获取数据,相比之下,实际的 socket-IO 相当便宜(如果做得正确:-)。然而,除非数据包中有额外的信息来确定谁应该处理它们,否则这似乎仍然会导致“停止时间”和“其他机器”的竞争条件......
    • @pst 假设数据包有某种关于它们的识别信息,那么无论什么信号关闭它都应该能够告诉它“不接受 id 1400000 之后的数据包”或其他东西。这具有额外的优势,即使 1399999 被延迟并在终止信号被击中后到达节点,也可以处理它。
    • @pst 是的,存在竞争条件。幸运的是,切换很少发生(它是集群的一部分,当主服务器关闭并且我们需要转到热备份时触发)。在此期间丢失一点数据是可以接受的(不要求准确无误,但我们希望尽可能保持准确,并且绝对不希望过度计数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2013-05-28
    • 2020-04-11
    相关资源
    最近更新 更多