简单应答处理消息解析器模型
来源:互联网 发布:淘宝双十一魔盒什么用 编辑:程序博客网 时间:2024/05/19 19:35
在构建了通用的通信模型之后,通过通信层返回的所有数据,都是放在不同的连接会话上,因为连接会话的存在,保证了多连接并发处理时的数据隔离性。
因为在传输层上所有的数据都是字节流,还无法转换成对应的结构化数据,在进行结构化数据的反序列化前,需要对流数据,进行拆解过滤和解析,这就涉及到了应答(或请求,从不同的角度看,这两个概念都成立)处理消息解析器,基本的简单消息流,一般包括了开始标记和结束标记,通过开始和结束标记,来获取中间的传输数据。这样就能获得一个独立的结构体了,后面再进行深一步的解析和反序列化处理等都有了依据。
此处按照最简单的开始标记和结束标记,消息化解析器为模型,流程图:
核心部分实现逻辑代码:
public class TestServerOutPutMessageFilter : BaseOutPutMessageFilter<TestServerRequest,TestServerResponse> { byte[] responseBuffer=null; byte[] start = new byte[] { 0x02, 0x02 }; byte[] end = new byte[] { 0x03, 0x03 }; private int receiveTimeOut = 50000;//毫秒,两个包之间的时间超过多少毫秒,会丢弃前面的包 private DateTime lastReceiveTime = DateTime.Now;//上一次接收时间 public override TestServerResponse FilterRequest(string sessionID, byte[] buffer) { if ((DateTime.Now - lastReceiveTime).TotalMilliseconds > receiveTimeOut) { responseBuffer = null; } lastReceiveTime = DateTime.Now; byte[] newBuffer = Concat(responseBuffer, buffer); int startIndex = FirstIndexOfBuffer(newBuffer, start); int endIndex = FirstIndexOfBuffer(newBuffer, end); if (startIndex == -1) { if (endIndex != -1) { responseBuffer = this.ClearBeforePosition(newBuffer, endIndex + end.Length); } return null; } if (endIndex == -1) { responseBuffer = newBuffer; return null; } if (startIndex > endIndex) { responseBuffer = this.ClearBeforePosition(newBuffer, startIndex); return null; } byte[] blockBuffer = BlockByIndex(newBuffer, startIndex + start.Length, endIndex - 1); responseBuffer=this.ClearBeforePosition(newBuffer, endIndex + end.Length); if (blockBuffer == null || blockBuffer.Length == 0) { return null; } TestServerResponse responseData = new TestServerResponse(); responseData.SessionID = sessionID; responseData.Message = System.Text.Encoding.Default.GetString(blockBuffer); return responseData; } /// <summary> /// 查找指定的数据体中第一个对应的Block块的位置 /// </summary> /// <param name="buffer">数据体</param> /// <param name="indexBuffer">索取指定的Block的位置</param> /// <returns> /// 返回Block块在Buffer中的起始位置,如果返回-1说明Buffer中不存在对应的Block块 /// </returns> public int FirstIndexOfBuffer(byte[] buffer, byte[] indexBuffer) {} /// <summary> /// 将两个字节流数组和并到一个新的数组中 /// </summary> /// <param name="buffer1">第一个字节数组</param> /// <param name="buffer2">第二个字节数组</param> /// <returns> /// 返回合并后的新的字节数组 /// </returns> public byte[] Concat(byte[] buffer1, byte[] buffer2) {}/// <summary> /// 清除指定数组中指定位置前的所有数据,并对数组进行压缩 /// 从0开始索引位置 /// </summary> /// <param name="buffer">原数组</param> /// <param name="position">位置</param> /// <returns> /// 返回清除压缩后的数据信息 /// </returns> public byte[] ClearBeforePosition(byte[] buffer, int position) {} /// <summary> /// 根据索引位置从数组中获取指定块数据 /// </summary> /// <param name="buffer">原始数组</param> /// <param name="startIndex">开始位置</param> /// <param name="endIndex">结束位置</param> /// <returns> /// 返回对应的块数据, /// 如果不存在数据返回null /// </returns> public byte[] BlockByIndex(byte[] buffer, int startIndex, int endIndex) {}
0 0
- 简单应答处理消息解析器模型
- 对DNS应答报文的解析及简单处理代码
- nuplayer处理服务端的应答消息notifyResponseListener
- 消息处理模型
- 合作消息处理模型
- SIP应答消息大全
- gRPC异步处理应答
- servlet简单应答
- C#开发微信门户及应用(2)--微信消息的处理和应答
- 控制JMS中的消息应答
- SIP 协议消息应答代码
- 消息请求应答与RPC
- RabbitMQ消息应答------ack机制
- BIO请求-应答[通讯模型]
- 解析windows消息处理机制
- 解析异步消息处理机制
- 解析异步消息处理机制
- 解析异步消息处理机制
- SAP SD Sales Order - Maintain billing plan & Billing Dates
- 生活一直在告诉我们,学会等与忍
- 三、Pocketsphinx_Android中英文小范围高准确率
- LeetCode 91 Unique Paths
- 心怀渴望,不断前行
- 简单应答处理消息解析器模型
- error C2143: syntax error : missing ';' before '<class-head>'
- 网页抓包工具 只实现了抓图片的功能
- android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)
- [LeetCode] Binary Tree Preorder Traversal
- 《大话西游影评》 转自豆瓣
- js代码优化
- Android基础面试问题
- Reverse Words in a String