Netty权威指南学习笔记
TCP是个【流】协议。所谓流就是没有界限的一串数据。
粘包 : 两个包一起读到了
拆包 : 一个包一次没有发送完
粘包问题的解决策略
1. 消息定长。如果不够,空格补位
2. 包尾增加回车换行符进行分割,例如FTP协议
3. 将消息分为消息头和消息体,消息头中包含消息总长度(或者消息体长度)的字段。
利用 LineBasedFrameDecoder 和 StringDecoder 来解决粘包问题
服务端改造
1. 添加处理器
public class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
socketChannel.pipeline().addLast(new StringDecoder());
socketChannel.pipeline().addLast(new TimeServerHandler());
}
}
2. 添加处理器后,读取到的信息就不再是字节,而是被处理器转换后的String信息
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Excepti