有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

网络使用Javasocket处理无法访问的UDP端口

我使用Java DatagramSocket将数据流传输到多个不同的客户端。当我自己处理当前注册的客户机列表时,我只将socket绑定到服务器端口,而不连接到任何特定的客户机

但是,由于不使用connect(),我失去了DatagramSocket对无法访问端口的ICMP通知作出反应的能力,如果其中一个客户端死亡,并且没有机会正确地向服务器注销,就会发送该通知

有没有办法恢复这种行为?我曾想过每个客户端使用一个DatagramSocket,但这似乎不可行,因为它们都必须绑定到服务器上的同一端口(据我所知,在UDP中不可能)

我知道,不能保证我的服务器会看到ICMP消息,我将实现某种超时机制来处理这些消息,但对ICMP消息作出反应将允许我立即停止向任何没有运行客户端的主机传输,这对于流式客户端用户来说似乎是一件好事


共 (2) 个答案

  1. # 1 楼答案

    如果你想要可靠的点对点连接,我会使用TCP

    但是,如果您想要UDP,我建议您的客户端发送心跳信号,以便发布者可以暂停停止发送的订阅者。我假设你不需要可靠的连接,但它仍然值得订阅者将数据包发送回发布者

  2. # 2 楼答案

    它仅由连接的UDP套接字抛出的原因是,它在“C”级别上是这样工作的,的原因是,是异步的,没有其他方法可以判断是哪个目标地址导致了它,因为在“C”级别上只有一个^{,而不是ICMP消息本身的内容。因此,为了“恢复行为”,您确实需要为每个连接的客户端提供一个套接字。如果这不实际,你只能依赖于应用程序ACK的存在与否