我正在使用Java DatagramSocket将数据流式传输到多个不同的客户端。当我自己处理当前注册的客户端列表时,我只将套接字绑定到服务器端口,而不连接到任何特定的客户端。
但是,由于不使用connect(),我失去了DatagramSocket对无法到达的端口的ICMP通知做出反应的能力,如果其中一个客户端死了,并且没有机会正确地从服务器注销,就会发送这些通知。
有没有办法找回这种行为?我想过每个客户端使用一个DatagramSocket,但这似乎不可行,因为它们都必须绑定到服务器上的同一端口(据我所知,在UDP中是不可能的)。
我知道不能保证我的服务器看到ICMP消息,我将实现某种超时机制来处理这一点,但对ICMP消息的反应将允许我立即停止向任何未运行客户端的主机进行传输,这对流媒体客户端用户来说似乎是一件好事。
发布于 2011-11-14 11:14:51
如果您想要可靠的点对点连接,我会使用TCP。
但是,如果你想要UDP,我建议你的客户端发送心跳,这样发布者就可以让停止发送的订阅者超时。我假设您不需要可靠的连接,但仍然值得订阅者将数据包发送回发布者。
发布于 2011-11-14 22:32:04
它只被连接的UDP套接字抛出的原因是它在'C‘层是如何工作的,原因是,由于是异步的,你没有其他方法可以知道是哪个目标地址导致了它,因为在'C’层你所拥有的只是一个errno
,而不是ICMP消息本身的内容。因此,要“找回行为”,您确实需要每个客户端都有一个连接的套接字。如果这不实际,你将不得不依赖于应用程序ACK的存在或不存在。
https://stackoverflow.com/questions/8120666
复制相似问题