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 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...
随机推荐
- python基础笔记-0
python中数据结构,主要有列表.元组.字典.集合. python中最基本数据结构是序列(sequence).序列中每个元素被分配一个序号——即元素位置,也成为索引.第一个索引是0,第二个是1,以此 ...
- In Depth : Android Boot Sequence / Process
In Depth : Android Boot Sequence / Process What happened when I press power on button in my Android ...
- 给flash文件加超链接[兼容主流浏览器]
<div style="position: relative;"> <a style="width: 640px; height: 90px; posi ...
- Codeforces 325E
Codeforces 325E 原题 题目描述:给出\(n\)个点, 编号为\(0 \text ~ n-1\),每个点连出两条边分别为\(2i\)和\(2i+1\)(\(mod n\)),现从\(0\ ...
- 最全面 Nginx 入门教程 + 常用配置解析
转自 http://blog.csdn.net/shootyou/article/details/6093562 Nginx介绍和安装 一个简单的配置文件 模块介绍 常用场景配置 进阶内容 参考资料 ...
- leetcode_question_111 Minimum Depth of Binary Tree
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...
- C语言对象化编程
以下为一个引子: C中struct的函数实现,只能用函数指针成员. C结构体内不能有函数的代码,但可以有函数的指针. C/C code Code highlighting produced by Ac ...
- 如果nginx 中worker_connections 值设置是1024,worker_processes 值设置是4,按反向代理模式下最大连接数的理论计算公式: 最大连接数 = worker_processes * worker_connections/4
如果nginx 中worker_connections 值设置是1024,worker_processes 值设置是4,按反向代理模式下最大连接数的理论计算公式: 最大连接数 = worker_pro ...
- ASP.NET MVC 学习之路-4
本文在于巩固基础 模型绑定 从URL 获取值 public ActionResult About(int id) { ViewBag.Id = id; return View(); } @{ View ...
- U盘安装win7+CentOS7双系统
决定要好好学习一下Linux了,不管是为了以后技术发展的需要抑或是满足自己的兴趣,都是时候来涉足一下了.我准备在我的ThinkPad X200i(一个老掉牙的老TP本子)上装一个Linux发行版,这里 ...