VB.netを使ったHTTPサーバーの実験

1、	ブラウザにより、サーバーのシステムタイムを見られるようにする。
2、	アパッチやIISのような出来合いのhttpdコンポーネントを使わない。

通常のHTTPモデル

ブラウザー −−セッション開始−−>   サーバー
ブラウザー −−ヘッダー送信−−>   サーバー
ブラウザー <−−レスポンス−−      サーバー
ブラウザー <−−セッション終了−−  サーバー

この仕組みをVB.netで実現すると次のようになります。
------------------------------------------------------------------------------

Module Module1

    Sub Main()
        Const portNum As Integer = 1000 '待機するポート番号を指定
        Dim listener As New System.Net.Sockets.TcpListener(portNum)
        listener.Start()

        While True
            Console.Write("Waiting for connection...")
            Dim client As System.Net.Sockets.TcpClient = listener.AcceptTcpClient()
            Console.WriteLine("Connection accepted.")
            Dim ns As System.Net.Sockets.NetworkStream = client.GetStream()

            Dim ThisMoment As Date
            ThisMoment = Now  ' Assign current system date and time.
            Dim TimeString As String = ThisMoment.TimeOfDay.ToString

            Dim str As String

            ''----ヘッダー受信部分----
            Dim getWord(1024) As Byte
            Dim bytesRead As Integer = ns.Read(getWord, 0, getWord.Length)
            Console.WriteLine(System.Text.Encoding.Default.GetString(getWord, 0, bytesRead))

            ''----本文送信部分----
            str = "<html><head><META HTTP-EQUIV=""Refresh"" CONTENT=""1""> </head><body>ただいまの時刻は " + TimeString + "</body></html>"
            'str = "hello"
            Dim word As Byte() = System.Text.Encoding.Default.GetBytes(str)
            ns.Write(word, 0, word.Length)

            ns.Close()
            client.Close()

        End While

        listener.Stop()

    End Sub

End Module

---------------------------------------------------------------------------------------------------
しかし、上のコードでは一つの送受信が行われている時には、他の接続を受け付けることができません。
これでは、複数の人が同時に使用するWEBサーバーとしては失格です。

次が複数のブラウザと同時に送受信可能なようにスレッド化したものです
エラー処理は行われておりません。
---------------------------------------------------------------------------------------------------

Module Module1

    Sub Main()
        Const portNum As Integer = 1000 '待機するポート番号を指定
        Dim listener As New System.Net.Sockets.TcpListener(portNum)
        listener.Start()

        While True
            Console.Write("Waiting for connection...")
            Dim client As System.Net.Sockets.TcpClient = listener.AcceptTcpClient()
            Dim Connect As New ServerThread(client)
        End While

        listener.Stop()

    End Sub

End Module
Class ServerThread
    Private client As System.Net.Sockets.TcpClient

    Public Sub New(ByVal clientPos As System.Net.Sockets.TcpClient)
        client = clientPos
        Dim t As New System.Threading.Thread(AddressOf run)
        t.Start()
    End Sub

    Public Sub run()
        Console.WriteLine("Connection accepted.")
        Dim ns As System.Net.Sockets.NetworkStream = client.GetStream()

        Dim ThisMoment As Date
        ThisMoment = Now  ' Assign current system date and time.
        Dim TimeString As String = ThisMoment.TimeOfDay.ToString
        Dim str As String

        ''----ヘッダー受信部分----
        Dim getWord(1024) As Byte
        Dim bytesRead As Integer = ns.Read(getWord, 0, getWord.Length)
        Console.WriteLine(System.Text.Encoding.Default.GetString(getWord, 0, bytesRead))

        ''----本文送信部分----
        str = "<html><head><META HTTP-EQUIV=""Refresh"" CONTENT=""1""> </head><body>ただいまの時刻は " + TimeString + "</body></html>"
        Dim word As Byte() = System.Text.Encoding.Default.GetBytes(str)
        ns.Write(word, 0, word.Length)
        ns.Close()
        client.Close()
    End Sub
End Class




▲トップページ > Visual BASIC と C#