这些数据包是否会消失?或者他们等待目的地?或者数据包返回然后抛出异常?
在java中,在DatagramPacket构造函数中,byte []缓冲区与长度有什么区别?
DatagramPacket dp = new DatagramPacket(new byte[...], length);
答案 0 :(得分:3)
来自Wikipedia:
UDP是......不可靠 - 当有消息时 被发送,不知道是否会 到达目的地;它可以得到 一路上迷路了。没有 承认的概念, 重传或超时。
答案 1 :(得分:1)
即使目的地在线,也无法保证,UDP数据包将到达,到达发送的顺序,或者不会被分段。 (我相信小于532字节的数据包不会被分段)可能有三个;对于同一个数据包,它是碎片化的,乱序的和不完整的。
网络的简单性和稳定性将决定UDP数据包传输的稳健性,但您必须至少在某些时候认为它不可靠。您所能做的就是尽量减少损失。
由您来决定如果数据包丢失以及如何检测它该怎么做。
如果您想要广播,可靠的消息传递,我建议您查看JMS主题或队列,如ActiveMQ。
答案 2 :(得分:0)
如果使用UDP协议,则无法保证将收到您的数据包。 所以答案是,它将被发送,即使它的目的地不在线。
TCP协议,保证客户将收到数据包。即使他离线,一旦他上网,就会收到该数据包。
答案 3 :(得分:0)
这些数据包是否会消失?或者他们等待目的地?或者数据包返回然后抛出异常?
发生什么取决于"离线"状态。
如果UDP消息到达主机,但应用程序未侦听,则通常会以静默方式丢弃。它绝对不会排队等待应用程序监听。 (这将毫无意义,而且有潜在危险。)
如果UDP消息无法到达主机,因为主机本身处于脱机状态,则将以静默方式丢弃该消息。 (如果数据包可以到达目标主机的本地网络,那么除了主机本身之外没有任何东西可以判断主机是否实际收到了数据包。)
如果网络不知道如何将IP数据包路由到UDP服务器(以及其他一些场景),那么ICMP"目标无法访问"数据包可以发送给发送方,通常会将其报告为Java异常。但是这不能保证。所以可能的结果是:
UDP数据包是黑洞的,发件人没有任何指示,或
UDP数据包是黑洞,发件人获得Java异常。
如果UDP数据包被防火墙阻止,则行为很难预测。 (防火墙经常"谎言"在他们对不受欢迎的流量的响应中。)
您希望UDP流量排队的唯一情况是,当网络正常工作时,主机正在工作且应用程序正在侦听。如果应用程序接收数据包的速度很慢,则可以进行有限的排队;即,在数据报套接字上连续调用receive
之间需要太长时间。但即使在那里,排队/缓冲也受到严格限制,除此之外,消息将被删除。