由于消息体有可能比较大,如果是几百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图资源库)