c# 搭建服务端 传输协议(2)
在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才能在服务端以相同的方式进行读取,我理解中的协议,便是这个排列的顺序。
1.数据转换成二进制
Encoding.XXX.GetBytes(Str)
using (MemoryStream memStream=new MemoryStream())
{
memStream.WriteByte(Str);
}
using (MemoryStream memStream=new MemoryStream())
{
memStream.ReadByte(bytes);
}
以上两种方式都可以将字符串转换成二进制,但第一种显然不大容易解析和读取,因为当我们需要传递一个数据模型的时候,转换成二进制后解析的时候会很费力气,且方法很难重用,所以当数据传输的类型、数量复杂的时候 第二种方式是不错的选择。
2.协议
所谓协议,就是在传输的时候按照固定的顺序使用MemoryStream类将对象write成byte[],然后读取的时候也使用该类按照相同的顺序解析。
协议定义代码
定义了一个公用的二进制和对象之间的转换类BytesHelper
public class BytesHelper<T>
{
/// <summary>
/// 将类对象转换为byte数组
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static byte[] ToBytes(T t)
{
byte[] buff;
using (MemoryStream ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
iFormatter.Serialize(ms, t);
buff = ms.GetBuffer();
}
return buff;
}
/// <summary>
/// 将byte数组转化为对象
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
public static T ToModel(byte[] buff)
{
T obj;
using (MemoryStream ms = new MemoryStream(buff))
{
IFormatter iFormatter = new BinaryFormatter();
obj = (T)iFormatter.Deserialize(ms);
}
return obj;
}
}
这样就可以通过对象和二进制之间的转换来使用固定的协议类型了,而协议也可以写作实体形式进行传递、解析。下面是协议的简单写法:
public interface IProto<T>
{
ushort ProtoCode { get; }
byte[] ToArray();
T GetProto(byte[] buffer);
}
public struct MyProto : IProto<MyProto>
{
public ushort ProtoCode { get { return 2001; } }
public int uid;
public byte[] GetByte()
{
using (MemoryStream ms = new MemoryStream())
{
ms.WriteUShort(ProtoCode);
ms.WriteInt(uid);
return ms.ToArray();
}
}
public MyProto GetProto(byte[] buffer)
{
MyProto proto = new MyProto();
using (MemoryStream ms = new MemoryStream(buffer))
{
proto.uid = ms.ReadInt();
}
return proto;
}
}
c# 搭建服务端 传输协议(2)的更多相关文章
- CAS 5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明
CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...
- CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端
CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...
- 使用Apache MINA框架搭建服务端
使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...
- linux之FTP服务搭建 ( ftp文件传输协议 VSFTPd虚拟用户)
FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...
- c#搭建服务端 准备工作(1)
思路 搭建服务器主要为了接收客户端所传来的数据,在学习过程中,整体的搭建逻辑大体分为以下几个步骤: 1.启动线程监听服务端口 2.监听客户端链接并进行处理 3.接收客户端传入的消息 4.向客户端回传( ...
- Netty搭建服务端的简单应用
Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...
- 用“MEAN”技术栈开发web应用(二)express搭建服务端框架
上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...
- c# 搭建服务端 byte[] 处理(3)
数据的传输中,为防止数据传输过程中被获取解析 造成数据的不安全,一般都会采取各类的方式对数据进行加密.压缩等操作,在客户端或服务端以相同的算法解析即可获得数据,一定程度上减小了数据在中间过程被获取数据 ...
- 在 Windows Server 上搭建 *** 服务端(转载加亲测)
转载自:https://diveng.io/build-shadowsocks-server-on-windows-server.html 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...
随机推荐
- Nlog、elasticsearch、Kibana以及logstash
Nlog.elasticsearch.Kibana以及logstash 前言 最近在做文档管理中,需要记录每个管理员以及用户在使用过程中的所有操作记录,本来是通过EF直接将操作数据记录在数据库中,在查 ...
- python--getitme\setitem 支持索引与分片
1.想要自己定义的python对象支持索引与分片操作就要重载__getitem__\__setitem__这两个方法. 2.__getitme__(self,index) 这里的index参数可能类型 ...
- JDK常见问题 环境变量配置
"javac不是内部命令或外部命令" Windows7 安装"jdk-6u26-windows-x64.exe"后,常提示"javac不是内部命令或外 ...
- 目前常用AD/DA芯片简介
目前生产AD/DA的主要厂家有ADI.TI.BB.PHILIP.MOTOROLA等,武汉力源公司拥有多年从事电子产品的经验和雄厚的技术力量支持,已取得排名世界前列的模拟IC生产厂家ADI.TI公司代理 ...
- Logstash 默认不处理一天前的文件
The default behavior of the file input plugin is to ignore files whose last modification is greater ...
- Docker 基于已有镜像的容器创建镜像
Docker 基于已有镜像的容器创建镜像: docker:/root# docker run -it januswel/centos /bin/bash docker exec -it januswe ...
- poj1504--求两个数的反转数的和的反转数
题意:给定4321 5678,结果再反转(1234+8756) 一开始以为是poj1503一样,就稀里糊涂的敲代码,实际上有不同 如题:先求1234 + 8765 ------------------ ...
- Subsequence(暴力+二分)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10875 Accepted: 4493 Desc ...
- Floodlight中 处理packetin消息的顺序(1)
当Controller和SW建立连接之后,就能够处理来自SW的各种OF msg.当接收到 packetin 消息之后,会将其分发给各个监听了这个OFMessage的listeners,所以假设我们要设 ...
- The encryption certificate of the relying party trust identified by thumbprint is not valid
CRM2013部署完ADFS后通过url在浏览器中訪问測试是否成功,成功进入登陆界面但在登陆界面输入username和password后始终报身份验证失败,系统中的报错信息例如以下:Microsoft ...