大发黄金版网站也有可能把多个小的包封装成一个大的数据包发送

当前位置:大发黄金版客户端 > 大发黄金版网站 > 大发黄金版网站也有可能把多个小的包封装成一个大的数据包发送
作者: 大发黄金版客户端|来源: http://www.ouiouibebe.com|栏目:大发黄金版网站

文章关键词:大发黄金版客户端,长度域

  ,每天分享技术文章和学习视频。让我们一起走向架构师之路!!Hi,欢迎来到梁钟霖个人博客网站。大发黄金版网站本博客是自己通过代码构建的。前端html,后端java技术。对这些技术有兴趣的朋友可以加入,我们一起学习进步。嘿嘿,欢迎来到梁子个人博客!~

  大庆seo:个人觉得尽量还是自己做,实在找不到专业人才,再考虑外包,毕竟很多小公司的人员配置有限

  TCP是个“流”协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,大发黄金版网站一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

  假设客户端分别发送了两个数据包D1和D2给服务端,可能存在以下4种情况:

  (a)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;

  (b)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;

  (c)服务端分两次读取到了两个数据包,大发黄金版网站第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;

  (d)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。

  粘包/拆包的解决方法都是在报文结构上做处理,一般有3种方式:定长报文、报文分隔符、报文长度域

  对于“长度域”的值, 虽然底层都是以字节的形式发送, 但是在上层数据类型上, 长度域有‘字符串’和‘数字’类型两种.

  原报文20个字节,在对其添加长度域时, Java开发者可能见过下面这种结构,尤其是在金融/银行开发中

  上面报文的长度域就是‘字符串’类型, 对应的整型值为原报文的字节长度, 不足8位左边补0, 这个逻辑很通俗.

  对于‘数字’类型的长度域,如果约定长度为4位, 则其报文结构大抵如下, 有点不太好刻画, 前面4个字节是数字20转化的字节数据.

  如果客户端和服务端都是Netty开发, 大家默认的就是‘数字’类型的长度域, 发送端直接使用Netty自带的LengthFieldPrepender编码器就行了.

  但是如果你作为数据接收方的NIO开发者, 而发送方是权威方, 它给的报文的长度域是‘字符串’类型时, 你该怎么处理?

  这个时候,我们可以基于Netty自定义一个解码器, 专门处理字符串类型的长度域,实现如下:

上一篇:没有了

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!