【发布时间】:2013-09-08 17:39:42
【问题描述】:
我想将旧的 Netty 3.x websocket 服务器重构为新版本 4.0。 Websocket 握手完成后,我需要向客户端发送“欢迎消息”。也许有人可以给我提示,一旦 websocket 连接准备好使用,我怎么能得到通知?我在玩websocket server example。
【问题讨论】:
我想将旧的 Netty 3.x websocket 服务器重构为新版本 4.0。 Websocket 握手完成后,我需要向客户端发送“欢迎消息”。也许有人可以给我提示,一旦 websocket 连接准备好使用,我怎么能得到通知?我在玩websocket server example。
【问题讨论】:
WebSocketServerHandshaker.handshake() 返回一个ChannelFuture,当握手完成时收到通知。
【讨论】:
如果 Websocket 握手完成,Netty 将引发用户事件。
Netty 4.0 中的 UserEvent 是WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE,Netty 4.1 中是WebSocketServerProtocolHandler.HandshakeComplete。
您可以在 WebSocketHandler 中覆盖 userEventTriggered 方法:
public class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) {
if (frame instanceof TextWebSocketFrame) {
// Send the uppercase string back.
String request = ((TextWebSocketFrame) frame).text();
ctx.channel().writeAndFlush(new TextWebSocketFrame(request.toUpperCase()));
} else {
String message = "unsupported frame type: " + frame.getClass().getName();
throw new UnsupportedOperationException(message);
}
}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
WebSocketServerProtocolHandler.HandshakeComplete complete = (WebSocketServerProtocolHandler.HandshakeComplete) evt;
System.out.println("New WebSocket handshake complete, uri:" + complete.requestUri());
} else {
super.userEventTriggered(ctx, evt);
}
}
}
【讨论】: