簡體   English   中英

服務器如何使用Java將消息發送到客戶端

[英]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()

您需要的是帶有消息傳遞代理的消息傳遞系統,客戶端需要將它們注冊到服務器創建的主題,例如RabbitMQActiveMQ 當服務器推送消息時,代理的工作就是將消息通知客戶端。

也可以考慮讓您的客戶端在套接字上偵聽。

當您的客戶端將其第一個請求發送到服務器時,它在請求中包括它正在偵聽的端口和IP地址。 然后,服務器在該地址和端口上與客戶端建立連接。 然后,服務器可以向客戶端發送請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM