1

VB.net で Http サーバーを作成しました。私は、HTTP サーバーを必要とするすべてのプロジェクト (最近かなりの数) に対して、同じ「テンプレート」を使用してきました。問題は、私が今取り組んでいるこれは、LAN 上のコンピューターがそれに接続できる必要があることです。次を使用して、コンピューターからサーバーに直接アクセスできます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

何かが機能しない場合 (テストのためにそのままコピー アンド ペーストしようとした場合など)、不要なコードの一部を削除しているときにミスを犯した可能性があります。

ところで: - ファイアウォールが実行されていません

スティーブドッグの編集

これらを2つのプレフィックスにしました:

.Prefixes.Add(String.Format("https://*:{0}/", PORT.ToString))
.Prefixes.Add(String.Format("http://*:{0}/", PORT.ToString))

プレフィックスを適用しようとするたびにエラーが発生するようになりました。

プレフィックス 'https://*:8002/' でリッスンできませんでした。これは、マシン上の既存の登録と競合するためです。

リッスンしているすべてのポートを確認しましたが、8002 はまだ開いています...

4

2 に答える 2

3

IP アドレス 127.0.0.1 ではリッスンできません。実際に実際の IP アドレスをリッスンする必要があります。127.0.0.1 をリッスンすると、特にループバック アドレスに送信されたメッセージのみが受信されます。

また、HttpListener を使用して、同じポートと IP アドレスで http と https の両方をリッスンすることはできません。詳細については、次のリンクを参照してください。

.NET HttpListener: HTTP と HTTPS の両方を登録すると、「マシン上の既存の登録と競合します」

于 2012-06-05T18:06:46.960 に答える
0

ではhttp://127.0.0.1:8002/、コンピュータのアドレスは です127.0.0.1

サーバーにアクセスするには、通常、次の 4 つの方法があります。

  • 127.0.0.1: これは自分のコンピューターからのみ機能します。

  • 192.168.1.1または類似: これは、ローカル ネットワークでのみ機能します。IPV4 アドレスは数が非常に限られているため、LAN でのみ有効なアドレスを使用しており、「永続的な」IP アドレスを誰からも見ることはできません。LAN 上のすべてのコンピューターは異なるローカル IP アドレスを持っていますが、世界中には同じローカル アドレスを持つコンピューターがたくさんあります。

  • LAN とインターネットの間のルーターがインターネットからの接続を許可するように構成されている場合 (これは、特にパーソナル コンピューターにファイアウォールがない場合は少し危険です)、多くの IP アドレスを使用して知っている可能性のある IP があります。http://www.knowmyip.com/のようなオンライン サービス。このアドレスは一時的なもので、次の接続時に変更されます (十分な IPV4 アドレスがないため)

  • http://dyn.com/dns/のようなサービスを使用して、定数名とサーバー間の動的リンクをすべての人に提供します。これにより、現在の IP アドレスを尋ねる代わりに、http://keods.dyndns.orgなどを使用してサーバーにアクセスできるようになります。

ただし、サーバーが固定 IP アドレスのないプライベート ネットワーク上にある限り、サーバーは、http://www.ovh.co.uk/ (または別のもの、これは単なる例です)。ビジネス パートナーにアドレスを提供する前に、多数のネーミングおよびホスティング オファーのいずれかを選択する必要があります。そのほとんどは非常に安価です。

于 2012-06-05T18:21:14.860 に答える