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 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...
随机推荐
- 根据群ID和用户Id查询 + string QueryQunByUserIdAndQunId(int userId, int qunId) V1.0
#region 根据群ID和用户Id查询 + string QueryQunByUserIdAndQunId(int userId, int qunId) V1.0 /// <summary ...
- perl 正则命名捕获
#!/usr/bin/perl -w =pod 命名捕获--给匹配上的内容加上标签 捕获到的内容都会保存在%+散列中,这个散列的key为对应的标签: 方便之处就是利于程序扩展和阅读,不用繁琐的一个一个 ...
- JavaEE Tutorials (22) - 事务
22.1Java EE应用中的事务35222.2什么是事务35322.3容器托管事务353 22.3.1事务属性354 22.3.2回滚容器托管事务357 22.3.3同步会话bean的实例变量357 ...
- ubuntu KDE/GNOME vnc
- Android UI ActionBar功能-在 Action Bar 上添加按钮
在ActionBar上添加按钮实现某些功能最常见的Application的功能如:在ActionBar上添加一个搜索按钮: 首先官方文档说明:http://wear.techbrood.com/tra ...
- get the first and last collection item in Magento
$product_collection->getFirstItem() $product_collection->getLastItem()
- android listview 三种适配器设置
1: public class ArrayAdapterActivity extends ListActivity { @Override public void onCreate(Bundle sa ...
- python 网页爬虫+保存图片+多线程+网络代理
今天,又算是浪费了一天了.python爬虫,之前写过简单的版本,那个时候还不懂原理,现在算是收尾吧. 以前对网页爬虫不了解,感觉非常神奇,但是解开这面面纱,似乎里面的原理并不是很难掌握.首先,明白一个 ...
- 【邻接表字符串Hash】【HDU1800】Flying to the Mars
题意: 给你N个数字,带前导0,问出现最多的数字个数 思路: 读入,清楚前导0,Hash. 用邻接表字符串Hash有一下几点注意 string,不要memset,否则地址也没了,涉及到stl的东西,少 ...
- 网页平面设计 HTML
网页平面设计HTML基础 1.网页的基本元素:文字.图像.超链接 2.HTML的基本机构head.title.body三部分 <html> <head> <title&g ...