ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

Javaネットワークプログラミング(Socket,URLConnection)

 JavaでSOCKETやURLConnectionを使った簡単なプログラムを参考に、Javaのネットワークプログラミングについて解説します。

Javaでブラウズ

 JavaのSOCKET機能を使って、Webサーバのソースデータを取得するサンプルソースです。 指定したURLのHTTPヘッダとHTMLソースを表示します。
 PerlでブラウズのJava言語版です。 正規表現を利用するため、OROパッケージが必要です。

 SOCKET機能は、java.net.*にありますので、java.net.*をimportします。 また、SOCKETデータは、ストリームとして扱うため、java.io.*もimportします。 データ転送の効率を考えて、BufferReader, BufferWriterを使っています。
 Socketオブジェクトを作成し、入出力バッファを関係付けます。 HTTPプロトコルに基づいて、GETコマンドをBufferWriterに出力すると、BufferReaderにソースが返却されます。 BufferWriterに出力する場合は、最後にバッファをflushする必要があります。
 以下のソース(Http.java)を入力してください。

Http.java
import java.io.*;
import java.net.*;
import org.apache.oro.text.perl.*;

/** Httpプロトコルによるソース表示 **/
public class Http {
  public static void main(String args[]) {
    String url;
    String host = "localhost";
    int port = 80;
    String path = "/";

    Socket sock;
    BufferedReader sockin;
    BufferedWriter sockout;
    String str;

    if (args.length > 0) {
      url = args[0];
      Perl5Util re = new Perl5Util();

      // ホスト名、ポート番号、パス名取得
      if (re.match("m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!", url)) {
        if (re.group(3) != null) { host = re.group(3); }
        if (re.group(5) != null) { port = (new Integer(re.group(5))).intValue(); }
        if (re.group(6) != null) { path = re.group(6); }
      }
    } else {
      url = "http://" + host + ":" + port + path;
    }
//  System.out.println("host=" + host + ", port=" + port + ", path=" + path);

    try {
      // ソケットの作成
      sock = new Socket(host, port);
      sockin = new BufferedReader(new InputStreamReader(sock.getInputStream()));
      sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));

      // HTTPリクエスト送信
      sockout.write("GET " + url +" HTTP/1.1\r\n");
      sockout.write("Host: " + host + "\r\n");
      sockout.write("Connection: close\r\n");
      sockout.write("\r\n");
      sockout.flush();

      // HTTPレスポンス受信
      while ((str = sockin.readLine()) != null) {
        System.out.println(str);
      }

      // ソケットのクローズ
      sockout.close();
      sockin.close();
      sock.close();

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

 ソースをコンパイルして実行します。

unix# javac Http.java
unix# java Http http://ash.jp/
HTTP/1.1 200 OK
Date: Fri, 22 Jun 2001 06:43:49 GMT
Server: Apache/1.3.20 (Unix)
Content-Type: text/html
Content-Length: 5752

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html lang="ja">
<head>
.......... (以下略)

URLConnectionでブラウズ

 Javaでは、Web上のデータを簡単にアクセスできるように、java.net.URLConnectionクラスがあります。 HTTP独自の機能を使うためには、java.net.HttpURLConnectionクラスがあります。
 ここでは、HttpURLConnectionクラスを使って、ホームページのソースを表示してみます。
 URLConnectionクラスを使うためには、URLオブジェクトが必要です。 URLオブジェクトの作成方法は、プロキシサーバを使う場合と、使わない場合で異なります。 プロキシサーバを使う場合は、proxyHostとproxyPortに、プロキシサーバのホスト名とポート番号を設定します。
 URLオブジェクトを作成したら、openConnectionメソッドで、URL接続し、setRequestMethodメソッドでGETします。
 レスポンスはInputStreamとして返却されますので、行単位でアクセスするために、BuffredReaderクラスを使い、その内容を表示しています。

HttpUrl.java
import java.io.*;
import java.net.*;

/** Httpプロトコルによるソース表示(HttpURLConnectionクラス利用) **/
public class HttpUrl {
  public static void main(String args[]) {
    String url = "http://ash.jp/";
    String proxyHost = "";
    int    proxyPort = 8080;

    URL urlObj;
    HttpURLConnection urlCon;
    BufferedReader urlIn;
    String str;

    if (args.length > 0) {
      url = args[0];
    }
//  System.out.println("URL: " + url);

    try {
      // URLオブジェクトの作成
      if (proxyHost == null) {
        urlObj = new URL(url);
      } else {
        urlObj = new URL("http", proxyHost, proxyPort, url);
      }

      // URL接続
      urlCon = (HttpURLConnection)urlObj.openConnection();
      urlCon.setRequestMethod("GET");
      urlIn = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));

      // HTMLソースの表示
      while ((str = urlIn.readLine()) != null) {
        System.out.println(str);
      }

      // URL切断
      urlIn.close();
      urlCon.disconnect();

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

 ソースをコンパイルして実行すると、SOCKETを使った場合と同じ結果が表示されます。

unix# javac HttpUrl.java
unix# java HttpUrl http://ash.jp/
HTTP/1.0 200 OK
Date: Fri, 25 Jun 2001 23:33:00 GMT
Server: Apache/1.3.20 (Unix)
Content-Type: text/html
Content-Length: 5752

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html lang="ja">
<head>
.......... (以下略)


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp