协议种类

开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,则可以使用文本解析的方式。这两种协议有两个比较典型的应用场景,Code加结构体更多应用在中间件上,因为协议的封装都是透明的,不需要联调,而且性能要求较高;文本解析则更多应用在外部交互上,如和设备、手机通讯,需要联调,但是性能要求没那么高。

我们Demo是采用文本解析的方式,具体可以根据应用灵活选择。

定义协议有以下注意点(方便不同平台接入)。

字节顺序

不同硬件平台或操作系统下,字节顺序是不一致的,有的是高位在前,低位在后,有的则是低位在前。Windows是低位在前,高位在后,每个平台下都有函数实现字节转换。TCP/IP定义的字节顺序是高位在前、低位在后,可以使用IPAddress类的

        //// 摘要://     将整数值由网络字节顺序转换为主机字节顺序。//// 参数://   network://     以网络字节顺序表示的要转换的数字。//// 返回结果://     以主机字节顺序表示的整数值。[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]public static int NetworkToHostOrder(int network);//// 摘要://     将长值由网络字节顺序转换为主机字节顺序。//// 参数://   network://     以网络字节顺序表示的要转换的数字。//// 返回结果://     以主机字节顺序表示的长值。[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]public static long NetworkToHostOrder(long network);//// 摘要://     将短值由网络字节顺序转换为主机字节顺序。//// 参数://   network://     以网络字节顺序表示的要转换的数字。//// 返回结果://     以主机字节顺序表示的短值。[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]public static short NetworkToHostOrder(short network);

来实现网络字节顺序转为本地字节顺序,反之可以调用

        //// 摘要://     将整数值由主机字节顺序转换为网络字节顺序。//// 参数://   host://     以主机字节顺序表示的要转换的数字。//// 返回结果://     以网络字节顺序表示的整数值。public static int HostToNetworkOrder(int host);//// 摘要://     将长值由主机字节顺序转换为网络字节顺序。//// 参数://   host://     以主机字节顺序表示的要转换的数字。//// 返回结果://     以网络字节顺序表示的长值。public static long HostToNetworkOrder(long host);//// 摘要://     将短值由主机字节顺序转换为网络字节顺序。//// 参数://   host://     以主机字节顺序表示的要转换的数字。//// 返回结果://     以网络字节顺序表示的短值。public static short HostToNetworkOrder(short host);

来实现本地字节顺序转为网络字节顺序。

更流行的做法是使用网络字节顺序,这样规范统一。我们这里使用Windows字节顺序,即低位在前、高位在后,和网络字节顺序刚好相反。

字符集

字符集最合适的就是使用UTF-8,这个编码是免费的,对于某些不支持中文的嵌入式系统,全英文可以不需要转换就是UTF-8格式,对于跨平台具有优势。

数据包格式

Code加结构体、文本解析两种协议风格都是统一使用相同的数据包格式,即先发一个4字节的长度,后面跟着是内容,下一个也是先发一个4字节长度,接着是内容。结构体可以定义为文件流结构体,采用字节对齐。

协议样本

Active:检测连接(心跳包)

客户端->服务器 { [Request] Command=Active } 服务器->客户端 { [Response] Command= Active Code= Error Code#错误码 Message=Message#如果出错,返回错误描述信息 }

转载于:https://www.cnblogs.com/lvlaozf/p/7290873.html

C#高性能大容量SOCKET并发(八):通讯协议相关推荐

  1. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  2. C#高性能大容量SOCKET并发(十一):编写上传客户端

    原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...

  3. Flash Socket 的基本通讯协议流程例子

    Flash Socket 的基本通讯协议流程例子 分类: flash builder2012-05-09 09:30 13人阅读 评论(0) 收藏 举报 原文:http://www.sujun.org ...

  4. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  5. 关于Socket通讯时通讯协议的制定

    在系统开发过程中,如果涉及到了Socket通讯,那就要制定好通讯的协议,只有制定好了规则,后面的工作才方便顺利展开,制作通讯协议时要考虑到通讯的安全性,必要的信息要经过加密处理,同时也要考虑到系统的可 ...

  6. IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...

  7. 联网常见通信协议与通讯协议梳理- 通讯协议

    1  "通信"与"通讯"傻傻分得清 传统意义上的"通讯"主要指电话.电报.电传.通讯的"讯"指消息(Message),媒 ...

  8. IOT(34 )---联网常见通信协议与通讯协议梳理- 通讯协议

    联网常见通信协议与通讯协议梳理[上]- 通讯协议 1  "通信"与"通讯"傻傻分得清 传统意义上的"通讯"主要指电话.电报.电传.通讯的&q ...

  9. 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

    HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...

  10. 2017-2018-1 20155222 201552228 实验五 通讯协议设计

    2017-2018-1 20155222 201552228 实验五 通讯协议设计 实验内容和要求 通讯协议设计-1 在Ubuntu中完成 http://www.cnblogs.com/rocedu/ ...

最新文章

  1. 【c语言】蓝桥杯2020校内模拟赛c组
  2. java 三角依次递增在递减_java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形...
  3. 转:Python Shell 清屏方法
  4. linux find批量替换java文件中字符串
  5. 【蓝桥杯Java_C组·从零开始卷】第四节(附)、字符串常用函数
  6. LiveVideoStackCon 2022 上海站 专题抢先看
  7. [信息学奥赛一本通-T1620]质因数分解-数论
  8. excel分两个独立窗口_Excel2010 多个独立窗口,解决单窗口无法显示多个文件的问题...
  9. 手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...
  10. Apollo进阶课程㉝丨Apollo ROS原理—2
  11. 浅谈数据结构-选择排序(简单、堆排序)
  12. 软件测试第四组第一周作业第一天
  13. 斐讯w3固件下载_【2019.11.13更新】斐讯 K3 openwrt固件
  14. Java调用第三方接口(http总结)
  15. android xutils加密,xutils
  16. 怎么安装google nik collection 1.2.11.win插件
  17. 黑盒测试---等价类划分
  18. 宝塔软件商店安装不了php_宝塔安装php不显示
  19. 【记录】Ubuntu已连接网络但无法上网解决方法
  20. Spark 常用算子详解(转换算子、行动算子、控制算子)

热门文章

  1. paip.提升效率--数据绑定到table原理和流程Angular js jquery实现
  2. paip.判断字符是否中文与以及判读是否是汉字uapi python java php
  3. 中国期货交易技术的逆袭之路
  4. 创业邦:谈谈 To B业务的机会
  5. 阿里彭蕾:CEO如何对抗孤独感?
  6. (转)先锋伯格:选择一条少有人走的路,所有的不同由此开始
  7. Julia: 引用与copy: 关于数组、自定义类型与初始化
  8. 从架构到代码:软件开发的七个新趋势 | 凌云时刻
  9. 由争议拼多多之货找人想到的 BlockChain Storage 之5、区块链存储 - 存储供需的智能匹配...
  10. html 超链接嵌套,嵌套的超链接区域,HTML源中没有嵌套的链接元素