灰熊网络套接字连接上的多条消息



我们正在使用来自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)传递给不同的线程。

相关内容

  • 没有找到相关文章

最新更新