WebSocketProtocolHandler源码分析
package io.netty.handler.codec.http.websocketx;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import java.util.List;
//WebSocketFrame的子类会进入此类处理
abstract class WebSocketProtocolHandler extends MessageToMessageDecoder<WebSocketFrame> {
//默认true
private final boolean dropPongFrames;
WebSocketProtocolHandler() {
this(true);
}
WebSocketProtocolHandler(boolean dropPongFrames) {
this.dropPongFrames = dropPongFrames;
}
@Override
protected void decode(ChannelHandlerContext ctx, WebSocketFrame frame, List<Object> out) throws Exception {
//如果是Ping帧
if (frame instanceof PingWebSocketFrame) {
//ByteBuf引用计数器+1,因为父类会对frame.content进行释放。
frame.content().retain();
//写入Pong帧,在写入完成后框架对frame.content进行释放。
ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content()));
return;
}
//如果是Pong帧则不作处理
if (frame instanceof PongWebSocketFrame && dropPongFrames) {
return;
}
//其余数据帧则先把引用计数器+1,在放入out
//放入out的帧会传递到我们自定义的handler处理
out.add(frame.retain());
}
//出现异常继续传递并关闭socket连接
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.fireExceptionCaught(cause);
ctx.close();
}
}