文章目录
- 一、TCP 粘包和分包
- 二、TCP 粘包和分包解决方案
- 三、客户端 Android 应用使用 Protobuf
- 四、服务器端 Java 服务器使用 Protobuf
- 五、参考资料
一、TCP 粘包和分包
TCP 传输中的 粘包 和 分包 情况 :
分包 : 发送的数据量过大 , 大于 TCP 发送缓冲区的剩余空间 , 则产生分包 ; 发送的数据量大于 TCP 最大报文长度 , 也会产生分包 ;
粘包 : 发送的数据量过小 , 小于 TCP 发送缓冲区剩余空间大小 , TCP 机制会将多次写入缓冲区的数据 , 一次性发送出去 , 这样就产生了粘包的情况 ; 接收端如果没有及时读取接收缓冲区中的数据 , 也会造成粘包情况 ;
TCP 开发中 , 粘包和分包是必然出现的 , 无法避免 ;
二、TCP 粘包和分包解决方案
包头定义长度 : 定义数据包的包头信息 , 在包头中定义数据包长度 , 这样就知道当前包的大小 , 接收到数据包以后 , 就可以知道该数据报是否是完整的包 , 是否有粘包 , 分包的情况 ;
数据包首尾边界 : 在数据包前后加上包头标识 和 包尾标识 , 为数据包添加边界 ;
三、客户端 Android 应用使用 Protobuf
参考 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 序列化 | Protobuf 反序列化 ) 博客进行开发 ;
四、服务器端 Java 服务器使用 Protobuf
编写 Java 服务器端软件 , 使用 eclipse 或 IntelliJ IDEA 开发环境 , 将 Android Studio 中使用的 Protobuf 源文件拷贝到服务器端环境中 , 使用 protoc 进行手动编译 ;
【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )
也可以参考 Protobuf Java 语言对应用法 : https://developers.google.com/protocol-buffers/docs/javatutorial 文档 , 使用 Gradle 插件进行自动编译 ;
服务器端软件开发参考
BIO 网络编程参考 : 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )
NIO 网络编程参考 : 【Netty】NIO 网络编程 聊天室案例
Netty 网络编程参考 : 【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )
懒得写了 , 就这样吧 , 都超级简单的原理 ;
五、参考资料
Protobuf 参考资料 :
- Protobuf 官网主页 : https://developers.google.com/protocol-buffers
- Protobuf 语法指南 : https://developers.google.com/protocol-buffers/docs/proto
- Protobuf Java 语言对应用法 : https://developers.google.com/protocol-buffers/docs/javatutorial
- Protobuf 下载地址 : https://developers.google.com/protocol-buffers/docs/downloads
- Protobuf 源码地址 : https://github.com/protocolbuffers/protobuf
- Protobuf 发布版本下载地址 : https://github.com/protocolbuffers/protobuf/releases
- protobuf-gradle-plugin 项目地址 : https://github.com/google/protobuf-gradle-plugin
博客源码 :
- GitHub 地址 : https://github.com/han1202012/Protocol_Buffers
- CSDN 快照 :