httpクライアントを作ってみる

※ なにひとつHTMLレンダリングしません。

txtAddress に ホスト名を入れて、これを実行すると、txtHeader, txtBody にそれぞれレスポンスが入ります。

       ' 指定したホストの80番ポートにつなげて "GET / HTTP/1.1" を送信し、
        ' 受信したデータを、ヘッダ部とボディ部と分けて、テキストボックスに書き出します。

        '  ソケットをTCP/IPで作成
        '  UDP/IP の場合は SocektType を Dgram にする(はず)
        Dim socket As New System.Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.IP)

        ' ホスト名からIPアドレス取得
        ' 存在しないホスト名を探そうとした場合、例外発生
        Dim hostEntry As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(txtAddress.Text)

        ' 面倒くさいから、リストのうち先頭のIPアドレスを取得
        Dim addr As System.Net.IPAddress = hostEntry.AddressList(0)

        ' IPアドレス と ポート(80) をセットにしたオブジェクト生成
        Dim endpoint As System.Net.EndPoint = New System.Net.IPEndPoint(addr, 80)

        ' endpoint をもとに、ソケット生成
        socket.Connect(endpoint)

        ' ストリーム生成
        Dim stream As New System.Net.Sockets.NetworkStream(socket)

        ' stream から StreamWriter 生成
        Dim writer As New System.IO.StreamWriter(stream)

        ' サーバに送る場合の改行記号は vblf = &h0A と指定
        ' Windows系はデフォルトでは &h0c, &h0a の2バイト
        writer.NewLine = vbLf

        ' GETコマンド送信
        writer.WriteLine("GET / HTTP/1.0")

        ' Agent等のフィールドを送信
        writer.WriteLine("Agent: test")

        ' 空白行を1行入れるとヘッダ部終了
        writer.WriteLine()

        ' 念のためフラッシュ
        writer.Flush()

        ' stream から StreamReader 生成
        Dim reader As New System.IO.StreamReader(stream)

        ' 状態
        '  0 : ヘッダ部を読んでいる
        '  1 : ボディ部を読んでいる
        Dim st As Integer = 0
        Do
            Dim str = reader.ReadLine()
            If str Is Nothing Then
                Exit Do
            End If

            Select Case st
                Case 0
                    ' ヘッダ部を読んでいる
                    ' 空白行が出たら、次の行からボディ部
                    If str = "" Then
                        ' ボディ部を読んでいる状態に遷移
                        st = 1
                    Else
                        ' テキスト追加
                        txtHeader.Text = txtHeader.Text & str & vbCrLf
                    End If
                Case 1
                    ' ボディ部を読んでいる
                    ' テキスト追加
                    txtBody.Text = txtBody.Text & str & vbCrLf
            End Select

        Loop

        socket.Close()