//这是消息头包,消息头包大小是固定的,
//每次传输都要先传消息头,在传消息体
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. climits 与 符号常量

    climits  在老式中是 limits.h 一.引入 #include <climits> 或者 #include <limits.h> 二.符号常量 符号常量 表示 CH ...

  2. openGauss Cluster Manager RTO Test

    一.环境介绍 软件环境 类别 版本 下载链接 备注 OS openEuler 20.03 (LTS) https://repo.openeuler.org/openEuler-20.03-LTS/IS ...

  3. git worktree与分支依赖隔离

    git worktree介绍 git worktree 是 Git 命令,用于管理多分支工作区. 使用场景: 同时维护不同分支,隔离分支依赖差异:从原有项目开辟一个分支作为另一个新项目,当两个项目依赖 ...

  4. HDC2021技术分论坛:盘点分布式软总线数据传输技术中的黑科技

    作者:houweibo,软总线首席技术专家:lidonghua,软总线技术专家 随着万物互联时代的到来,特别是大量媒体资源的涌入和使用,用户对传输的要求不断提高,怎样的传输技术才能满足未来的用户需求呢 ...

  5. HarmonyOS 极客马拉松2023 正式启动,诚邀极客们用键盘码出无限可能!

      原文:https://mp.weixin.qq.com/s/p2yIs0rMmDE2BwhzsAtr7A,点击链接查看更多技术内容. 2023年6月15日, HarmonyOS极客马拉松2023开 ...

  6. windows server 出现.net 3.5安装不上去

    前言 有人说为什么到了现在还有人用.net 3.5呢?其实我也不用,主要是mmsql安装的时候要用到. 正文 一般我们不同电脑在程序和功能中添加,如果添加不上会弹出一个自动获取的一个过程,这时我们点击 ...

  7. 顺通鞋业MES生产工单管理系统软件

    顺通鞋业MES管理系统的"生产执行"是办公室和车间信息交互的枢纽,是一款针对大型鞋业生产企业开发的可配置化智能制造管理系统.工人可以通过车间终端(如安装在机器旁的固定工业触摸屏或移 ...

  8. 如何使用 PTS 快速发起微服务压测

    ​简介:本文讲阐述什么是微服务架构.微服务架构对系统稳定性带来的影响,以及用性能测试验证稳定性的必要性.用户进行微服务压测的痛点和 PTS 的独特优势.云上使用 PTS 快速发起微服务压测的步骤,以及 ...

  9. 如何利用 AHAS 保障 Web 服务稳如磐石?

    ​简介:应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,基于阿里开源流控降级组件 Sentin ...

  10. Javascript 机器学习的四个层次

    ​简介: Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉.作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和i ...