使用Java套接字处理无法访问的UDP端口

时间:2011-11-14 11:06:04

标签: java networking udp datagram

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

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

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

我知道我的服务器无法保证看到ICMP消息,我会实现某种超时机制来处理,但对ICMP消息做出反应会让我立即停止向任何主机发送没有客户端运行,这对流媒体客户端用户来说似乎是一件好事。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

它仅由连接的UDP套接字引发的原因是它在“C”级别的工作方式,以及的原因是异步的,没有其他方法可以告诉哪个目标地址导致它,因为你在'C'级别拥有的只是errno,而不是ICMP消息本身的内容。因此,要“恢复行为”,您确实需要每个客户端连接一个套接字。如果那不实用,你只需要依赖应用程序ACK的存在或不存在。