TCP粘包问题介绍与Netty中message定义
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要讲解了"TCP粘包问题介绍与Netty中message定义",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"TCP粘包问题介绍与Netty中m
千家信息网最后更新 2025年01月23日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/88421655
3.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安全错误
数据库的锁怎样保障安全
数据库管理完成任务
电力公司网络安全30条
哪里有新三板公司数据库
洋河股份软件开发
怎么用access做员工数据库
服务器防御措施有哪些
如何查数据库的全部表
软件开发中心成都
服务器通过bmc拷贝文件
中美科技与互联网
2019网络安全宣传周短信
计算机三级数据库考试真题
网络技术在降低营销成本上
网络安全演讲稿1000字及大纲
尼尔 服务器容量
齐鲁网官网网络安全
埃克塞特网络安全专业
浙江热门软件开发
同一个服务器两个网段
思科网络技术学院教学视频
数据库授权语句
在万方数据库中怎样找到目录视频
网络安全法知识竞赛登录
创建数据库文件
检察院涉密网络安全讲座
杭州手机软件开发五年薪资
文本显示器编程软件开发
计算机及网络安全操作规程
2u服务器怎么从机架上拿出来
软件开发模式趋势