TCP粘包问题介绍与Netty中message定义
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"TCP粘包问题介绍与Netty中message定义",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"TCP粘包问题介绍与Netty中m
千家信息网最后更新 2025年12月03日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安全错误
数据库的锁怎样保障安全
中兴通讯网络技术
扫描表格数据库
服务器bios怎么优化
交互查询数据库
网络安全管理员英语
cdn节点和服务器百科
江苏重型软件开发市场价格
扫黄打非网络安全宣传资料
dbf数据库 筛选
互联网科技有哪些股票
狭义的网络安全定义是指什么
支付宝网络技术有限公司打款
营业执照带软件开发
排序合并法 数据库
我的世界咋炸服务器
数据库的应用系统
网络安全常见安全问题
软件开发毕业设计简单题目
录播服务器
山大云服务器平台
计算机网络技术实训室视频
硅谷网络安全公司排名
计算机专业网络技术好就业吗
软件开发如何选择电脑
小学信息技术网络安全试讲
软件开发非常累
睢宁软件开发集团
c文件读入测试数据库
惠普服务器保修查询码是哪个
四川日银互联网科技