您的位置:首页 > 编程语言 > C#

C#中使用Socket实现简单Web服务器

2014-08-17 16:54 781 查看
上一篇博客中介绍了怎样使用socket访问web服务器。关键有两个:

熟悉Socket编程;

熟悉HTTP协议。

上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重点在浏览器端。本篇博客则反过来讲一下怎样使用socket来实现Web服务器,怎样去接收、分析、处理最后回复来自浏览器的HTTP请求。

HTTP协议是浏览器和Web服务器都需要遵守的一种通信规范,如果我们编写一个程序,正确遵守了HTTP协议,那么理论上讲,这个程序可以具备浏览器、甚至Web服务器的功能。

static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //侦听socket
static void Main(string[] args)
{
_socket.Bind(new IPEndPoint(IPAddress.Any, 8081));
_socket.Listen(100);
_socket.BeginAccept(new AsyncCallback(OnAccept), _socket);  //开始接收来自浏览器的http请求(其实是socket连接请求)
Console.Read();
}
static void OnAccept(IAsyncResult ar)
{
try
{
Socket socket = ar.AsyncState as Socket;
Socket new_client = socket.EndAccept(ar);  //接收到来自浏览器的代理socket
//NO.1  并行处理http请求
socket.BeginAccept(new AsyncCallback(OnAccept), socket); //开始下一次http请求接收   (此行代码放在NO.2处时,就是串行处理http请求,前一次处理过程会阻塞下一次请求处理)

byte[] recv_buffer = new byte[1024 * 640];
int real_recv = new_client.Receive(recv_buffer);  //接收浏览器的请求数据
string recv_request = Encoding.UTF8.GetString(recv_buffer, 0, real_recv);
Console.WriteLine(recv_request);  //将请求显示到界面

Resolve(recv_request,new_client);  //解析、路由、处理

//NO.2  串行处理http请求
}
catch
{

}
}


View Code
注意以上代码中的NO.1和NO.2处,socket.BeginAccept()方法放在NO.1处时,服务器端会并行处理请求,而放在NO.2处时,服务器会串行处理请求。读者可以每种方式都试一下,在串行处理请求时,请求处理过程会阻塞后续请求的处理(比如登录耗时10秒钟,其它人无法访问网站)。

以下是demo效果图:

图7:Web服务器运行后,浏览器访问首页:



图7

图8:浏览器中首页显示(包含登录框):



图8

图9:用户点击“登录”按钮,以Post方式提交数据,Web服务器解析、处理,返回新页面:



图9

文章有点长,部分截图还失真了(部分图以前整理的,没有找到大图,所以就凑合看:))

源码下载:http://files.cnblogs.com/xiaozhi_5638/socket_webServer.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: