0
点赞
收藏
分享

微信扫一扫

Netty源码分析-WebSocketProtocolHandler

爱写作的小土豆 2022-03-11 阅读 36


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



举报

相关推荐

0 条评论