コメント |
http://lightbox.cocolog-nifty.com/photos/_app002/vb_tcplistener.jpg
※ telnet で接続すると、タイプした文字がすぐ表示されます
@DIV
' ********************************************************
' 送ったデータを表示する http サーバー
' http://pc名/文字列 で結果を表示
' http://pc名/quit で終了
' ********************************************************
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Diagnostics
Imports System.Threading
Module MyModule
' ********************************************************
' 【2010/06/23】
' Expires: -1 でキャッシュ制御( ブラウザ用 )
' データ表示を受信全体から一気に表示
' バッファを 1024 から 4096 に変更
' 使用ポートを第一引数に指定可能
' サーバーがすべてのネットワークインターフェイスで
' クライアントによるネットワーク利用を待機する
' ********************************************************
Sub Main()
Dim argv As String()
' デフォルトは 50000 番ポート使用
Dim port As Int32 = 50000
' コマンドラインの取得
argv = System.Environment.GetCommandLineArgs()
' 引数が1つの場合のみポートとみなす
if argv.Length = 2 then
Try
port = Integer.Parse( argv(1) )
Catch ex As Exception
' 入力値不正時は 49999
port = 49999
End Try
end if
Console.WriteLine( "port : " + port.ToString() )
Dim server As TcpListener = Nothing
' 固定出力用
Dim header As String = _
"HTTP/1.1 200 OK" + ControlChars.CrLf _
+ "Expires: -1" + ControlChars.CrLf + ControlChars.CrLf + "response:OK" _
+ ControlChars.CrLf
Dim GetCommand As String = ""
Try
' ********************************************************
' サーバーのインスタンスを作成
' IPAddress.Any で全てのインターフェイスで待機
' ********************************************************
server = New TcpListener(IPAddress.Any , port)
' サーバー開始
server.Start()
' 読み込みバッファ
Dim bytes(4096) As Byte
' コマンドワーク
Dim data As String = Nothing
Dim bEnd As Boolean = False
Do While True
' 接続待ち
Console.WriteLine( ControlChars.CrLf + ControlChars.CrLf + "Waiting ... ")
' 待機( 接続されると次の行へ )
Dim client As TcpClient = server.AcceptTcpClient()
' 受信したので処理開始
Console.WriteLine("Connected")
Console.WriteLine("-----------------------------")
data = ""
' 受信用ストリーム
Dim stream As NetworkStream = client.GetStream()
Dim i As Integer
' **************************************************
' ストリームからデータを取得( 初回 )
' bytes : 4096
' **************************************************
i = stream.Read(bytes, 0, bytes.Length)
Console.WriteLine("== data length : " + i.ToString() + " ==" )
Do While i <> 0
' **************************************************
' 読み出したデータを全て表示( 日本語は UTF8として )
' **************************************************
Console.Write(Encoding.UTF8.GetString(bytes, 0, i))
' 最大4096バイトの処理
For idx As Integer = 0 To i - 1
' Windows 改行の1バイト目はよみ飛ばし
If bytes(idx) = &HD Then
Continue For
End If
' 改行コード
If bytes(idx) = &HA Then
Dim Command As String() = data.Split(" ")
If Command(0) = "GET" Then
GetCommand = Command(1).Substring(1)
end if
' quit で終了
If GetCommand = "quit" Then
bEnd = True
End If
' 行単位の処理の為の初期化
data = ""
Continue For
End If
' 改行後の最初
data += _
Encoding.ASCII.GetString(bytes, idx, 1)
Next
' 残っているデータをストリームから取得
System.Threading.Thread.Sleep(300)
if stream.DataAvailable then
i = stream.Read(bytes, 0, bytes.Length)
else
i = 0
end if
' 受信ヘッダ完了
If i = 0 Then
Console.WriteLine( "== data end ==" )
' OK を返す
Dim msg As Byte() = _
Encoding.GetEncoding(932).GetBytes( _
header + GetCommand + " ----- OK" + ControlChars.CrLf )
stream.Write(msg, 0, msg.Length)
GetCommand = ""
Exit Do
Else
Console.WriteLine("== data length : " + i.ToString() + " ==" )
End If
Loop
' 処理終了で接続解除してサービス終了
client.Close()
' quit で終了
If bEnd Then
Exit Do
End If
Loop
Catch ex As SocketException
Console.WriteLine("SocketException: {0}", ex)
Finally
server.Stop()
End Try
End Sub
End Module
@END
|