資料館/ネトゲ製作/006.5

Last-modified: 2009-01-13 (火) 07:22:22

HTTPについて少し学ぶ

さて、CGIとHSPを連携させるには、HTTPを使うのが手っ取り早いだろう。知ってのとおり、HTTPはインターネットを見るときに使うプロトコルの一種であり、URLにも名前が登場している。ブラウザのアドレスバーの先頭にはhttp:~と書かれていることだろう。


つーわけでもはや世間の常識といった感のあるHTTPだが、こやつは一体ナニヤツであるのか。まずはそれを適当に学習しよう。ナニ?早くプログラムの話に移れ?じゃあ俺が頑張って色々作ってる間、ひろあきの相手でもして時間を潰しててくれ。
Wikipediaで検索するとチルドレン達の頭がブッ飛びそうな小難しい事が書いてあったので、一応貼っておく。*1

HTTPとはなんぞ

HTTPは、最後にPとついている事からもわかるようにプロトコルの一種だ。プロトコルについて説明したのかしてないのか忘れたが、用はpack命令のフォーマットのように、どのようなデータ形式で通信するのかお互いに定めたものを、プロトコルと呼ぶ。ブラウザとWEBサーバーが、HTTPという共通の取り決めを利用する事により、データが送受信できるようになるわけだ。

HTTPの中身

HTTPは、基本的にテキスト通信によって成り立っている。*2決められた書式でテキストをサーバーに送信すると、サーバーがレスポンスを返す。WEBページのアドレスを送信すると、そのページのソースをテキストで返してきたりする。


ココでまとめる。少し日本語が難しいが、HTTPは以下のようなとりきめの事だ

  • 決められた書式のテキストを送信すると、サーバーがレスポンスを返してくれる

ここで重要なのが、送受信についての取り決めがなされていない。どうにかしてテキストを送信すれば、サーバーが反応してくれるが、こうやってテキストを送信しろ、という風な定義がここでは出てきていない。
そこで、HTTP通信は、通常TCP通信を利用してサーバーとデータをやり取りする。プロトコルの階層化というのだが、途中を省いて流れを説明すると

  1. アプリケーションがHTTPでデータを送信しようとする
  2. HTTPの取り決めに従ってまとめられたデータを、TCPによって送信する
  3. サーバーから何らかのデータがレスポンスされる
  4. 受信したデータを、HTTPの取り決めに従って解釈して処理する

となる。途中の階層をぶっ飛ばしたが流れはこんな感じだ。つまりHTTPはアプリケーション~自分のLANカードくらいまでの範囲で使用される取り決めであり、そこから相手のLANカードまではTCPの担当する部分、という感じが何となくわかるだろうか。こんな風にデータを送受信する際に、各プロトコルごとに担当する階層が異なっている。*3


まあ小難しい事はわからなくても、HTTP通信はTCP通信が出来なければ不可能だという事が理解できれば良い。

HTTP通信してみる

HTTP通信はTCP通信が出来なければ不可能だ、という事は屁理屈を言えば、TCP通信が出来ればHTTP通信は可能だ、という事になる。そうだろ兄弟。決められた書式で、サーバーにテキストが送れりゃあいいんだからよう。
テキストの送信なんてのは俺達の得意技じゃないか。だってチャットシステムを2個も作ったんだもん。つーわけでその、決められた書式というやつに従ってサーバーにテキストを送りつけてみよう。


Wikipediaに記載されていた例を、PCBNet2を用いてやってみる事にする。

#include
	tcpopen googlesocket,"www.google.co.jp",80;Google先生に接続する
	repeat
		tcpiscon googlesocket
		if stat=1:mes "googleに接続しました":break
		if stat=2:dialog "えろあ":end
		await 10
    loop
    tcpput "GET /index.html HTTP/1.0\n\n",googlesocket
    mes "めんどくさいので3秒くらい待つ";データを受信しきるまで待つ
    repeat 3
    	mes 3-cnt
    	wait 100
    loop
	tcpcount datasize,googlesocket;受信したサイズを調べる
    sdim recivedata,datasize;領域の確保
    mes ""+datasize+"バイト受信"
    tcprecv recivedata,0,datasize,googlesocket;データを受信する
    tcpclose googlesocket
    mes recivedata

えー、まず2行目で、みんなのアイドルGoogle先生へ接続する。HTTPではポート80番がデフォルトになっている。IPアドレスがGoogleのアドレスに変わっただけで、接続処理は特別変わっていない事がわかる。
接続チェックが終わったら、決められた書式というヤツの登場だ。今回はGoogleのサーバーに対して

  • HTTP1.0を利用して、www.google.co.jp/index.htmlのソースをおくれ

というような要求を送信する。すぐさまデータが送り返されてくるだろうが、一応3秒ほど待ってから受信処理を入れて、受信データを表示して終了するだけの、WEBブラウザの最も単純なモノが出来上がった。
サンプルをコピペしてIEを呼び出して「じさくぶらうざです><」と言っているチルドレン達にとってはこれですら感動モノだろう。つまりWebブラウザの中では、アドレスバーに入力されたアドレスを解析して、GET~というテキストをサーバーに送信して、という風に、これと全く同じ事が起こっているわけだ。


ちなみに受信したデータをテキスト形式で、名前をなんちゃら.htmlとして保存すれば、きちんとWebページとして見れる。画像は気にするな。

このソースを見てくれ、こいつをどう思う・・・?

すごく・・・長いです・・・
高々ページ一枚の受信に随分と手間取ったな。さらに、サーバーはテキストを返信した段階で接続を勝手にぶった切り、初期状態に戻ってしまう。そのため別のファイルを受信するには、もう一度この手順を踏まねばならない。めんどくさいことこの上ない。

HSPINETを使ってラクをする

HSP付属のライブラリ、HSPINETは、HTTP通信を蝶☆簡単に実現してくれるナイスな友達だ。使い方はF1を連打しながら勉強しよう。これ単体で通信できるので、ただ単に通信するだけならPCBnet2は不要だ。
参考までに、HSPINETを用いて、さっきと同じようにGoogleにindex.htmlを要求してみよう。あまりの簡単さにおったまげても知らんぜよ。

#include
	netinit
	neturl "http://www.google.co.jp/"
	netload "index.html"
	end

以上終わり。
ただ、問答無用でHTMLファイルとしてカレントディレクトリに保存してしまうので、加工したり処理したりといった場合には読み込みなおす必要もある。自由に処理したいがために上に書いたような処理を自分で書くか、ラクをしてHSPINETに投げるか、難しいところだ。

まとめ

HTTPについてのあらましを説明した。
HTTPはこのほかにも「データxxを処理して結果を返してくれ」といったような処理が出来たり色々楽しい。これを利用して、次回は受信して処理する側を作成する。
HSPでもCGIは作成可能で、本なども出ているが、実際に購入した人間からみればまあロクなもんではない。コドモの絵本程度の内容だが、コドモのオモチャにサーバーPCは代価が大きすぎねえかと小一時間問い詰めたい。レンタルサーバーをどっかで借りてそこにプログラムを設置する形になるが、HSPが利用可能なレンタルサーバーがあったら有料サーバーでもいいので教えてください。何処でも使えるであろうという事でPHPかPerlを選択する事になるだろう。筆者はどっちもおしりかじり虫なのでどちらでもよかったのだが、手元にタマタマPerlの本があったのでそれを使うことになるだろう。


*1 Hypertext Transfer Protcol
*2 実際にはバイナリデータも可
*3 詳しく知りたい場合はOSI参照モデル。HTTPはアプリケーション層、TCPはトランスポート層に属する