服务器使用websocket和netty发送问候消息 - >造成例外

时间:2014-03-01 10:38:16

标签: java websocket netty

我有一个使用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"));
    }
}

channelRead0()没问题,客户端发送消息,服务器回答没有任何问题。 什么是行不通的是“问候”部分。我想向客户端发送一条欢迎消息(使用VERSION_NUMBER方法中的ChannelActive()字符串),但我总是得到例外:

java.lang.UnsupportedOperationException: unsupported message type: TextWebSocketFrame

我想这可能是因为一旦建立连接但在websocket握手完成之前就会调用channelActive()。如何等待握手完成然后发送问候消息(客户端尚未发送任何请求)?

有关信息,我的初始化是:

@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 个答案:

答案 0 :(得分:3)

只是RTFM ......

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"));
    }
}