DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

Socketを使ってHTTPでファイルをダウンロードし表示する

Socketクラスを使ってHTTPサーバーにGET要求し、応答を受信する方法を、具体例のみ示します。通常は、「WebRequest、WebResponseクラスを使ってファイルをダウンロードし表示する」のような方法で十分です。説明は一切しませんので、興味のある方のみ参考にしてください。

VB.NET
コードを隠すコードを選択
'GETリクエストを送信するサーバー名とパス
Dim server As String = "www.google.co.jp"
Dim path As String = "/"
'リクエストメッセージを作成する
Dim reqMsg As String = "GET " + path + " HTTP/1.1" + vbCrLf + _
    "Host: " + server + vbCrLf + "Connection: Close" + vbCrLf + vbCrLf
'文字列をbyte配列に変換
Dim enc As System.Text.Encoding = _
    System.Text.Encoding.GetEncoding("shift_jis")
Dim reqBytes As Byte() = enc.GetBytes(reqMsg)

'ホスト名からIPアドレスを取得
Dim hostadd As System.Net.IPAddress = _
    System.Net.Dns.Resolve(server).AddressList(0)
'または
'System.Net.IPAddress hostadd = _
'   System.Net.Dns.GetHostByName(server).AddressList(0)
'IPEndPointを取得
Dim ephost As New System.Net.IPEndPoint(hostadd, 80)

'Socketの作成
Dim sock As New System.Net.Sockets.Socket( _
    System.Net.Sockets.AddressFamily.InterNetwork, _
    System.Net.Sockets.SocketType.Stream, _
    System.Net.Sockets.ProtocolType.Tcp)

'接続
sock.Connect(ephost)

'リクエストメッセージを送信
sock.Send(reqBytes, reqBytes.Length, _
    System.Net.Sockets.SocketFlags.None)

'受信する
Dim resBytes(1023) As Byte
Dim mem As New System.IO.MemoryStream
While True
    Dim resSize As Integer = _
        sock.Receive(resBytes, resBytes.Length, _
            System.Net.Sockets.SocketFlags.None)
    If resSize = 0 Then
        Exit While
    End If
    mem.Write(resBytes, 0, resSize)
End While
Dim resMsg As String = _
    enc.GetString(mem.GetBuffer(), 0, CInt(mem.Length))
mem.Close()

'閉じる
sock.Shutdown(System.Net.Sockets.SocketShutdown.Both)
sock.Close()

'受信したメッセージを表示する
Console.WriteLine(resMsg)
C#
コードを隠すコードを選択
//GETリクエストを送信するサーバー名とパス
string server = "www.google.co.jp";
string path = "/";
//リクエストメッセージを作成する
string reqMsg = "GET " + path + " HTTP/1.1\r\n" +
    "Host: " + server + "\r\n" +
    "Connection: Close\r\n\r\n";
//文字列をbyte配列に変換
System.Text.Encoding enc =
    System.Text.Encoding.GetEncoding("shift_jis");
byte [] reqBytes = enc.GetBytes(reqMsg);

//ホスト名からIPアドレスを取得
System.Net.IPAddress hostadd =
    System.Net.Dns.Resolve(server).AddressList[0];
//または
//System.Net.IPAddress hostadd =
//   System.Net.Dns.GetHostByName(server).AddressList[0];
//IPEndPointを取得
System.Net.IPEndPoint ephost =
    new System.Net.IPEndPoint(hostadd, 80);

//Socketの作成
System.Net.Sockets.Socket sock =
    new System.Net.Sockets.Socket(
    System.Net.Sockets.AddressFamily.InterNetwork,
    System.Net.Sockets.SocketType.Stream, 
    System.Net.Sockets.ProtocolType.Tcp);

//接続
sock.Connect(ephost);

//リクエストメッセージを送信
sock.Send(reqBytes, reqBytes.Length,
    System.Net.Sockets.SocketFlags.None);

//受信する
byte [] resBytes = new byte[1024];
System.IO.MemoryStream mem = new System.IO.MemoryStream();
while (true)
{
    int resSize =
        sock.Receive(resBytes, resBytes.Length, 
        System.Net.Sockets.SocketFlags.None);
    if (resSize == 0)
        break;
    mem.Write(resBytes, 0, resSize);
}
string resMsg = enc.GetString(mem.GetBuffer(), 0, (int) mem.Length);
mem.Close();

//閉じる
sock.Shutdown(System.Net.Sockets.SocketShutdown.Both);
sock.Close();

//受信したメッセージを表示する
Console.WriteLine(resMsg);
  • 履歴:
  • 2006/11/20 データを受信するコードを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。