跳至主要內容

Netty学习笔记三

xw大约 1 分钟NettyJavaNetty

简介

TCP 拆包: 一个完整的包可能会被 TCP 拆分为多个包进行发送
TCP 粘包: 把多个小的包封装成一个大的数据包发送, client 发送的若干数据包 Server 接收时粘成一包
发送方和接收方都可能出现这个原因
发送方的原因:TCP 默认会使用 Nagle 算法。Nagle 算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
接收方的原因: TCP 接收到数据放置缓存中,应用程序从缓存中读取。

解决方案

发送方:关闭 Nagle 算法。
接收方:
TCP 是无界的数据流,并没有处理粘包现象的机制, 且协议本身无法避免粘包,半包读写的发生需要在应用层进行处理
应用层解决半包读写的办法
1)设置定长消息 (10 字符)
xdclass000xdclass000xdclass000xdclass000
2)设置消息的边界 ($$ 切割)
sdfafwefqwefwe$$dsafadfadsfwqehidwuehfiw$$879329832r89qweew$$
3)使用带消息头的协议,消息头存储消息开始标识及消息的长度信息
Header+Body