ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
VB.net : クライアントが送ったヘッダを表示するだけの HTTPサーバーU ( No.0 )
日時: 2010/06/24 21:34
名前: lightbox





※ telnet で接続すると、タイプした文字がすぐ表示されます

拡張子:
' ********************************************************
' 送ったデータを表示する 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