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#如果出错,返回错误描述信息 }
C#高性能大容量SOCKET并发(八):通讯协议的更多相关文章
- C#高性能大容量SOCKET并发(七):协议字符集
原文:C#高性能大容量SOCKET并发(七):协议字符集 UTF-8 UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 362 ...
- C#高性能大容量SOCKET并发(转)
C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs ...
- C#高性能大容量SOCKET并发(零):代码结构说明
原文:C#高性能大容量SOCKET并发(零):代码结构说明 C#版完成端口具有以下特点: 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪): 发送数据智能合并(组件会根 ...
- C#高性能大容量SOCKET并发(九):断点续传
原文:C#高性能大容量SOCKET并发(九):断点续传 上传断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1:下载开始的时候 ...
- C#高性能大容量SOCKET并发(五):粘包、分包、解包
原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...
- C#高性能大容量SOCKET并发(十一):编写上传客户端
原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...
- C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...
- C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包
原文:C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包 守护线程 在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们 ...
- C#高性能大容量SOCKET并发(三):接收、发送
原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...
- C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
原文:C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 1.SocketAsyncEventArgs介绍 SocketAsyncEventArgs是微软提供的高性能 ...
随机推荐
- SQLAlchemy表操作和增删改查
一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...
- python高精度浮点型计算的诡异错误
>>> from decimal import Decimal >>> a=Decimal(100.1) >>> b=Decimal(100.1) ...
- python2.7源码编译安装
最近学习docker容器,因为平时用的linux发型版都是centos6系列,所有pull了一个centos:6.6的景像,运行景像,进入容器后,发现其默认的python环境是2.6,为了更好的兼容我 ...
- windows service编程
1 基本概念 1.1windows服务简介 创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序. 这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面. 1. ...
- sqlalchemy-数据库操作
import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarat ...
- Jfinal拦截器源码解读
本文对Jfinal拦截器源码做以下分析说明
- 微信小程序 登录流程规范解读
一. 官方登录时序图 二. 简单理解 这里仅按照官方推荐的规范来 0. 前置条件 一共有三端: - 微信小程序客户端 - 第三方服务器端(自己搭建) - 微信服务器端 1. 客户端获得code,并将c ...
- jq实现上传头像并实时预览功能
效果 页面结构 <form action="" name="form0" id="form0"> <input type= ...
- [国嵌攻略][071][Coredump故障分析]
Core Dump定义 Core Dump又叫核心转存.当程序在运行过程中发生异常,Linux系统可以把程序出错时的内存内容存储在一个core文件中,这个过程叫Core Dump. Core Dump ...
- visual studio 打开微软MVC3示例MvcMusicStore的详细修改方法
1.官方下载地址:http://mvcmusicstore.codeplex.com/ 2.直接打开项目后,引用中会有三个dll文件报错,分别是System.Web.MVC;System.Web.He ...