【发布时间】:2018-06-16 19:52:20
【问题描述】:
我目前正在尝试创建一种可靠的 UDP 协议,其中我的服务器向我的客户端发送每个 1024 字节的数据包,当它完成发送/接收周期时,服务器等待并且客户端通过 TCP 向服务器发送命令告诉它没有收到哪些数据包(我使用前 2 个字节作为数据包 ID [短类型]),然后服务器收到远程类的通知并发送丢失的数据包。
private void waitUntilNotified() {
synchronized (this) {
try {
System.out.println("Waiting..." + new Date());
waiting = true;
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Stop waiting");
}
}
public void notifyThis(){
synchronized (this) {
if(waiting){
waiting = false;
notify();
System.out.println("Notified " + new Date());
return;
}
}
}
我的问题是,有时在本地测试中,命令在服务器开始等待之前到达,因此导致它永远等待。
如果有一种万无一失的方法可以确保即使触发notifyThis()的命令在服务器触发waitUntilNotified()函数之前出现,它仍然会通知它并更改等待状态?
如果有任何不清楚的地方,请发表评论,我会尽力解释。
TL:DR,我正在寻找一种仅在服务器启动到 wait() 之后才调用 notify() 的方法,即使调用是在它开始等待之前进行的
【问题讨论】:
-
是否可以在开始等待之前检查命令是否到达?如果是,则仅在命令未到达时才开始等待。
-
该命令在另一个类中读取,当它到达时,该类在服务器对象上调用'notifyThis()',这就是为什么我等待布尔值,遗憾的是我不能这样做一路走来。
-
为什么不直接使用 TCP,因为它被设计成可靠的?
标签: java synchronization client-server wait