当前位置: 首页 > wzjs >正文

网站开发新闻什么是网站反链

网站开发新闻,什么是网站反链,小米开发者模式怎么关闭,哈尔滨信息港1. 什么是TCP粘包? 1.1 粘包的定义 TCP(传输控制协议)是一种面向流的协议,它不保留消息边界。发送方多次写入的数据可能会被接收方一次性读取,这种现象称为粘包(Sticky Packet)。 粘包不是TCP…

1. 什么是TCP粘包

1.1 粘包的定义

TCP(传输控制协议)是一种面向流的协议,它不保留消息边界。发送方多次写入的数据可能会被接收方一次性读取,这种现象称为粘包(Sticky Packet)

粘包不是TCP协议的缺陷,而是其设计特性导致的。

1.2 粘包的场景

  • 发送方粘包:发送方频繁发送小数据包,TCP可能合并发送以优化性能。
  • 接收方粘包:接收方缓冲区未及时读取,导致多个包被一次性读取。
    在这里插入图片描述
粘包情况模拟

服务端代码(不处理粘包)

public class NettyServer {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new SimpleChannelInboundHandler<ByteBuf>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {// 直接打印接收到的数据(未处理粘包)System.out.println("服务端收到: " + msg.toString(CharsetUtil.UTF_8));}});}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

客户端代码(连续发送小数据包)

public class NettyClient {public static void main(String[] args) throws InterruptedException {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {@Overridepublic void channelActive(ChannelHandlerContext ctx) {// 连续发送3条消息for (int i = 0; i < 3; i++) {ByteBuf buf = Unpooled.copiedBuffer("消息" + i, CharsetUtil.UTF_8);ctx.writeAndFlush(buf);}}});}});ChannelFuture future = bootstrap.connect("localhost", 8080).sync();future.channel().closeFuture().sync();} finally {group.shutdownGracefully();}}
}
运行结果

客户端发送了3条独立消息:

消息0、消息1、消息2

但服务端可能一次性收到合并后的数据:

服务端收到: 消息0消息1消息2

这就是典型的粘包问题

1.3 粘包的危害

  • 数据解析错误(如协议头尾混淆)。
  • 消息丢失或重复处理。

3. 用Netty解决粘包问题

3.1 解决方案

Netty提供了多种拆包策略,常见的有:

  1. 固定长度拆包(FixedLengthFrameDecoder)
  • 每条消息固定长度,不足补空。
  1. 分隔符拆包(DelimiterBasedFrameDecoder)
  • 用特殊字符(如\n)分隔消息。
  1. 长度字段拆包(LengthFieldBasedFrameDecoder)
  • 在消息头中定义长度字段(推荐)。

3.2 代码改造(使用LengthFieldBasedFrameDecoder)

服务端代码(解决粘包)

ch.pipeline()// 最大长度、长度字段偏移量、长度字段长度.addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)).addLast(new SimpleChannelInboundHandler<ByteBuf>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {// 现在每条消息会被正确拆分System.out.println("服务端收到: " + msg.toString(CharsetUtil.UTF_8));}});

客户端代码(添加长度头)

@Override
public void channelActive(ChannelHandlerContext ctx) {for (int i = 0; i < 3; i++) {String message = "消息" + i;ByteBuf buf = Unpooled.buffer();// 写入消息长度(4字节)buf.writeInt(message.getBytes().length);// 写入消息内容buf.writeBytes(message.getBytes());ctx.writeAndFlush(buf);}
}

3.3 运行结果

服务端现在能正确接收每条独立消息:

服务端收到: 消息0
服务端收到: 消息1
服务端收到: 消息2

4. 其他拆包方案对比

方案优点缺点
FixedLengthFrameDecoder简单高效消息必须固定长度
DelimiterBasedFrameDecoder适合文本协议(如HTTP)分隔符不能出现在消息体中
LengthFieldBasedFrameDecoder灵活,适合二进制协议需要自定义长度字段

5. 总结

粘包本质:TCP流式传输的特性,需应用层自行处理消息边界。

Netty解决方案:

  • 简单场景:用DelimiterBasedFrameDecoder(如换行符分隔)。
  • 复杂场景:用LengthFieldBasedFrameDecoder(推荐)。

关键点:

  • 客户端和服务端的编解码器必须匹配。
  • 长度字段需明确(如4字节int)。

通过合理选择拆包策略,可以彻底解决TCP粘包问题!

在这里插入图片描述


文章转载自:

http://xAUnWkWM.Lkbkd.cn
http://9igWvxDT.Lkbkd.cn
http://WpU6JjWq.Lkbkd.cn
http://7i3hCKo9.Lkbkd.cn
http://RvDhf7XZ.Lkbkd.cn
http://MY7jTmlM.Lkbkd.cn
http://V9VPdiDA.Lkbkd.cn
http://sp0Oefap.Lkbkd.cn
http://vDAEFCto.Lkbkd.cn
http://YcZBczbz.Lkbkd.cn
http://weaHR1bq.Lkbkd.cn
http://0xwg0qZ6.Lkbkd.cn
http://4cCv83ah.Lkbkd.cn
http://RSvOGfEF.Lkbkd.cn
http://kbmoioy6.Lkbkd.cn
http://ciIoWXWY.Lkbkd.cn
http://9RodRDZm.Lkbkd.cn
http://cyow4EbN.Lkbkd.cn
http://BgJTehaZ.Lkbkd.cn
http://ctBkpaE4.Lkbkd.cn
http://Qz0exLb5.Lkbkd.cn
http://zyIPS8Xl.Lkbkd.cn
http://19Qpo3oQ.Lkbkd.cn
http://rxN8qZ1S.Lkbkd.cn
http://mTh4nE66.Lkbkd.cn
http://OfWVKnnb.Lkbkd.cn
http://TNxdHFSn.Lkbkd.cn
http://ZQUNAaz9.Lkbkd.cn
http://TB3iIWoJ.Lkbkd.cn
http://aq9kvU43.Lkbkd.cn
http://www.dtcms.com/wzjs/773568.html

相关文章:

  • ppt模板大全免费下载网站广西建设局网站
  • 路由器上建网站网站模版参考
  • 珠海建站模板源码erp管理系统有哪些牌子
  • 东莞建站多少钱网页设计与制作实例教程方其桂
  • 玩具网站 下载网页设计的基本原则有哪些
  • 建德市建设局网站郑州seo外包公司哪家好
  • 正规网站建设公司多少钱wordpress在哪里改首页关键词标题
  • 阿里 网站建设方案书 模板沈阳网站优化推广方案
  • 宜春网站开发公司浏览器怎么打开网站服务器下载
  • 网站排名推广推荐同城信息商家的网站开发
  • 常州想做个企业的网站找谁做建设电商平台
  • 浙江网站设计公司网站建设取得实效
  • 公司网站实名认证个人网站建设的步骤
  • 响应式网站都有哪些网站商城建设套餐
  • 人防网站建设秦皇岛网站建设seo
  • 做网站怎么上词爱站长
  • wordpress多站点cdn手机应用开发教程
  • 常宁市网站建设网站1级域名换2级的影响收录吗
  • 网站建设方案书 人员安排软文推广案例大全
  • cms做企业网站公司网站建设企业
  • 网站怎么做不违法做模具的网站
  • 建设旅游网网站软件网站模板怎么使用教程
  • 黄页网站建设网上二手书网站开发中的问题和展望
  • 免费asp网站模板合肥seo网站多少钱
  • 网页设计建立站点实验报告wordpress文章语言切换
  • 百度合作的网盟网站建设校园网站的必要性
  • 网站网页设计入门网站建设技术包括
  • 地税局网站建设情况汇报上海优化外包
  • 建设安全协会网站app对接网站
  • 怎么写网站建设维护推广合同品牌建设建议