簡體   English   中英

Grizzly Websocket連接上的多條消息

[英]Multiple messages on a Grizzly Websocket Connection

我們正在使用Grizzly項目中的Websockets,並期望該實現將允許同時處理連接上的多個傳入消息。 看來情況並非如此,或者我們錯過了配置步驟。 為了驗證這一點,我創建了一個修改后的回顯測試,該測試在回顯文本后會延遲onMessage。 當客戶端通過同一連接發送多個消息時,服務器將始終阻塞直到onMessage完成,然后再處理后續消息。 這是預期的功能嗎?

簡化的服務器代碼如下:

package com.grorange.samples.echo;
import java.util.concurrent.atomic.AtomicBoolean;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.NetworkListener;
import org.glassfish.grizzly.websockets.DataFrame;
import org.glassfish.grizzly.websockets.WebSocket;
import org.glassfish.grizzly.websockets.WebSocketAddOn;
import org.glassfish.grizzly.websockets.WebSocketApplication;
import org.glassfish.grizzly.websockets.WebSocketEngine;

public class Echo extends WebSocketApplication {
    private final AtomicBoolean inMessage = new AtomicBoolean(false);

    @Override
    public void onClose(WebSocket socket, DataFrame frame) {
        super.onClose(socket, frame);
        System.out.println("Disconnected!");
    }

    @Override
    public void onConnect(WebSocket socket) {
        System.out.println("Connected!");
    }

    @Override
    public void onMessage(WebSocket socket, String text) {
        System.out.println("Server: " + text);
        socket.send(text);
        if (this.inMessage.compareAndSet(false, true)) {
            try {
                Thread.sleep(10000);
            } catch (Exception e) {}

            this.inMessage.set(false);
        }
    }

    @Override
    public void onMessage(WebSocket socket, byte[] bytes) {
        socket.send(bytes);
        if (this.inMessage.compareAndSet(false, true)) {
            try {
                Thread.sleep(Long.MAX_VALUE);
            } catch (Exception e) {}

            this.inMessage.set(false);
        }

    }

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.createSimpleServer("http://0.0.0.0", 8083);
        WebSocketAddOn addOn = new WebSocketAddOn();
        addOn.setTimeoutInSeconds(60);
        for (NetworkListener listener : server.getListeners()) {
            listener.registerAddOn(addOn);
        }

        WebSocketEngine.getEngine().register("", "/Echo", new Echo());
        server.start();
        Thread.sleep(Long.MAX_VALUE);
    }
}

簡化的客戶端代碼為:

是的,這是預期的。 可行的方法是將onMessage內部的消息處理傳遞給另一個線程。

暫無
暫無

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

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