ネットワークでは「サーバ・クライアントシステム」という方式が使われている。おおざっぱに言うと、「依頼人(Client)が奉仕人(Server)に依頼して(接続して)データをもらったり、与えたりする。」という事である。これが一般的な考え方であるが、分かりにくいのでホームページの閲覧のみに絞って考えると、用は「ブラウザ(クライアント)がサーバっていうどこか遠くで動いているプログラムと交信して、ホームページのデータをもらって来たり、逆にデータ(掲示版の本文とか)を送ったりする。」という事である。この方式の事を「HTTPプロトコル」という。プロトコルとは、「規約」である。こういった通信規約が沢山決められていて、今からやろうとしているのはその内のほんの一つだ。
まず、ブラウザがサーバからデータを取得する手順を踏んでみよう。
例) http://www.home.com/waku/index.html サーバ名:www.home.com ファイル名:/waku/index.html
例) GET waku/index.html この時、最後が/で終わっていても気にせず送る。 例えばhttp://www.home.com/にアクセスしたい場合でも GET /index.html とせずに GET / と送れば良い。
では実際にプログラムを組んでみよう。
まずクラスの外形を作成する。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メソッドに追加していく。
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()を使う。
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をやってメールの送信をマスターし、メーラーを作ってみましょう。
この文章について質問がある方は掲示版まで!