TCP粘包问题介绍与Netty中message定义
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"TCP粘包问题介绍与Netty中message定义",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"TCP粘包问题介绍与Netty中m
千家信息网最后更新 2026年11月01日TCP粘包问题介绍与Netty中message定义
这篇文章主要讲解了"TCP粘包问题介绍与Netty中message定义",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"TCP粘包问题介绍与Netty中message定义"吧!
1、TCP粘包与拆包问题
1.1、图解粘包与拆包问题

假设客户端分别发送了两个数据包D1与D2,由于服务端一次读取到的字节数时不确定的,因此有可能出现一下5种情况:
服务端分两次读取到了两个独立的数据包,分别是D1与D2,没有粘包与拆包;
服务端一次接收了两个数据包,D1与D2粘合在一起,被称为TCP粘包;
服务端分两次读取到了两个数据包,第一次读取到了D2包的一部分内容,第二次读取到了D2包的剩余内容与完整的D1包内容,被称为TCP拆包;
服务端分两次读取到了两个数据包,第一次读取到了完整的D2包和D1包的一部分内容,第二次读取到了D1包的剩余内容;
如果服务器的TCP接收滑动窗口非常小,而数据包D1与D2比较大,服务端分多次才能将D1与D2包接收完,这期间会发生多次拆包。
1.2、粘包问题解决策略
消息定长。例如固定每个报文的大小为100个字节,如果不够,空位补空格;
将详细分为消息头与消息体,消息头中包含消息总长度(或消息体长度)的字段;
在包尾增加回车换行符进行分割;
2、Netty协议栈中的消息定义
Netty协议栈中的消息分为两部分:
消息头
消息体

3、字节数组(byte[])与字符串(16进制/Base64)的相互转换
3.1、byte[] <-> 16进制字符串
/** * 16进制字符串 与 byte数组 相互转换工具类 */public class HexUtils { private static final char[] HEXES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * byte数组 转换成 16进制小写字符串 */ public static String bytes2Hex(byte[] bytes) { if (bytes == null || bytes.length == 0) { return null; } StringBuilder hex = new StringBuilder(); for (byte b : bytes) { hex.append(HEXES[(b >> 4) & 0x0F]); hex.append(HEXES[b & 0x0F]); } return hex.toString(); } /** * 16进制字符串 转换为对应的 byte数组 */ public static byte[] hex2Bytes(String hex) { if (hex == null || hex.length() == 0) { return null; } char[] hexChars = hex.toCharArray(); byte[] bytes = new byte[hexChars.length / 2]; // 如果 hex 中的字符不是偶数个, 则忽略最后一个 for (int i = 0; i < bytes.length; i++) { bytes[i] = (byte) Integer.parseInt("" + hexChars[i * 2] + hexChars[i * 2 + 1], 16); } return bytes; }}---------------------作者:xietansheng原文:https://blog.csdn.net/xietansheng/article/details/884216553.2 byte[] <-> Base64 字符串
import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import java.io.ByteArrayOutputStream;import java.io.Closeable;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;/** * Base64 转换工具 */public class Base64Utils { /** * byte数组 转换为 Base64字符串 */ public static String encode(byte[] data) { return new BASE64Encoder().encode(data); } /** * Base64字符串 转换为 byte数组 */ public static byte[] decode(String base64) { try { return new BASE64Decoder().decodeBuffer(base64); } catch (IOException e) { e.printStackTrace(); } return new byte[0]; } /** * 把文件内容编码为 Base64字符串, 只能编码小文件(例如文本、图片等) */ public static String encodeFile(File file) throws Exception { InputStream in = null; ByteArrayOutputStream bytesOut = null; try { in = new FileInputStream(file); bytesOut = new ByteArrayOutputStream((int) file.length()); byte[] buf = new byte[1024]; int len = -1; while ((len = in.read(buf)) != -1) { bytesOut.write(buf, 0, len); } bytesOut.flush(); return encode(bytesOut.toByteArray()); } finally { close(in); close(bytesOut); } } /** * 把 Base64字符串 转换为 byte数组, 保存到指定文件 */ public static void decodeFile(String base64, File file) throws Exception { OutputStream fileOut = null; try { fileOut = new FileOutputStream(file); fileOut.write(decode(base64)); fileOut.flush(); } finally { close(fileOut); } } private static void close(Closeable c) { if (c != null) { try { c.close(); } catch (IOException e) { // nothing } } }}感谢各位的阅读,以上就是"TCP粘包问题介绍与Netty中message定义"的内容了,经过本文的学习后,相信大家对TCP粘包问题介绍与Netty中message定义这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
字符
字符串
消息
问题
内容
数组
服务
数据
两个
进制
字节
文件
学习
工具
情况
第一次
编码
长度
剩余
不够
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
有格互联网科技
深圳九邦互联网科技有限公司
河南云网互联网络科技有限公司
科技制造互联网公司
华宇互联网科技
西安互联网科技
亿人帮互联网科技
互联网科技宣传片
上海亿帐通互联网科技
联恩商钥互联网科技有限公司
四个字互联网科技公司取名
深圳互联网科技怎么样
互联网科技公司招聘
崇明区互联网教育科技售后服务
长沙互联网科技
浙南科技城互联网大厦招聘
济南小医互联网科技有限公司招聘
互联网领先科技活动
陕西彩京云互联网科技有限公司
互联网科技创业计划的风险分析
中国互联网科技工作委员会毛军
丰台科技园 互联网公司
上海电发互联网科技有限公司
互联网新科技动漫ppt素材
华夏恒生科技与互联网科技
合肥互联网科技公司公章图片
宁波跨境商互联网科技有限公司
广东猫王互联网科技有限公司电话
互联网大会出现的黑科技
现代科技的标志之一的互联网