[英]How server can send message to client in Java
發送請求時,服務器將返回響應。 這是正常的請求-響應機制,但問題是-有時服務器需要將一些通知發送回客戶端。
我使用Keep-Alive請求實現了這一點,也就是說,服務器將要發送的消息排隊,並在ALIVE請求到來時作為響應發送。 但這會在服務器上造成瓶頸,並且服務器無法檢測到連接是否關閉。
我相信有辦法解決這個問題。 我嘗試過,但是由於ObjectOutputStream
.readObject
無法同時工作而失敗。
客戶端打開與服務器的連接,並創建以下流進行通信。
ObjectOutputStream obos;
ObjectInputStream obis;
public Response send(Request req){
Response resp=null;
try {
obos.writeObject(req); //request from Client
resp=( Response )obis.readObject(); //Reply from server
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return resp;
}
public void run(){
asyncReceive();
}
void asyncReceive(){ //notifications from server
try {
Message m=(Message)obis.readObject();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
您也許可以使用兩個不同的線程來處理接收和發送。
發送線程可能正在使用消息的線程安全隊列發送,因此只要隊列為空,它就會阻塞。 您可以在計時器任務線程中定期將消息添加到隊列中,以進行通知或作為對客戶端請求的響應。
我認為,如果在此期間關閉套接字,則應該拋出readObject()
。
也可以考慮讓您的客戶端在套接字上偵聽。
當您的客戶端將其第一個請求發送到服務器時,它在請求中包括它正在偵聽的端口和IP地址。 然后,服務器在該地址和端口上與客戶端建立連接。 然后,服務器可以向客戶端發送請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.