コンポーネントやクラスを活用

 ソケットを利用したプログラミングの実際を見てみよう。ソケットを使って,ネットワークを介してサーバー・アプリケーションの状態を変化させるプログラムを作成した。サーバー側は単純に,1033番ポートを空けてある。ここに色のメッセージ「Blue」「Red」「Yellow」のいずれかが到着したら,その内容に応じて表示色を変えるというものだ。この規則がアプリケーション・レベルのプロトコルである。

 サーバー・アプリケーションはDelphiを使って作成した。Delphiの場合,クライアント用ソケットとサーバー用ソケットでそれぞれコンポーネントが用意されている。サーバー用の場合,通信を開始するとリクエストが入ってくるのを待つ状態になる。クライアント用の場合は,通信を開始するとセッションを確立しにいくというのが大きな違いである。まずサーバーを作る段階では,ServerSocketのコンポーネントを貼り付け,接続待ち状態にする(Startボタン),接続を停止する(Stopボタン)を付ける。後は状態を確認するために,表示用のエリアを作っただけである。

 骨格部分は,ソケットの状態変化に伴うイベントの処理である(リスト2[拡大表示])。前述のようにDelphiのソケットは,データを受信したときを初めとして,さまざまなイベントが発生する。クライアントからデータ要求リクエストがあったら,現在の状態を返す部分と,データを受信してその内容に応じて正しいデータだったら「ack」を返し,状態をセットする部分を作ってある。実に単純だ。

リスト2●ソケットを通じてデータを取得する部分
クライアントからデータを受け取ると,ReceiveStatusメソッドが呼び出されるようイベントと関連づけられている。ここでデータを取得すればよい。同様にデータ要求を受け取ったら,現在のステータスを返すようにしている。
 
リスト3●ソケットを通じてデータを送信する部分
ラジオボタンの状態に応じて適切なデータを送信している。この「適切な」データを送る部分が,プロトコルに準拠している点である。

 クライアント部分も似たようなものである。ClientSocketコンポーネントを使っていることと,ボタンをクリックしたらラジオボタンの状態を取得してそれに対応した値を送るだけである(リスト3[拡大表示])。なお,受信したデータはバッファから別途取り出している。この組み合わせで,ソケットコンポーネントに処理を依頼すれば簡単に通信プログラムが作れるのだ(写真2[拡大表示])。

写真2●ネットワークを介して通信するプログラム
左がクライアントで右がサーバー。クライアントで設定ボタンを押すと,サーバーの状態が変わる。
 
写真3●Javaを使って同じ動作をするプログラムを作成
リモートで動作するコンピュータを,Xサーバーを使って操作している。ここでJavaのプログラムを動作させている。

 ただこのままでは同じパソコンで動いていてつまらないので,ソケットを使えばOSや言語処理系に依存しないことを示そう。Javaを使って同じクライアントのプログラムを作成した。1枚の画面で動いているが,Windowsで動作するXサーバー・プログラムを使ってリモートのLinuxにログインしている。そこで実行しても全く同じように動作する(写真3[拡大表示])。

リスト4●Javaで記述したクライアントの一部
Socketクラスのオブジェクトを利用している。

 Javaの場合は,Socketクラスのオブジェクトを使う(リスト4[拡大表示])。ここでは受信はあまり発生しないので,スレッドに分けてない。データをシリアライズしてストリームにして,ソケットに流すだけだ。

「自分で何か決めてやり取りするなら,ソケットを使えばいいってことですね」
「通信は相手あってのものだから,ちゃんと約束事を決めておいて,それをきっちり守ることが大事だよね」
「でもWebとかFTPとかもやっぱり,ソケットを使ってるんですよね」
「そうだよ」
「じゃぁ,ソケットを使って同じ手順を再現できれば,まったく新しい解釈のWebブラウザを作ったりできるってことですね」
「まあその通りだけど,それならHTTPプロトコルのコンポーネントを使った方がいいよ」

(北郷 達郎、八木 玲子)