当前位置: 首页 > 知识库问答 >
问题:

服务器发送带有网页搜索和网络 ->的问候消息,导致异常

姜建德
2023-03-14

我有一个使用Netty(4.0.17)的websocket服务器,它可以响应来自JavaScript客户端的请求。通信工作正常,但当我尝试在客户端连接时立即发送问候消息时,我有一个例外。

我的代码看起来像这样:

public class LiveOthelloWSHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        ChannelFuture f = ctx.channel().writeAndFlush(new TextWebSocketFrame("(gameID=0)[LiveOthelloServer="+ VERSION_NUMBER + "]\n"));
    }

// ...

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception {

        final String request = frame.text();
        Channel thisChannel = ctx.channel();

        // Do something with request
        // Write back

        thisChannel.writeAndFlush(new TextWebSocketFrame(response + "\n"));
    }
}

< code>channelRead0()正常,客户端发送消息,服务器回复没有任何问题。不起作用的是“问候”部分。我想向客户端发送一条欢迎消息(在< code>ChannelActive()方法中使用< code>VERSION_NUMBER的字符串),但是我总是得到一个异常:

java.lang.UnsupportedOperationException: unsupported message type: TextWebSocketFrame

我想这可能是因为channelActive()在连接建立后但在websocket握手完成之前就被调用了。我怎么能等待握手完成,然后发送问候消息(客户端还没有发送任何请求)?

供参考,我的初始化是:

@Override
public void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();
    pipeline.addLast(
                     new HttpRequestDecoder(),
                     new HttpObjectAggregator(65536),
                     new HttpResponseEncoder(),
                     new WebSocketServerProtocolHandler("/websocket"),
                     myLiveOthelloWSHandler);

共有1个答案

柳修平
2023-03-14

只是室光...

http://netty.io/4.0/api/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandler.html

检测握手的最佳方法是覆盖ChannelInboundHandler.userEventTriggered…所以我只需添加:

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
    super.userEventTriggered(ctx, evt);
    if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {
        ChannelFuture f = ctx.channel().writeAndFlush(new TextWebSocketFrame("(gameID=0)[LiveOthelloServer="+ VERSION_NUMBER + "]\n"));
    }
}
 类似资料:
  • 长时间侦听者,堆栈溢出:)上的首次调用者 我有一个具有生产者和消费者的ActiveMQ代理。创建器正在连接到活动 MQ 代理。有一个使用者附加到同一个代理。当我使用此设置发送消息 P - 现在我添加另一个代理来创建代理网络,并使用以下配置发送消息:P- 附加信息: P和B1在同一个数据中心,DC1。 B2 和 C 位于同一数据中心 DC2 中。 DC1和DC2是同一海岸上的两个不同数据中心,pin

  • 在过去的几个小时里,我一直在阅读推送通知应用编程接口和网络通知应用编程接口。我还发现谷歌 我试图了解我们是否可以使用桌面通知实现对浏览器的推送通知,我相信这就是Web通知API所做的。我在这里看到了一个关于如何为Chrome做到这一点的谷歌文档 现在我还不明白的是: 我们可以使用GCM/APNS向包括Firefox在内的所有Web浏览器发送推送通知吗 我相信所有这些答案都可以帮助很多有类似困惑的人

  • Twisted Twisted 是一个事件驱动的网络引擎。他可以被用来构建多种网络协议的应用程序,包括:HTTP 服务器和客户端;使用 SMTP、POP3、IMAP 或者 SSH 协议测应用程序和 IM (即时消息)等应用 更多。 PyZMQ PyZMQ 是 ZeroMQ 的 Python 绑定。ZeroMQ 是一个高性能的异步消息库,它的一个很大的优势在于其可以被用作一个消息队列而不需要消息代理

  • 我们在用Netty编写的AWS Network ELB(类似于具有长期连接的Echo服务器)后面有一个简单的TCP服务器,我正在尝试实现一个类似于TCP keep alive机制的keep live机制,以保持空闲连接打开。不幸的是,我们不能依赖TCP保持活动机制,因为NELB不会将保持活动的TCP数据包转发到负载平衡器的另一端 我想做的是监视空闲连接,并向客户端发送一个空字符串(空字节数组)。到

  • 我正在尝试学习websocket是如何工作的。我能够从websocket服务器获取交易数据并将其打印在控制台上。然而,我正在尝试了解如何将该消息传递到我的websocket服务器,以便我可以将其发送到我的websocket客户端。基本上,我想在浏览器上打印每条消息。 现在,这个将在收到数据时打印数据。我正在尝试做的是如何传递给我的 WebSocket.Server 对象的事件侦听器。正如你从 ht

  • 我有一个BE服务a,它正在使用假客户端向microservice B发送Rest JSON消息: 终点: Rest Endpoint正在向AWS Ses邮件或其他邮件提供商发送邮件。 问题是来自飞格的第一个呼叫可能需要5秒或更长时间。我需要使其异步,以便FE客户端不要等待邮件发送。 我如何可以使从飞度异步发出的Rest调用到超文本传输协议响应OK没有等待时间可以预期?是否有一些更好的解决方案来实现