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