講座3 ホームページへのアクセス



ホームページを観覧するにはどうすれば良いだろうか?「ブラウザで見るに決まってるやんか!!」という声が飛んできそうだが、今回は初めてのネットワークプログラミング講座なのでまず一番易しい、Javaでのホームページアクセスをしてみようと思う。

ネットワークでは「サーバ・クライアントシステム」という方式が使われている。おおざっぱに言うと、「依頼人(Client)が奉仕人(Server)に依頼して(接続して)データをもらったり、与えたりする。」という事である。これが一般的な考え方であるが、分かりにくいのでホームページの閲覧のみに絞って考えると、用は「ブラウザ(クライアント)がサーバっていうどこか遠くで動いているプログラムと交信して、ホームページのデータをもらって来たり、逆にデータ(掲示版の本文とか)を送ったりする。」という事である。この方式の事を「HTTPプロトコル」という。プロトコルとは、「規約」である。こういった通信規約が沢山決められていて、今からやろうとしているのはその内のほんの一つだ。

まず、ブラウザがサーバからデータを取得する手順を踏んでみよう。

  1. ホームページのURLを解析し、http://の後に続く/(スラッシュ)までをサーバ名(ホスト名)として、その後をファイル名として記憶する。
    例)	http://www.home.com/waku/index.html
    	サーバ名:www.home.com
    	ファイル名:/waku/index.html
    
  2. サーバに接続する。(接続といっても近くのアクセスポイントにダイヤルするのではなく、サーバプログラムと物理的に信号をやりとり出来る状態にする事である。)
  3. サーバに"GET "に続いてファイル名を送信する。
    例)	GET waku/index.html
    この時、最後が/で終わっていても気にせず送る。
    例えばhttp://www.home.com/にアクセスしたい場合でも
    	GET /index.html
    とせずに
    	GET /
    と送れば良い。
  4. サーバからデータが送られてくるのでそれを受信する。(ほとんどの人は知っていると思うが、ホームページデータはHTMLで送られてくる。ブラウザで「ソースの表示」を選択すればどんなデータが送られてきたかよく分かる。)
  5. データを解析してグラフィカルに表示する(一般的なブラウザの場合)。
とてもシンプルであるが、この中で5.は個人ではちょっと不可能である。ただ、年月をかければ出来ない事もない。自信のある人はやってみよう。

では実際にプログラムを組んでみよう。
まずクラスの外形を作成する。java.netパッケージにはネットワークのための様々なクラスが用意されている。実はHTTPアクセスを容易にするためのURLクラスという便利なのが提供されているのだが、今回は勉強のためにあえてSocketクラスを使って直接サーバとやりとりする。

import java.net.*;
import java.io.*;
public class WebAccess {
	public static void main(String[] args) throws IOException{
		String url,host,file;
	}
}
ここからは皆mainメソッドに追加していく。
入力はコマンドラインの引数でいいだろうから、args[0]を調べれば良い。

if(args.length>0) {
	url=args[0];
}else {
	System.out.println("引数を入れてください。");
	return;
}
次に1.の処理を行う。最初のhttp://が省略された場合、自動的に付加する機能もつける。

if(!url.startsWith("http://"))
	url="http://"+url;
int j=url.indexOf("/",7);	/* "http://"の次の/の場所を取得 */
host=url.substring(7,j);	/* ホスト名を代入 */
file=url.substring(j);	/* ファイル名を代入 */
次はいよいよ1.サーバに接続する。Socketクラスを使用する。このクラスはコンストラクタの呼び出しと同時に接続をする。第1引数はホスト名、第2引数はポート番号…。えーっ?! 何だって?ポート番号って何!!と困惑ぎみの方も多いだろう。見えないものなので少しこれは理解するのが難しいのだが、複数のプロトコルのサーバプログラムを一台のコンピュータで立ちあげるために作られたものなのだ。一台のコンピュータの中に1から65535くらいまでの番号がつけられていて、サーバプログラムをコンピュータに登録する時に、使われていない番号を選んで起動させる。その番号のうち1から512くらいまではすでに役割が決められていてHTTPサーバは80番となっているのである。実際はコンピュータに穴があいているわけでもないし、あくまでも機械的ではなくソフト的だという事を理解してほしい。
サーバが存在しなかったときのために例外処理もしておく。

Socket sock;
try {
	sock=new Socket(host,80);
}catch(UnknownHostException e) {
	System.out.println("サーバが見つかりません - "+host);
	return;
}
これでsockにはSocketクラスのインスタンスが入っているので、後はファイルのように読み書きすれば良い。入力ストリーム(InputStream)を得るにはgetInputStream()を、出力ストリーム(OutputStream)を得るにはgetOutputStream()を使う。
まず最初に3.のようにGETメッセージを送る。

PrintWriter out=new PrintWriter(sock.getOutputStream());
out.println("GET "+file);	/* この後に続けてHTTP/1.0と送るとそのHTMLの情報も送られてくる */
out.flush();
最後にflushしないとデータが送られないので忘れないように。
そして後はデータを受け取って表示するだけである。

BufferedReader in=new BufferedReader(
			new InputStreamReader(
			sock.getInputStream()));
String dat;
while((dat=in.readLine())!=null)
	System.out.println(dat);
in.close();
out.close();	/* 必ずここでクローズする */
そして最後にソケットをクローズして終了!

sock.close();
完成プログラムはこちら。[ソースコード(WebAccess.java)]

実行する時にはコマンドプロンプトから

java WebAccess http://homepage1.nifty.com/wakuhome/java/
などと入力して試してみてください。

どうでしたか?簡単でしたか?
先に言ったようにこのデータを解析してグラフィカルに表示できるようにするのはかなり大変な事です。しかし腕に自信のある方はぜひ挑戦してみましょう。成功を祈ってます。

次はPOPを予定しています。POPプロトコルはメールの受信に使われています。その後にSMTPをやってメールの送信をマスターし、メーラーを作ってみましょう。

この文章について質問がある方は掲示版まで!


HOME 戻る Copyright © 2000 WakuWaku.All rights reserved.