如何使用netty自带的编解码器解决粘包/拆包问题?

102 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

TCP以字节流的形式进行传输,所以请求之间没有分隔,因此要获取准确的请求,需要解决请求的分段。
在这里不做其他讨论,只是提供一个亲测可行的解决方案。

Server 和 Client 的Initializer中添加如下编解码器:

channel.pipeline().addLast(new StringEncoder(Charset.forName("utf8")));
channel.pipeline().addLast(new LineBasedFrameDecoder(Integer.MAX_VALUE));
channel.pipeline().addLast(new StringDecoder(Charset.forName("utf8")));

有一点,注意顺序,因为是职责链的调用模式,LineBasedFrameDecoder 一定在 StringDecoder 之前。
写入数据时:

public void wt(ChannelHandlerContext ctx, String re) {
        re += "\n";
        ctx.writeAndFlush(re);
}

LineBasedFrameDecoder 是根据字符串末尾的 “\n” 或 “\r” 判断是否同一请求的,所以每个请求写入都以 “\n” 结尾,并且写入的字符串中不能含有这两个转义字符。
读取数据:

public String rd(Object msg) {
        return (String) msg;
 }