netty粘包与拆包处理

记一次netty粘包与拆包处理

原来使用的是scoket BIO通信,不存在粘包拆包问题,后来改用了netty,突然发现程序异常崩溃,经查发现netty服务端接收的消息不完整,且没有规律,所以想到了是否是netty的粘包与拆包造成的问题,由于使用的是netty服务端与非netty客户端通信,数据以换行符结束一个消息的传递,所以使用了

LineBasedFrameDecoder换行符进行粘包拆包处理

初始化SocketChannel (类似socket BIO的Socket对象),
//添加编解码规则和粘包与拆包处理方式,其他的还有消息定长,插入特殊结尾符等方式,总之就是为了识别所需消息的格式,获取正确的消息,实现业务。

protected void initChannel(SocketChannel socketChannel) throws Exception {
//添加编解码
socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
socketChannel.pipeline().addLast(“decoder”, new StringDecoder(Charset.forName(“UTF-8”)));
socketChannel.pipeline().addLast(“encoder”, new StringEncoder(Charset.forName(“UTF-8”)));
socketChannel.pipeline().addLast(new NettyServerHandler());
}

最后程序恢复正常

血泪教训:客户端和服务端通信时,一定要了解清楚消息格式和编解码规则,不管是netty还是其他非netty socket通信

猜你喜欢

转载自blog.csdn.net/m0_38110240/article/details/105675148