//这是消息头包,消息头包大小是固定的,
//每次传输都要先传消息头,在传消息体
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 封包和拆包的思路,目前只是个思路,我这周看有机会实现一下不。

2021-08-17 修改

目前,我代码写好了,接收文件没问题了。

实现过程中,大体思路是对的,但是有点小问题。

1.包头和包体 都应该用struct变量,因为它们经过ProtoBuf序列化后,字节数更小一点。

2. 包头经过protobuf序列化,大小是不固定的,所以 我决定在用一个固定长度为4的byte数组存包头大小

3.一开始没有确定一个固定长度的包头的时候会出现粘包的情况,虽然可以sleep 个几百毫秒,大概率不会出现,但这种方式不稳定,效率低。

4.现在正确分包后,就可以不用sleep,每次接收先接收4个长度,计算出包头大小,比如为33,然后再接收33长度,转换成包头,在包头里找到包体长度,比如4096,然后再接收4096长度。这样一个被分的包接收完毕,进入一下次循环接收,每次循环都会进行这3次的接收。

最后,代码过段时间再贴出来。

C# Socket 封包 拆包 ProtoBuf 的使用的更多相关文章

  1. java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  2. Unity C# 自定义TCP传输协议以及封包拆包、解决粘包问题

    本文只是初步实现了一个简单的TCP自定协议,更为复杂的协议可以根据这种方式去扩展. TCP协议,通俗一点的讲,它是一种基于socket传输的由发送方和接收方事先协商好的一种消息包组成结构,主要由消息头 ...

  3. VS下使用Google Protobuf完成SOCKET通信

    如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...

  4. Socket开发框架之框架设计及分析

    虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...

  5. 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)

    原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...

  6. Socket上自定义协议总结

    TCP只是一个可靠传输的通信管道,上层协议要你自己定的,通俗来说就是发送方和接收方的约定 自定义协议的核心有两个:1. 控制码2. 流程控制 用Socket进行通信,发送的数据包一定是有结构的,类似于 ...

  7. protobuf 协议 windows 下 C++ 环境搭建

    1. 下载protobuf https://code.google.com/p/protobuf/downloads/list Protocol Buffers 2.5.0 full source - ...

  8. [转帖]六种Socket I/O模型幽默讲解

    六种Socket I/O模型幽默讲解 https://www.cnblogs.com/jikebiancheng/p/6225009.html 原贴已经找不到了.. 老陈有一个在外地工作的女儿,不能经 ...

  9. 六种Socket I/O模型幽默讲解

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里.这和Socket模型非常类似.下面就以此为例讲解Socket I/O模型. 零:阻塞模型 老陈非常 ...

  10. javase(13)_网络编程

    一.概述 1.网络编程的核心是IP.端口(表示应用程序).协议三大元素 2.网络编程的本质是进程间通信 3.网络编程的2个主要问题:1是定位主机,2是数据传输 二.网络通信的概念 1.网络通信协议 计 ...

随机推荐

  1. pathlib简单使用, 比os简单

    from pathlib import Path p = Path(r'D:\project\pachong\test1\a.txt') # 基本用法 ''' # 判断 p.is_dir() # 判断 ...

  2. 《深入理解Java虚拟机》读书笔记:HotSpot的算法实现

    HotSpot的算法实现 HotSpot的算法实现概要 1.枚举根节点 由于目前的主流Java虚拟机使用的都是准确式GC(这个概念在第1章介绍Exact VM对Classic VM的改进时讲过),所以 ...

  3. Django框架——cookie与session简介、django操作cookie与session、django中间件

    cookie与session简介 """ 回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP.IP作用于应用层之上的协议 3.无状态 不保存客户端的状态 4.无 ...

  4. SnakeYaml反序列化分析

    前言 SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等.yaml真是到哪都有啊. 环境搭建 <dependency> < ...

  5. 力扣374(java&python)-猜数字大小(简单)

    题目: 猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字. 请你猜选出的是哪个数字.如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了.你可以通过调用一个预先定 ...

  6. 讲座回顾丨基于 OpenYurt 和 EdgeX 的云边端协同新可能

    简介: 为帮助参赛选手更好地了解并运用相关技术,本次大赛将在 7 月至 9 月持续开展 3 轮技术培训,涵盖初.中.高不同层级,帮助开发者系统学习智能边缘系统知识.我们邀请到来自英特尔.VMware. ...

  7. EventBridge 在 SaaS 企业集成领域的探索与实践

    简介: 当下降本增效是各行各业的主题,而 SaaS 应用作为更快触达和服务业务场景的方式则被更多企业熟知和采用.本文将结合实际业务场景讲述在 SaaS 行业的洞察与 SaaS 集成的探索实践. 作者: ...

  8. 【USENIX ATC】支持异构GPU集群的超大规模模型的高效的分布式训练框架Whale

    简介: 高效大模型训练框架Whale(EPL)入选USENIX ATC 作者:张杰.贾贤艳 近日,阿里云机器学习PAI关于深度学习模型高效的分布式训练框架的论文< Whale: Efficien ...

  9. 更便捷:阿里云DCDN离线日志转存全新升级

    简介: 1月6日,阿里云CDN年度产品升级发布会中,阿里云CDN产品专家邓建伟宣布DCDN离线日志转存全新升级,并对离线日志转存方案的价值.应用及使用进行了详细解读. 在日常CDN加速服务过程中会产生 ...

  10. OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践

    简介: 随着云原生技术的逐步成熟,阿里云容器服务团队在具体落地实践过程中不断探索云原生技术的应用边界.同时随着物联网和 5G 的迅猛发展,传统的边缘计算架构已经不能满足业务发展的需要. 如何基于云原生 ...