简单应答处理消息解析器模型

来源:互联网 发布:淘宝双十一魔盒什么用 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 判决书生效前看守所不收怎么办 法院判实刑看守所不收怎么办 派出所立案后送拘留所了怎么办 打架斗殴被关在看守所了怎么办 在看守所羁押期间患癌症怎么办 无法偿还借款拘留15天后怎么办 离婚起诉被告人被羁押怎么办 事实不清的案件怎么办 交通事故没时间去做笔录怎么办 偷东西被拘留家长该怎么办 在香港被拘留了怎么办 发票认证机卡了怎么办 交罚款的单子丢了怎么办 父亲行政拘留考警察政审不过怎么办 非法经营罪立案后不批刑拘怎么办 12分扣完了怎么办2018 驾驶证c1扣14分怎么办 车辆被扣12分怎么办 两个违章扣12分怎么办 车辆违章扣12分怎么办 一下扣了20分怎么办 违章扣了100多分怎么办 车子累计扣12分怎么办 起诉了对方不来怎么办 在监狱里被打伤了怎么办 初三要体检没去怎么办 羁押人在看守所没判刑怎么办? 在看守所关两年了还没有判刑怎么办 开麻将馆被拘留怎么办 拘留31天了我该怎么办 收到一封拘留信怎么办 存钱的收据掉了怎么办 行政拘留法制没有批的怎么办 别人起诉我我该怎么办 去钟落潭看守所送衣服要怎么办 长城宽带账号密码忘了怎么办 预约考试密码忘了怎么办 健康证预约号忘记怎么办啊 人在看守所七个月还没结果怎么办 起诉书和判决书丢了怎么办 进了看守所信用卡逾期怎么办