实现一个HTTP服务并在浏览中访问
组件提供基础的服务对象,只需要在继承指写对应的协议分析器即可,用起来也非常简单方便.
class Program:ServerBase
{
static void Main(string[] args)
{
//初如化组件
TcpUtils.Setup("beetle");
Program server = new Program();
server.Listens = 1000;
//在所有IP的8088端口上监听服务
server.Open(8088);
Console.WriteLine("Beetle Http Server start@8088");
System.Threading.Thread.Sleep(-1);
}
protected override void OnConnected(object sender, ChannelEventArgs e)
{
base.OnConnected(sender, e);
e.Channel.EnabledSendCompeletedEvent = true;
e.Channel.SendMessageCompleted = (o, i) => {
HttpPackage.HttpAdater adapter = (HttpPackage.HttpAdater)i.Messages[i.Messages.Count - 1];
//消息发送完成后判断是否关闭对应的连接
if (adapter.Message is HttpPackage.HttpHeader)
{
if (((HttpPackage.HttpHeader)adapter.Message).ContentLength == 0 && e.Channel != null)
e.Channel.Dispose();
}
else if (adapter.Message is HttpPackage.HttpDataSegment)
{
if (((HttpPackage.HttpDataSegment)adapter.Message).Eof && e.Channel != null)
e.Channel.Dispose();
}
};
}
//错误处理事件,可以获取协议分析和逻辑处理环节中出现的异常
protected override void OnError(object sender, ChannelErrorEventArgs e)
{
base.OnError(sender, e);
Console.WriteLine("{0} error:{1}", e.Channel.EndPoint, e.Exception.Message);
Console.WriteLine(e.Exception.StackTrace);
}
//连接释放过程
protected override void OnDisposed(object sender, ChannelDisposedEventArgs e)
{
base.OnDisposed(sender, e);
}
//消息接收处理事件
protected override void OnMessageReceive(PacketRecieveMessagerArgs e)
{
base.OnMessageReceive(e);
if (e.Message is HttpPackage.HttpHeader)
{
OnRequestHeader(e.Channel, (HttpPackage.HttpHeader)e.Message);
}
else if (e.Message is HttpPackage.HttpDataSegment)
{
OnRequestSegment(e.Channel, (HttpPackage.HttpDataSegment)e.Message);
}
}
//得到请求头信息处理过程
private void OnRequestHeader(TcpChannel channel, Beetle.Packages.HttpPackage.HttpHeader header)
{
//Console.WriteLine(header.MethodInfo);
//foreach (object key in header.Headers.Keys)
//{
// Console.WriteLine("{0}:\t{1}", key, header[(string)key]);
//}
HttpPackage.HttpHeader response = new HttpPackage.HttpHeader();
HttpPackage.HttpDataSegment responsedata = new HttpPackage.HttpDataSegment();
responsedata.Data.Encoding(Resource1.BEETLE_HTTP_TEST, channel.Coding);
responsedata.Eof = true;
response.ContentLength = responsedata.Data.Count;
response.MethodInfo = "HTTP/1.1 200 OK";
response["Cache-Control"] = "private";
response["Connection"] = "Close";
response["Content-Type"] = "text/html; charset=utf-8";
response["Server"] = "Beetle Http Server";
//发送应答头
channel.Send(response);
//发送应答数据
channel.Send(responsedata);
}
private void OnRequestSegment(TcpChannel channel, Beetle.Packages.HttpPackage.HttpDataSegment segment)
{
}
}
以上一个HTTP服务已经实现了,由于测试用所以当接收请求后并没有分析对应的请求信息,直接测试内容.通过浏览器查询如下: