如何写一个Web服务器

如何写一个Web服务器,第1张

针对web服务器:首先你要去了解HTTP协议,web server说到底就是一个遵循Http协议的应用程序。可以先写一个简单的,然后去关注一些high performance相关的, i/o 复用(epoll), event loop, non-blocking, C10k问题,tcp调优(tcp_cork, tcp_nodelay...),高级I/O function(e.g. sendfile, writev, readv, mmap, splice, tee...), 常用的服务端架构(推荐陈硕的Muduo C++那本书,不是让你看muduo, 而是他讲的一些思想、做法和框)

创建一个 WEB 服务器

NetBox 的一大功能就是内置支持了 HttpServer 和 asp。下面就按步骤建立一个以服务方式运行的 WEB 服务器。

第一步:创建 WEB 服务器

由于 NetBox 提供了 HttpServer 对象,所以建立一个新的 HttpServer 并且启动、停止、退出,自然便是由 HttpServer 对象来实现,main.box 的代码也就比较简单了:

Set Console = Shell.Console

Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then

httpd.Start

Console.ReadLine

httpd.Stop

httpd.Close

End If

Set httpd = Nothing

在上面的代码中,先创建一个新的 HttpServer,然后在所有的本机地址的 80 端口创建一个服务器,如果创建成功,则启动服务器,等待用户在控制台上输入回车后停止并关闭服务器。

运行这个程序,如果当前系统中未安装其他 Web 服务器,则此程序会显示控制台并等待回车,否则将直接退出。呵,我们的第一个程序都是很拙劣的。没有关系,我们一步一步来。

如果成功运行了程序,便可以用浏览器访问了,由于服务器装在本机,所以打开浏览器,在地址栏输入“http://localhost/”,哈,结果出来了,不过很不好看:

418 Host Not Found

不管想访问什么,都只会是这个结果。这样的结果显然不能满足要求,所以我们需要改进我们的 Web 服务器。

第二步:添加虚拟主机

前面我们建立的服务器之所以总是返回禁止访问,原因是没有为服务器建立主机信息。所以我们修改代码,使用 AddHost 方法增加主机信息的部分:

Set Console = Shell.Console

Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then

httpd.AddHost "", "\wwwroot"

httpd.Start

Console.ReadLine

httpd.Stop

httpd.Close

End If

Set httpd = Nothing

在 NetBox 执行目录建立一个子目录 wwwroot,然后复制一些网页进去。我们再来看看效果如何。执行程序并再次访问“http://localhost/”,结果居然还是“403 Forbidden”。再访问 wwwroot 目录中已有的文件,哈哈,出现正确内容了。所以,实际上主机已经建立出来,但是未给主机提供缺省文件名。

第三步:添加缺省文件

为了让主机知道当用户访问目录时向用户返回的文件,需要使用 AddDefault 方法为主机添加缺省文件名,修改代码如下:

Set Console = Shell.Console

Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then

Set host = httpd.AddHost("", "\wwwroot")

host.AddDefault "default.htm"

httpd.Start

Console.ReadLine

httpd.Stop

httpd.Close

End If

Set httpd = Nothing

我们再访问“http://localhost/”的时候,会发现不再显示禁止访问,而是开始出现了缺省页面的内容。如果给定的缺省文件不存在,则返回“404 File Not Found”。

第四步:支持服务器脚本

上面的步骤建立出来的 Web 服务器,是一个纯静态文件的服务器,是无法执行服务器脚本程序的,为了让我们的 Web 服务器能够理解服务器端脚本程序,需要修改 EnableScript 属性,同时为了让服务器能够使用脚本程序做为缺省文件,还需要再添加一个缺省文件,下面是新修改的代码:

Set Console = Shell.Console

Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then

Set host = httpd.AddHost("", "\wwwroot")

host.EnableScript = true

host.AddDefault "default.asp"

host.AddDefault "default.htm"

httpd.Start

Console.ReadLine

httpd.Stop

httpd.Close

End If

Set httpd = Nothing

接下来,我们就可以在 wwwroot 目录里建立我们的 asp 脚本程序了,建立 test.asp:

<%Response.Write "Hello"%>

NetBox 也支持服务器 box 程序,在 wwwroot 目录中建立 test.box:

Response.Write "Hello"

第五步:以服务方式运行

到目前为止,已经有一个相对完整的 Web 服务器程序了,下面我们需要将这个服务器改写为系统服务程序,可以将其安装成为一个系统服务,更加便于运行维护。改写成为服务程序需要使用 Service 对象。

下面便是一个完整的 Web 服务程序的代码,关于 Service 对象的更多信息请参阅手册相关内容。

Dim httpd

Shell.Service.RunService "NBWeb", "NetBox Web Server", "NetBox Http Server Sample"

---- Service Event ---

Sub OnServiceStart()

Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then

Set host = httpd.AddHost("", "\wwwroot")

host.EnableScript = true

host.AddDefault "default.asp"

host.AddDefault "default.htm"

httpd.Start

else

Shell.Quit 0

end if

End Sub

Sub OnServiceStop()

httpd.Close

End Sub

Sub OnServicePause()

httpd.Stop

End Sub

Sub OnServiceResume()

httpd.Start

End Sub

总结

实现一个完整的 Web 服务程序,需要 HttpServer,HttpServerHost,Service 三个对象的支持,HttpServer 负责建立服务器并控制服务器的运行状态,HttpServerHost 负责建立主机信息, Service 则负责完成与服务程序相关的操作。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/211443.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存