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