1.序列化
(1)什么是序列化?
Java的序列化是把对象转换成有序字节流的过程。以便进行网络传输或者保存到本地。
(2)为什么要序列化?
当两个进程进行远程通信时,如果需要发送各种各样的数据,文本、音频、文件、对象等,
在发送这些数据之前,都要把这些数据变成二进制流,才能在网络上进行传输,序列化就
是把这些数据变成有序字节流的过程。

2.序列化工具
(1)Java原生序列化
缺点:
无法跨语言
序列化之后结果太大
序列化效率差
(2)Hessian

(3)thrift
(4)JBoss Marshalling
(5)kryo
(6)MessagePack、kryo、hession和Json

编码和解码
3.TCP的拆包和粘包
先看两个应用场景:
(1)客户端和服务端建立一个连接,客户端发送一条消息,各户端关闭与服务端的连接
(2)客户端和服务端建立一个连接,客户端发一条消息,客户端再次发送消息,客户端关闭与服务端的连接

I. 正常包:对于第一种情况,服务端在不停接收客户端传过来的数据,当客户端断开连接后,服务端知道数据接收完了,开始处理。

II.粘包:对于第二种情况,服务端就读到了一个数据包,如果还是用同一个逻辑处理就有问题了,因为服务端会把两条消息按照一条消息来处理。它不知道第一条
消息在哪结束,第二条消息从哪开始,即两条消息被放到了同一个数据包,这种情况就叫做粘包

III.拆包:服务器收到了两个数据包,第一个数据包只包含了第一条消息的一部分,第二个数据包含了第一条消息的一部分和第二条消息全部,
即同一条消息被拆到两个数据包发送了,这种情况就叫做拆包

产生拆包和粘包的原因:
3个前置知识点:
I. tcp是以流动的方式传输数据,传输的最小单位是报文段(Segment)。
II. tcp Header中有个Option标识位,常见的标识叫mss(Max Segment Size),意思是连接层每次传输数据的最大限制(MTU),一般是1500bit,超过这个
数字要分成多个报文段去传输,mss则是最大限制减去Header的长度,就是只是数据包的大小,大约是1460bit,也就是180字节(B)
III. tcp为提高性能,会把要发送的数据先放到网络缓冲区(大小可在程序里设定),等缓冲区满了之后,再将缓冲区中的数据发送到接收方,同理接收方也有缓冲区这样的机制来接收数据。

拆包:应用程序写入缓冲区的消息,大于缓冲区的大小,一次写不完,即一条消息要分到多个数据包来写,就发生的拆包;
或者:进行mss(最大报文长度分段),当tcp报文长度 - Header > mss时,也会发生拆包。
粘包:应用程序一次写入缓冲区的消息小于缓冲区的大小,缓冲区等下一个或多个消息写入,写满之后,发到服务端,即一个数据包里有多条消息,就发生的拆包
或者:接收方未及时读取缓冲区的内容,导到缓冲区有多条消息,就导致粘包
一个缓冲区可以有多个segment,如果segment和缓冲区大小相等,segment里面报文长度也刚好是一条消息,这时候不会发生拆包或粘包。

如何解决拆包的粘包呢?
方法I: 使用带消息头的协议,消息头存储消息开始标识和消息长度,服务端获取到消息头时,解析出消息长度,然后后后读取该消息内容,如:0000000036{"type":"message","content":"hello"}
方法II: 设置定长消息,服务端每次读取即定长度为一条消息。报文大小固定长度,不够空格补全,发送和接收方遵循相同的约定,这样即使粘包了通过接收方编程实现获取定长报文也能区分。https://blog.csdn.net/zbw18297786698/article/details/53678323
方法III: 设置消息边界,服务端按消息边界从网络流中读取内容。比如:{"type":"message","content":"hello"}\n

RPC里面的序列化反序列化以及拆包粘包的更多相关文章

  1. Netty 拆包粘包和服务启动流程分析

    Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...

  2. 【转】Netty 拆包粘包和服务启动流程分析

    原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...

  3. tomcat Http11NioProtocol如何解析http请求及如何解决TCP拆包粘包

    前言 tomcat是常用的Web 应用服务器,目前国内有很多文章讲解了tomcat架构,请求流程等,但是没有如何解析http请求及如何解决TCP粘包拆包,所以这篇文章的目的就是介绍这块内容,一下内容完 ...

  4. 使用Netty如何解决拆包粘包的问题

    首先,我们通过一个DEMO来模拟TCP的拆包粘包的情况:客户端连续向服务端发送100个相同消息.服务端的代码如下: AtomicLong count = new AtomicLong(0); NioE ...

  5. netty拆包粘包

    客户端 tcp udp socket网络编程接口 http/webservice mqtt/xmpp 自定义RPC (dubbo) 应用层 服务端 ServerSocket ss = new serv ...

  6. TCP拆包粘包之分隔符解码器

    TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息:将计数器置位,重新开始 ...

  7. Netty_TCP拆包粘包解决方案

    一.问题 熟悉tcp编程的可能都知道,无论是服务器端还是客户端,当我们读取或者发送数据的时候,都需要考虑TCP底层的粘包/拆包机制. TCP是一个“流”协议,所谓流就是没有界限的遗传数据,大家可以想象 ...

  8. 架构师养成记--20.netty的tcp拆包粘包问题

    问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...

  9. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...

随机推荐

  1. 《瞿葩的数字游戏》T3-三角圣地(Lucas)

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1~N.1~N可以交换位置.之后的每 ...

  2. A^B Mod C (51Nod - 1046 )(快速幂)

    给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^ ...

  3. 浅谈Linux下mv和cp命令的区别

    1.功能上的区别 mv:用户可以使用该命令为文件或目录重命名或将文件由一个目录移入另一个目录中. cp: 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 2.从inode角度来区分 mv:会 ...

  4. Leecode刷题之旅-C语言/python-88合并两个有序数组

    /* * @lc app=leetcode.cn id=88 lang=c * * [88] 合并两个有序数组 * * https://leetcode-cn.com/problems/merge-s ...

  5. C语言实例解析精粹学习笔记——43(希尔排序)

    实例说明: 用希尔排序方法对数组进行排序.由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略.自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图. 下面将 ...

  6. C# 实现窗口无边框,可拖动效果

    #region 无边框拖动效果 [DllImport("user32.dll")]//拖动无窗体的控件 public static extern bool ReleaseCaptu ...

  7. python2.7练习小例子(二十二)

        22):题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和.     程序分析:请抓住分子与分母的变化规律. #!/usr/bin/pyt ...

  8. Vue 去脚手架

    上回模仿了一个nw,按照原理说,简单. 今天说Vue,脚手架是个好东西,做项目都给你配置好,不过对于我这种只想做一个界面的人来说,有点儿太大了,用不上. 如果说,不用脚手架要面临哪些问题呢. 1. 组 ...

  9. EAS_Table

    SHR人力 员工表 T_BD_PERSON fbirthday 出生日期 femployeetypeid       员工状态   员工状态  T_HR_BDEMPLOYEETYPE        T ...

  10. model的index无限次数执行导致stackOverFlow

    model的index无限次数执行导致stackOverFlow