2

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

但是,由于不使用 connect(),我失去了 DatagramSocket 对不可达端口的 ICMP 通知做出反应的能力,如果其中一个客户端死亡并且没有机会正确地向服务器注销,则会发送这些通知。

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

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

4

2 回答 2

1

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

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

于 2011-11-14T11:14:50.840 回答
0

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

于 2011-11-14T22:32:04.410 回答