如何向连接到 Undertow websocket 服务器的所有客户端广播消息?

Posted

技术标签:

【中文标题】如何向连接到 Undertow websocket 服务器的所有客户端广播消息?【英文标题】:How can I broadcast a message to all clients connected to an Undertow websocket server? 【发布时间】:2019-01-06 04:38:24 【问题描述】:

这是我目前对 Undertow websocket 服务器的设置:

    Undertow server = Undertow.builder()
            .addHttpListener(8080, "localhost")
            .setHandler(path()
                    .addPrefixPath("/", websocket((exchange, channel) -> 
                        channel.getReceiveSetter().set(new AbstractReceiveListener() 
                            @Override
                            protected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) 
                                final String messageData = message.getData();
                                for (WebSocketChannel session : channel.getPeerConnections()) 
                                    WebSockets.sendText(messageData, session, null);
                                
                            
                        );
                        channel.resumeReceives();
                    ))).build();

这是从他们的演示文件之一复制而来的。我相信onFullTextMessage 这里会将它收到的任何消息广播给所有客户端。

我希望能够按需触发此行为。因此,不必接收消息并使用事件处理程序发送更多消息,我希望能够任意执行server.send() 并向所有连接的客户端发送消息。

我环顾四周,没有发现任何似乎能够实现这一目标的东西。我不喜欢跟踪所有WebSocketChannels 并手动发送给每个客户的想法。当然,我忽略了某处的方法?

如果这不是不可能的事情,我将不胜感激!

【问题讨论】:

【参考方案1】:

您可以通过获取到此运河的所有连接并发送消息来向通道上的所有客户端广播消息:

channel.getPeerConnections().forEach(connection -> 
    WebSockets.sendText(messageData, connection, null);
);

【讨论】:

以上是关于如何向连接到 Undertow websocket 服务器的所有客户端广播消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache 作为 WebSockets 的反向代理,以 Undertow 作为服务器

java 11 java.net.http.Websocket 与 undertow 或 vert.x、netty 相比效率如何

使用 Undertow WebSockets 高效发送大型数据集

七种WebSocket框架的性能比较

嵌入式Undertown同时部署websocket和servlet,不起作用

关闭连接后如何重新连接到websocket [重复]