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);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。