如果UDP套接字编程中不存在服务器,客户端消息会发生什么?

时间:2018-04-09 00:14:21

标签: udp

我只在填写表单并按下发送按钮时才运行client.java,它被卡住了,我什么也做不了。 这有什么解释吗? enter image description here

1 个答案:

答案 0 :(得分:0)

TLDR; User Datagram Protocol (UDP)是"即发即忘"。

  

不可靠 - 发送UDP消息时,无法知道它是否会到达目的地;它可能会在途中迷路。 没有确认,重新传输或超时的概念。

因此,如果发送UDP消息并且没有人监听,则只丢弃该数据包。 (由于其他网络问题/拥塞,UDP数据包也可以静默丢弃。)

虽然可能是先验错误,例如解析服务器的IP(例如,无效的主机名)或尝试使用无效的IP,但是一旦UDP数据包出现,就会出现门,它出了门,被认为已成功发送"。

现在,如果某个程序正在等待永远不会发生的响应(即服务器已关闭或数据包是"否则会丢失")那么这可能会有问题。

也就是说,需要UDP响应消息才能继续的代码会挂起"挂起":

 sendUDPToServerThatNeverResponds();

 // There is no guarantee the server will get the UDP message,
 // much less that it will send a reply or the reply will get back
 // to the client..
 waitForUDPReplyFromServerThatWillNeverCome();

由于UDP没有可靠性保证或重试机制,因此必须在代码中处理。例如,在上面可能代码将等待1秒并重试发送数据包,并且在没有响应5秒后它将向客户端报告错误。

sendUDPToServerThatMayOrMayNotRespond();

while (i++ < 5) {
   reply = waitForUDPReplyForOneSecond();
   if (reply)
      break;
}

if (reply)
   doSomethingAwesome();
else
   showErrorToUser();

当然,&#34;只是使用TCP&#34;由于Transmission Control Protoocol (TCP)提供的流和可靠性特征,通常可以使这些类型的任务更简单。例如,上面的伪代码不是很健壮,因为客户端也必须准备好处理先前请求的潜在/慢速UDP数据包到达

(另外,鉴于当前&#34;屏幕截图&#34;,代码可能与while(true) {}一样有缺陷 - 请确保提供SSCCE和相关代码以及问题。)