C#创建一个小型Web Server(Socket实现)
要实现了WebServer,通过以下几句代码浏览器访问就可以获得访问的数据。
SocketsocketWatch=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socketWatch.Bind(newIPEndPoint(IPAddress.Parse("127.0.0.1"),81));
socketWatch.Listen(20);//参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。
Threadthread=newThread(delegate(objectobj)
{
SocketsocketListen=(Socket)obj;
while(true)
{
Socketsocket=socketListen.Accept();
byte[]data=newbyte[1024*1024*4];//浏览器发来的数据,限定为4K。
intlength=socket.Receive(data,0,data.Length,SocketFlags.None);
socket.Send(Encoding.UTF8.GetBytes("欢迎访问www.cftea.com\r\n"+DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss.fff")));
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
});
thread.IsBackground=true;
thread.Start(socketWatch);
但以上只是原理,实际会很复杂,不过就算我们要做简单的WebServer,还是需要解决两个问题:
一、输出HTTP头
byte[]body=Encoding.UTF8.GetBytes("欢迎访问www.cftea.com\r\n"+DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss.fff"));
byte[]head=Encoding.UTF8.GetBytes(@"HTTP/1.1200OK
Content-Length:"+body.Length+@"
Content-Type:text/plain
Date:"+string.Format("{0:R}",DateTime.Now)+@"
Server:CfteaWebServer
");
socket.Send(head);
socket.Send(body);
只要有特定的格式,就会被浏览器当作HTTP头对待。HTTP头的格式为:
- 第一行:HTTP/1.x+空格+状态码+空格+描述
- 中间行:名称+冒号+空格(也可以省略)+值
- 最后行:空行
格式一定要正确,否则影响浏览器对HTTP头和HTTP体的识别。
二、请求HTTP头
到目前为止,我们还不知道浏览器中输入的URL是什么呢。请求的HTTP头也是有特定格式的,我们只需要将其获取出来,进行拆解,就可以获取URL了。
拆解不是难事,我们说一说如何获取吧。前面的data、length不是一直没用么?如下:
stringrequestText=Encoding.UTF8.GetString(data,0,length);
完整代码
SocketsocketWatch=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socketWatch.Bind(newIPEndPoint(IPAddress.Parse("127.0.0.1"),81));
socketWatch.Listen(20);//参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。
Threadthread=newThread(delegate(objectobj)
{
SocketsocketListen=(Socket)obj;
while(true)
{
using(Socketsocket=socketListen.Accept())
{
byte[]data=newbyte[1024*1024*4];//浏览器发来的数据
intlength=socket.Receive(data,0,data.Length,SocketFlags.None);
if(length>0)
{
stringrequestText=Encoding.UTF8.GetString(data,0,length);
byte[]body=Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss.fff"));
byte[]head=Encoding.UTF8.GetBytes(@"HTTP/1.1200OK
Content-Length:"+body.Length+@"
Content-Type:text/plain
Date:"+string.Format("{0:R}",DateTime.Now)+@"
Server:CfteaWebServer
");
socket.Send(head);
socket.Send(body);
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
});
thread.IsBackground=true;
thread.Start(socketWatch);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。