您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 网站教程 > HTML教程 >
    使用beetle简单地实现高效的http基础服务(2)
    时间:2016-07-13 21:12 来源: 作者: 浏览:收藏 挑错 推荐 打印

    由于消息体有可能比较大,如果是几百MB的情况也不太可能用一个Buffer来处理,所以消息设计由多个数据块组件.       消息适器
       
       //消息适配器用于对象写入流转换
       public class HttpAdater : IMessage
       {
           public HttpMessage Message
           {
               get;
               set;
           }
           //从流加载数据,由于直接有协议分析器来处理了所以不需要实现相关方法
           public void Load(BufferReader reader)
           {
               throw new NotImplementedException();
           }
           //把http协议对象写入网络流
           public void Save(BufferWriter writer)
           {
               if (Message is HttpHeader)
               {
                   OnSaveHeader(writer, Message as HttpHeader);
               }
               else if (Message is HttpDataSegment)
               {
                   OnSaveDataSegment(writer, Message as HttpDataSegment);
               }
               else
               {
               }
               Message.Dispose();
           }
           //写入消息头信息
           private void OnSaveHeader(BufferWriter writer, HttpHeader header)
           {
               writer.WriteString(header.MethodInfo + "rn");
               foreach (object key in header.Headers.Keys)
               {
                   writer.WriteString(string.Format("{0}: {1}rn", key, header.Headers[key]));
               }
               writer.WriteString("rn");
           }
           //写入消息体信息
           private void OnSaveDataSegment(BufferWriter writer, HttpDataSegment segment)
           {
               writer.Write(segment.Data.Array, segment.Data.Offset, segment.Data.Count);
           }
       }
       制订HTTP协议分析器
       组件对协议的支持并不需要修改组件核心代码,都是通过扩展的方式实现.只需要继承Package实现相关方法即可.
       
       /// <summary>
       /// 网络数据导入方法
       /// </summary>
       /// <param name="data">接收数据流</param>
       /// <param name="start">开始索引</param>
       /// <param name="count">总长度</param>
       public override void Import(byte[] data, int start, int count)
       {
           int index = 0;
           if (mHeader == null)
           {
               //从池中获取头加载内存块
               if (mHeaderData == null)
               {
                   mHeaderData = BufferPools.Pop();
                   //初始化块内容
                   mHeaderData.SetInfo(0, 0);
               }
               //查询http头结束标记
               index = ByteIndexOf(data, EofData, start, count);
               if (index >= 0)
               {
                   //把http头数据流复制到当前分析缓冲区中
                   Buffer.BlockCopy(data, start, mHeaderData.Array, mHeaderData.Offset, index + 1);
                   mHeaderData.Count += index + 1;
                   start = index + 1;
                   count = count - index + 1;
                   //分析头信息
                   OnCreateHeader();
                   MessageArgs.Message = mHeader;
                   //触发消息接收事件
                   OnReceiveMessage(MessageArgs);
               }
           }
           //如果存在接收内容
           if (ContentLength > 0)
           {
               //新建一个数据块消息
               HttpDataSegment hds = new HttpDataSegment();
               //把数据流复制到相应的数据块中
               Buffer.BlockCopy(data, start, hds.Data.Array, 0, count);
               hds.Data.SetInfo(0, count);
               ContentLength -= count;
               //如果获取数据流完整后设置为结束块
               if (ContentLength == 0)
                   hds.Eof = true;
               MessageArgs.Message = hds;
               //触发消息接收事件
               OnReceiveMessage(MessageArgs);
           }
           //清除当前接收请求内容
           if (mHeader !=null && ContentLength == 0)
           {
               DisposeHeaderData();
               mHeader = null;
           }
       }

    (责任编辑:12图资源库)