C#高性能大容量SOCKET并发(八):通讯协议
协议种类
开发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并发(八):通讯协议相关推荐
- C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...
- C#高性能大容量SOCKET并发(十一):编写上传客户端
原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...
- Flash Socket 的基本通讯协议流程例子
Flash Socket 的基本通讯协议流程例子 分类: flash builder2012-05-09 09:30 13人阅读 评论(0) 收藏 举报 原文:http://www.sujun.org ...
- 网络编程2_网络通讯协议, socket(tcp, udp)
一. 网络通讯协议 互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准 互联网协议按照功能的不同分为osi七层或tcp/ip五层 ...
- 关于Socket通讯时通讯协议的制定
在系统开发过程中,如果涉及到了Socket通讯,那就要制定好通讯的协议,只有制定好了规则,后面的工作才方便顺利展开,制作通讯协议时要考虑到通讯的安全性,必要的信息要经过加密处理,同时也要考虑到系统的可 ...
- IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)
本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...
- 联网常见通信协议与通讯协议梳理- 通讯协议
1 "通信"与"通讯"傻傻分得清 传统意义上的"通讯"主要指电话.电报.电传.通讯的"讯"指消息(Message),媒 ...
- IOT(34 )---联网常见通信协议与通讯协议梳理- 通讯协议
联网常见通信协议与通讯协议梳理[上]- 通讯协议 1 "通信"与"通讯"傻傻分得清 传统意义上的"通讯"主要指电话.电报.电传.通讯的&q ...
- 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...
HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...
- 2017-2018-1 20155222 201552228 实验五 通讯协议设计
2017-2018-1 20155222 201552228 实验五 通讯协议设计 实验内容和要求 通讯协议设计-1 在Ubuntu中完成 http://www.cnblogs.com/rocedu/ ...
最新文章
- 【c语言】蓝桥杯2020校内模拟赛c组
- java 三角依次递增在递减_java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形...
- 转:Python Shell 清屏方法
- linux find批量替换java文件中字符串
- 【蓝桥杯Java_C组·从零开始卷】第四节(附)、字符串常用函数
- LiveVideoStackCon 2022 上海站 专题抢先看
- [信息学奥赛一本通-T1620]质因数分解-数论
- excel分两个独立窗口_Excel2010 多个独立窗口,解决单窗口无法显示多个文件的问题...
- 手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...
- Apollo进阶课程㉝丨Apollo ROS原理—2
- 浅谈数据结构-选择排序(简单、堆排序)
- 软件测试第四组第一周作业第一天
- 斐讯w3固件下载_【2019.11.13更新】斐讯 K3 openwrt固件
- Java调用第三方接口(http总结)
- android xutils加密,xutils
- 怎么安装google nik collection 1.2.11.win插件
- 黑盒测试---等价类划分
- 宝塔软件商店安装不了php_宝塔安装php不显示
- 【记录】Ubuntu已连接网络但无法上网解决方法
- Spark 常用算子详解(转换算子、行动算子、控制算子)
热门文章
- paip.提升效率--数据绑定到table原理和流程Angular js jquery实现
- paip.判断字符是否中文与以及判读是否是汉字uapi python java php
- 中国期货交易技术的逆袭之路
- 创业邦:谈谈 To B业务的机会
- 阿里彭蕾:CEO如何对抗孤独感?
- (转)先锋伯格:选择一条少有人走的路,所有的不同由此开始
- Julia: 引用与copy: 关于数组、自定义类型与初始化
- 从架构到代码:软件开发的七个新趋势 | 凌云时刻
- 由争议拼多多之货找人想到的 BlockChain Storage 之5、区块链存储 - 存储供需的智能匹配...
- html 超链接嵌套,嵌套的超链接区域,HTML源中没有嵌套的链接元素