C# Socket 封包 拆包 ProtoBuf 的使用

Posted HelloLLLLL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Socket 封包 拆包 ProtoBuf 的使用相关的知识,希望对你有一定的参考价值。

//这是消息头包,消息头包大小是固定的,
//每次传输都要先传消息头,在传消息体
 enum EnumMsgType:消息类型
long PackgeSize:包大小
long TotalPackage:所有包总数
long PackageIndex:当前包索引

//消息体包
byte[] Data=null;不固定大小的包,大小在消息头包

数据格式 用 ProtoBuf  比json转为byte后都要小。使用例子

https://blog.csdn.net/liehuo123/article/details/78408876

包头 包体 都转换为这个格式。

发送数据时必须 包头|包体|包头|包体的发送

 

主要是数据接受,我的思路是这样

我们可以在开发前自己算出 自己定义的包头大小,以后这个包头的大小都不会变化了。

首次接受,先按包头大小接受一次,能否通过ProtoBuf 转为包头实体,如果异常,说明该传包头的地方没传对,直接抛出异常,否则 得到包头实体

然后判断消息类型,假如是文件,我个人规定 该包头的首个包体是文件名,得到文件名

我们可以根据消息类型,封装不同的处理接受数据的方法,每次 接受某种消息类型的首个包头后,就在接下来用封装的方法完成这个消息余下的数据包括包头和包体。

接下来 while(packageIndex<TotalPackage){

 //包头实体接受到

//包体数据接受到

//更新packageIndex为当前包头的index

}

以上就是我自己的基于Socket 封包和拆包的思路,目前只是个思路,我这周看有机会实现一下不。

 

以上是关于C# Socket 封包 拆包 ProtoBuf 的使用的主要内容,如果未能解决你的问题,请参考以下文章

SOCKET 封包和拆包

Netty——解决TCP粘包、拆包

Socket开发框架之数据传输协议

TCP粘包和拆包

封装一个带大小的封包,防止Tcp粘包拆包

计网 - TCP 的封包格式:TCP 为什么要粘包和拆包?