在这个数字时代,了解如何创建自己的Web服务器是一项非常有用的技能。本文将指导通过几个简单的步骤来实现这一目标。将使用VB.NET编程语言,因为它简单易学,且功能强大。
在开始之前,需要配置Web服务器的一些基本参数,包括它可以同时处理的最大操作数和用于查询的端口号。
首先,需要定义一个常量来表示可以同时处理的最大操作数。例如,如果定义这个值为2,那么服务器一次只能处理3个请求。
Private Const mc_MaxCurrentProcesses As Integer = 2
接下来,需要定义服务器监听的端口号。这个端口号将用于接收客户端的请求。
Private Sub cmdStartServer_Click()
On Error GoTo ERR_Catcher
wscDistributer.LocalPort = mc_Port
wscDistributer.Listen
lstHistory.Clear
lstHistory.AddItem "WebServer started (Local: http://" & wscDistributer.LocalIP & ":" & wscDistributer.LocalPort & "/ http://" & wscDistributer.LocalHostName & ":" & wscDistributer.LocalPort & ")"
lstHistory.AddItem "For reachable in the Internet, please read Readme.txt"
lstHistory.ListIndex = lstHistory.ListCount - 1
cmdStartServer.Enabled = False
cmdStopServer.Enabled = True
Exit Sub
ERR_Catcher:
MsgBox "An error happened" & vbCrLf & "Another webserver is probably active and runs on port " & mc_Port & " listens." & vbCrLf & "Check this and try again later... " & vbCrLf & vbCritical + vbOKOnly, "ERROR"
wscDistributer.Close
End Sub
一旦服务器开始监听,它将等待客户端的请求。如果请求没有被阻止(例如,通过IP阻止器),它将被转发给一个空闲的发送器。
当一个请求被一个空闲的发送器接收时,首先检查另一个实例是否曾经发送过GET查询。如果没有,发送器的工作就完成了。但如果确实是一个GET查询,那么被查询的页面将通过字符串操作被截断。如果查询的文件存在,它将以二进制形式发送给实例。现在可以在浏览器中看到被查询的文件了。
此外,还可以实现请求的重定向。这意味着,如果实例的IP被阻止,那么(在这个例子中)文件forbidden.htm将被二进制发送给实例。
当想要停止服务器时,可以调用以下代码:
Private Sub cmdStopServer_Click()
wscDistributer.Close
lstHistory.AddItem "WebServer stopped"
lstHistory.ListIndex = lstHistory.ListCount - 1
cmdStartServer.Enabled = True
cmdStopServer.Enabled = False
End Sub
当服务器接收到来自客户端的数据时,需要处理这些数据。这通常涉及到解析请求,检查请求的文件是否存在,以及将文件发送回客户端。
Private Sub wscSender_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strRequest As String
Dim intPosBegin As Integer
Dim intPosEnd As Integer
Dim strFilePath As String
Dim strRequestedPage As String
On Error GoTo ERR_Catcher
wscSender(Index).GetData strRequest
If Mid(strRequest, 1, 3) = "GET" Then
intPosBegin = InStr(strRequest, "GET") + Len("GET") + 1
intPosEnd = InStr(intPosBegin, strRequest, " ")
strRequestedPage = Mid(strRequest, intPosBegin, intPosEnd - intPosBegin)
If Left$(strRequestedPage, 1) = "/" Then
strRequestedPage = Right$(strRequestedPage, Len(strRequestedPage) - 1)
End If
If strRequestedPage = "" Or strRequestedPage = "/" Then
strFilePath = FileWithAppPath("index.html")
Else
strFilePath = FileWithAppPath(strRequestedPage)
End If
If optAllButLocal.Value = True And wscSender(Index).RemoteHostIP = wscSender(Index).LocalIP Then
strFilePath = FileWithAppPath("forbidden.htm")
ElseIf optLocal.Value = True And wscSender(Index).RemoteHostIP <> wscSender(Index).LocalIP Then
strFilePath = FileWithAppPath("forbidden.htm")
End If
If Dir(strFilePath) = "" Then
strFilePath = FileWithAppPath("404.htm")
End If
lstHistory.AddItem Space(3) & Now() & " Uhr: Sending query (" & wscSender(Index).RemoteHostIP & "): " & strFilePath & "(" & Format(FileLen(strFilePath), "#,##0") & " Bytes)"
lstHistory.ListIndex = lstHistory.ListCount - 1
wscSender(Index).SendData LoadBinary(strFilePath)
End If
Exit Sub
ERR_Catcher:
MsgBox "While sending the files an error occurred. The action has been aborted!", vbCritical + vbOKOnly, "ERROR"
wscSender(Index).Close
End Sub