记得迷上Python
的那段时间,同时也关注了IronPython
一段时间,IronPython项目的源代码中就包含了一个简单的HttpServer,因为一直都对Web服务器的运行机制很感兴趣,因此研究了一下源代码并跟踪调试,也让我这服务器开发的门外汉体验了一把。
熟话说,看归看,写归写,写程序远比看懂代码有难度多了,于是乎堆码热情澎湃,堆了一个HttpServer雏形(实现原理的模型)
一、阻塞模型
阻塞模型,当您的程序运行到某条代码时(请求I/O操作),当前进程将等待在调用处,后面的语句将不继续执行,直到引起阻塞的语句执行完毕后,等待出后面
的语句将可继续执行,从这里我们可以知道,阻塞模型严重浪费计算机的资源,然而非阻塞将是该方案的替代者。我们先看看阻塞模型的实现代码:
首先,我们开启一个接受来自客户端请求的Socket并与IP地址和端口绑定,然后监听该Socket。
public static void OpenServer()
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
server.Listen(0);
}
接着我们用死循环接受来自客户端的请求并处理。注意:当程序运行后,如果客户端没有发起请求,下面的程序将在server.Accpet()处阻塞,直到有客户发起请求,程序才继续向下执行。
public static void BlockingSelect()
{
string response = "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n";
response += "<html><head><title>服务器</title></head><body><p style='color:red'>Hello World</p></body></html>";
while (true)
{
Socket temps = server.Accept();
byte[] buffer = new byte[server.SendBufferSize];
temps.Receive(buffer);
string request=System.Text.Encoding.Default.GetString(buffer);
Console.WriteLine(request);
temps.Send(System.Text.Encoding.Default.GetBytes(response));
temps.Close();
}
}
通过上面的这2段代码,我们就可以使用浏览器向服务器端发送请求了。如果正常,那么您的浏览器将显示已标红的"Hello World",至于上面的代码中response为什么要这样赋值,请读者阅读Http协议rfc
。上面的程序是能够跑起来了,但是细心的读者并把上面的程序Run一遍,会发现如果前一个请求没有结束,后面的请求将无法执行,也就是说像排队一样,必须一个一个执行完。这样很明显是很不科学并严重浪费资源的。
二、非阻塞模型
非阻塞模型,在Linux下一个很受大家欢迎的是epoll,一般开源项目(网络开发)使用到epoll的话,基本上都是好东西。而在windows下下
提供了5种选择(Select,WSAAsyncSelect,WSAEventSelect,Overlapped I/O,Completion
Port),本小段代码就使用异步选择(WSAAsyncSelect),因为它是最简单的,一个主线程就可以搞定,这可都要归功于Windows的(事
件)消息机制。代码如下:
public static void OpenServer()
{
tcpServer = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
tcpServer.Start(1000);
}
public static void NoBlockingSelect()
{
while (true)
{
if (tcpServer.Pending())(1)
{
tcpServer.BeginAcceptSocket(new AsyncCallback(CallBack), tcpServer);(2)
}
}
}
public static void CallBack(IAsyncResult obj)
{
if (obj.IsCompleted)
{
string response = "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n";
response += "<html><head><title>服务器</title></head><body><p style='color:red'>Hello World" + DateTime.Now.ToString("hh:mm:ss") + "</p></body></html>";
Socket tempserver = tcpServer.EndAcceptSocket(obj);
byte[] buffer = new byte[tempserver.ReceiveBufferSize];
tempserver.Receive(buffer, tempserver.ReceiveBufferSize, SocketFlags.None);
string request = System.Text.Encoding.Default.GetString(buffer);
Console.WriteLine(request.Trim());
tempserver.Send(System.Text.Encoding.Default.GetBytes(response));
tempserver.Close();
}
}
通过上面的代码,您现在可以通过浏览器发起请求了,该程序将最大接受1000个挂起的处理,每个请求将不会影响它后续的请求,程序将以异步方式执行,上面
的代码中,我标记了(1)、(2),其中,代码(1)将是检查是否有需要处理的请求,如果有待处理的请求那么才会开始以个异步接受,这里值得注意,如果没有这个检查,可以开起任务管理器,您将看到内存在跳舞且还激情四射;
代码(2)将执行一个异步Socket,并注册一个回调方法,以便当I/O请求完毕,通过消息信号的方式执行该方法。
三、总结
通过上面的2种Socket编程模型,玩成了一个HttpServer的雏形,如果想象力丰富一点,我们可以使用上面的非阻塞模型改造成一个Web游戏服务器,我现在就在使用Python+epoll进行试验,您不妨也体验一番。
分享到:
相关推荐
【标题】"VC++ 开发的HTTP SERVER服务器"揭示了使用Microsoft Visual C++(简称VC++)编程语言设计和实现的一个基于HTTP协议的服务器软件。HTTP服务器是互联网基础设施的重要组成部分,它负责处理客户端(通常是Web...
本篇将深入探讨如何利用VC++构建一个HTTP服务器,特别是基于给定的"VC++ HTTP Server"实例。 首先,"VC++ HTTP Server"的标题表明我们将关注的是使用Visual C++来创建一个能够处理HTTP协议的服务器。HTTP(超文本...
构建一个简单的HTTP服务器的C#程序实例。实现响应GET、POST请求。在服务端创建一个tcp通信来负责...每一次监听程序都会创建一个新的TcpClien,HttpServer类又会创建一个新的HttpProcessor,然后启动一个线程来操作。
//服务程序运行了几个月,基本正常,偶尔会出现异步操作异常(因所有连接都是共享同一个ado连接的原因) //以下部分关键代码供参考; TMainForm = class(TForm) IdHTTPServer: TIdHTTPServer; StartServerBtn: ...
基于 Apache 的 IBM HTTP Server 是基于 Apache Group开发的 Apache Web 服务器的 Web 服务器。IBM HTTP Server 包括一些在 Apache Group 开发的 Apache Web服务器没有的功能。IBM Http Server扩展了 Apache 的功能...
本服务程序为Delphi XE8开发的httpserver服务器程序,为线上订货系统提供ERP系统库存检查服务。
在本文中,我们将深入探讨如何使用Indy控件创建一个HTTP服务器,以及它在Delphi开发中的重要性。 Indy组件库(Internet Direct)是Delphi集成开发环境中的一个组成部分,它提供了大量的低级网络协议组件,涵盖了...
com.sun.net.httpserver
学习Nginx HTTP Server.pdf 清晰版
总的来说,"轻量级C++实现的httpserver和httpclient"是一个很好的学习资源,它展示了如何利用mongoose库在C++项目中快速实现HTTP服务功能,为开发者提供了更灵活的选择。无论是为了学习还是实际项目开发,这都是一个...
Java HttpServer源码工程是一个基于Java平台实现的轻量级HTTP服务器项目,它允许开发者创建自己的Web服务,处理HTTP请求并返回响应。这个工程的核心在于理解如何使用Java NIO(非阻塞I/O)和Java网络编程来构建一个...
下这个吧 , https://download.csdn.net/download/dami_lixm/11341046 android端HttpServer的实现,PC端通过浏览器访问android端SD卡上文件的功能
在本项目中,"网络编程HttpServer c++实现" 是一个使用C++语言编写的HTTP服务器,它允许用户创建和管理基于HTTP协议的服务。HTTP服务器是互联网上的关键组件,它们接收HTTP请求并返回HTTP响应,使得网页和其他资源...
在DelphiXE中,我们可以创建一个HttpServer对象,设置监听的端口和处理请求的回调函数,以此构建一个简单的HTTP服务器。 接下来,我们将讨论如何实现客户端与服务器的数据传输。在客户端,我们可以利用idHttp组件的...
"HTTP SERVER C++"项目是一个专注于使用C++编程语言实现简单HTTP服务器的实践案例。这个服务器不仅提供基本的HTTP服务,还支持CGI(通用网关接口)以及自定义错误页面功能,使得开发人员可以更灵活地处理用户请求和...
实现一个简单的HttpServer,通常涉及以下几个步骤: 1. **创建Socket**:服务器端通过`socket()`函数创建一个Socket对象。 2. **绑定地址和端口**:调用`bind()`函数将Socket绑定到特定的IP地址和端口号,以便...
QT简单的HttpServer是一个基于QT库实现的轻量级HTTP服务器,非常适合初学者或者开发者用于学习和研究HTTP服务器的基本原理和QT编程技术。QT是一个跨平台的C++开发框架,广泛应用于图形用户界面、网络通信、多媒体...
一个用java实现的web服务器 httpserver
史上最简单的OPC Server SDK开发包,最少只需调用4个函数即可完成一个OPC Server的开发。不需要知道OPC规范、也不需要知道任何COM/DCOM、ATL、MFC的知识,不需要理解wchar_t、BSTR等宽字符,甚至不需要理解注册表...
C# httpserver 的实现,简单的封装,非常实用!更适合初学者的学习、借鉴