1. 半包和粘包

(1)粘包现象

(2)半包现象

本质是因为 TCP 是流式协议,消息无边界

(3)解决方案

  1. 短链接,发一个包建立一次连接,这样连接建立到连接断开之间就是消息的边界,缺点效率太低
  2. 每一条消息采用固定长度,缺点浪费空间
  3. 每一条消息采用分隔符,例如 \n,缺点需要转义
  4. 每一条消息分为 head 和 body,head 中包含 body 的长度

这里给出第4种最优的解决方法:

LengthFieldBasedFrameDecoder的四个参数分别表示:

public static void main(String[] args) {
        // 最大长度,长度偏移,长度占用字节,长度调整,剥离字节数
        EmbeddedChannel ch = new EmbeddedChannel(
            new LengthFieldBasedFrameDecoder(1024, 0, 4,
                1,5),
            new LoggingHandler(LogLevel.DEBUG)
        );

        ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer();
        send(buffer, "hello world");
        send(buffer, "Hi!");
        ch.writeOneInbound(buffer);
    }

    private static void send(ByteBuf buffer, String content) {
        byte[] bytes = content.getBytes();
        buffer.writeInt(bytes.length);
        buffer.writeByte(1);
        buffer.writeBytes(bytes);
    }