我只在填写表单并按下发送按钮时才运行client.java,它被卡住了,我什么也做不了。 这有什么解释吗? enter image description here
答案 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和相关代码以及问题。)