【发布时间】:2012-06-05 18:04:20
【问题描述】:
我在 VB.net 中创建了一个 Http Server。对于每个需要 Http Server 的项目(最近不少),我猜你可能会说,我使用了相同的“模板”。问题是,我现在正在使用的这个要求局域网上的计算机能够连接到它。我可以使用:http://127.0.0.1:8002/ 直接从我的计算机访问服务器。这是我的源代码(当然是略读):
Imports System.Net
Imports System.IO
Imports System.Web
Imports System.Text
Imports System.Text.RegularExpressions
Imports Microsoft.Win32
Public Class MainWindow
Private Enum ApplicationSituation
Idle
Login
TrackPage
End Enum
Private CurrentApplicationSituation As ApplicationSituation = ApplicationSituation.Idle
Private listener As New HttpListener
Private theService As String
Private Const PORT As Integer = 8002
Private Const SERVERNAME As String = "Poptimas"
Private ContentTypes As New Dictionary(Of String, String)
Private ServerThread As Threading.Thread
Private Sub WriteContentTypes()
'(TEXT) Human-readable text and source code
ContentTypes.Add(".txt", "text/plain")
ContentTypes.Add(".htm", "text/html")
ContentTypes.Add(".html", "text/html")
ContentTypes.Add(".xml", "text/xml")
ContentTypes.Add(".css", "text/css")
ContentTypes.Add(".csv", "text/scv")
ContentTypes.Add(".htc", "text/x-component")
ContentTypes.Add(".js", "application/javascript")
'(IMAGE)
ContentTypes.Add(".png", "image/png")
ContentTypes.Add(".jpg", "image/jpg")
ContentTypes.Add(".bmp", "image/bmp")
ContentTypes.Add(".gif", "image/gif")
ContentTypes.Add(".tiff", "image/tiff")
ContentTypes.Add(".ico", "image/vnd.microsoft.icon")
'(AUDIO)
ContentTypes.Add(".mp3", "audio/mp3")
ContentTypes.Add(".wav", "audio/vnd.wav")
ContentTypes.Add(".ogg", "audio/ogg")
ContentTypes.Add(".mwa", "audio/x-ms-wma")
'(VIDEO)
ContentTypes.Add(".mp4", "video/mp4")
ContentTypes.Add(".wmv", "video/x-ms-wmv")
ContentTypes.Add(".mov", "video/quicktime")
'(APPLICATION) Non-standard
ContentTypes.Add(".pdf", "application/pds")
ContentTypes.Add(".swf", "aplication/x-shockwave-flash")
End Sub
Private Function ParseQuery(ByVal queryset As String) As Dictionary(Of String, String)
Dim FinQu As New Dictionary(Of String, String)
If queryset.Length > 0 Then
For Each qSet As String In queryset.Substring(1).Split("&")
Dim sA() As String = qSet.Split("=")
FinQu.Add(sA(0), sA(1))
Next
End If
Return FinQu
End Function
Private Sub StartServer()
Try
Dim machineName As String = System.Environment.MachineName
VariableValues.Add("port", PORT)
VariableValues.Add("computer", machineName)
theService = HttpUtility.UrlEncode(SERVERNAME)
WriteContentTypes()
With listener
.Prefixes.Add(String.Format("https://*:{0}/", PORT.ToString))
.Prefixes.Add("http://127.0.0.1:" & PORT.ToString & "/")
.Start()
End With
Dim context As HttpListenerContext
Dim path As String
While listener.IsListening
context = listener.GetContext
path = context.Request.Url.AbsolutePath.ToLower
Dim query As Dictionary(Of String, String) = ParseQuery(context.Request.Url.Query)
If path = "/" Then
Select Case CurrentApplicationSituation
Case ApplicationSituation.Idle
Case ApplicationSituation.Login
SendPage(context.Response, My.Computer.FileSystem.CurrentDirectory & "/MobilePandoraConnection/login.html", ".html")
Case ApplicationSituation.TrackPage
SendPage(context.Response, My.Computer.FileSystem.CurrentDirectory & "/MobilePandoraConnection/track.html", ".html")
End Select
ElseIf path = "/inject" Then
SendPage(context.Response, My.Computer.FileSystem.CurrentDirectory & "/MobilePandoraConnection/PandoraMediaServer.js", ".js")
Else
SendPage(context.Response, My.Computer.FileSystem.CurrentDirectory & "/MobilePandoraConnection" & path, path.Substring(path.IndexOf(".")).ToLower())
End If
End While
With listener
.Stop()
.Close()
End With
Catch ex As Exception
MsgBox(ex.ToString())
End Try
End Sub
Private Sub SendPage(ByVal response As HttpListenerResponse, ByVal Location As String, ByVal extension As String)
With response
.ContentType = ContentTypes(extension)
.ContentEncoding = Encoding.UTF8
Try
Dim cont() As Byte = System.Text.Encoding.ASCII.GetBytes(page)
Else
cont = My.Computer.FileSystem.ReadAllBytes(Location)
End If
.OutputStream.Write(cont, 0, cont.LongLength)
.OutputStream.Flush()
Catch ex As Exception
MsgBox("Server Error: " & ex.ToString)
Finally
Try
.Close()
Catch ex As Exception
End Try
End Try
End With
End Sub
Private Sub MainWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'Stupid Server likes to keep everything running - kill that sucka'
Process.GetCurrentProcess().Kill()
End Sub
Private Sub SystemPanel_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
'Start server in new thread to prevent an un-reponsive form
ServerThread = New Threading.Thread(AddressOf StartServer)
ServerThread.Start()
End Sub
End Class
如果任何事情都不起作用(例如,如果您尝试将其复制并直接粘贴到测试中),那么我可能只是在删除一些不重要的代码时犯了一个错误。
顺便说一句: - 我的防火墙没有运行
为 STEVEDOG 编辑
我已经将这两个前缀设为:
.Prefixes.Add(String.Format("https://*:{0}/", PORT.ToString))
.Prefixes.Add(String.Format("http://*:{0}/", PORT.ToString))
现在每次尝试应用前缀时都会出错:
未能侦听前缀“https://*:8002/”,因为它与机器上的现有注册冲突。
我检查了所有正在侦听的端口,并且 8002 仍然打开...
【问题讨论】:
-
@SteveDog 好问题。没有。:)
-
考虑以后只发布相关代码...
-
@pst 这都是相关的。我只发布了服务器的代码。我不确定是哪个部分导致了问题,所以我发布了所有可能导致问题的部分。
-
你试过
.Prefixes.Add(String.Format("http://*:{0}/", PORT.ToString))而不是.Prefixes.Add(String.Format("https://*:{0}/", PORT.ToString))
标签: vb.net httpserver