-
C#教程之C#教程之.net 平台下, Socket通讯协议中间件设计思(2)
public class NetValueString: NetValueBase { public string Value { get; set; } = string.Empty; public override object GetValue() { return Value; } public NetValueString() { ValueType = EN_DataType.en_string; } public NetValueString(string value) { ValueType = EN_DataType.en_string; Value = value; } }
NetValueString值最终要以字节流方式传送出去,采用如下方式序列化:
string值采用utf8传输,先将字符串转换成字节流;分别写入字节流的长度,实际的字节流;
在序列化中,没用多余字段。比.net 自带的序列化类处理要高效的多,大家可以对比下。
1
2
3
4
5
6
7
|
internal static void WriteStringValue(Stream stream, string value) { byte [] bytes = Encoding.UTF8.GetBytes(value); WriteInt32(stream, bytes.Length); stream.Write(bytes, 0, bytes.Length); } |
其它类型的序列化,与此类似,不在累述。反序列化如何操作,也不难想像。
传输
序列化后的数据要发送出去,需要下一层来处理。
这层的主要功能就是分包和合包。(数据很小的时候就不需要分包了)
1
2
3
4
5
6
7
8
|
public class RawNetPacket { public static int HeadLen = 14; public UInt16 PacketLen; public UInt32 PacketId; //一个完整的包 唯一id public UInt32 TotalNO; //共有多少个包 public UInt32 PacketNO; //包序列号 public byte [] Body; //承载NetPacket序列化的数据,有可能分包发送 |
1
|
} |
具体如何分包和合包,可以参考附件源码。
使用举例
1 传送文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
private NetPacket GetPacketByFile( string fileName) { using (FileStream stream = new FileInfo(fileName).OpenRead()) { NetPacket result = new NetPacket(); result.PacketType = 2; result.Param1 = 2; result.Param2 = 3; result.Items = new List<NetValuePair>(); //string NetValuePair pair = new NetValuePair(); pair.Key = "文件名称" ; pair.Value = new NetValueString(fileName); result.Items.Add(pair); //byte pair = new NetValuePair(); pair.Key = "文件二进制数据" ; NetValueListByte fileBuffer = new NetValueListByte(); fileBuffer.Value = new byte [stream.Length]; stream.Read(fileBuffer.Value, 0, Convert.ToInt32(stream.Length)); pair.Value = fileBuffer; result.Items.Add(pair); return result; } } |
栏目列表
最新更新
如何使用OS模块中的stat方法
Python os 模块
seek() 方法
python打开文件实例1
Python写入文件
什么是流?
文件操作如何进制逐行读取
Python相对路径
with创建临时运行环境
Python文件操作
.Net Standard(.Net Core)实现获取配置信息
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
access教程之Access简介
mysql 安装了最新版本8.x版本后的报错:
Mysql空间数据&空间索引(spatial)
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
数据定义功能
数据操作功能