Grizzly Websocket 连接上的多条消息

Posted

技术标签:

【中文标题】Grizzly Websocket 连接上的多条消息【英文标题】:Multiple messages on a Grizzly Websocket Connection 【发布时间】:2014-11-28 18:40:57 【问题描述】:

我们正在使用来自 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);
    

简化的客户端代码为:

【问题讨论】:

客户端代码在哪里? 【参考方案1】:

是的,这是预期的。 可行的方法是将 onMessage 内部的消息处理传递给不同的线程。

【讨论】:

谢谢,这正是我所期望的。

以上是关于Grizzly Websocket 连接上的多条消息的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Symfony2 websocket 连接上调用函数

在 AWS ApiGatewayV2 websocket 连接上发出 HTTPs 请求以响应或删除它

有了 HTTP 协议,为什么还需要 Websocket?

WebSocket实践

我可以在一个连接上有多个“类别”吗?

每个 TCP 连接上的误报 SYN 泛洪检测