JavaでSOCKETやURLConnectionを使った簡単なプログラムを参考に、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> .......... (以下略) |
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> .......... (以下略) |