コンポーネントやクラスを活用
ソケットを利用したプログラミングの実際を見てみよう。ソケットを使って,ネットワークを介してサーバー・アプリケーションの状態を変化させるプログラムを作成した。サーバー側は単純に,1033番ポートを空けてある。ここに色のメッセージ「Blue」「Red」「Yellow」のいずれかが到着したら,その内容に応じて表示色を変えるというものだ。この規則がアプリケーション・レベルのプロトコルである。
サーバー・アプリケーションはDelphiを使って作成した。Delphiの場合,クライアント用ソケットとサーバー用ソケットでそれぞれコンポーネントが用意されている。サーバー用の場合,通信を開始するとリクエストが入ってくるのを待つ状態になる。クライアント用の場合は,通信を開始するとセッションを確立しにいくというのが大きな違いである。まずサーバーを作る段階では,ServerSocketのコンポーネントを貼り付け,接続待ち状態にする(Startボタン),接続を停止する(Stopボタン)を付ける。後は状態を確認するために,表示用のエリアを作っただけである。
骨格部分は,ソケットの状態変化に伴うイベントの処理である(リスト2[拡大表示])。前述のようにDelphiのソケットは,データを受信したときを初めとして,さまざまなイベントが発生する。クライアントからデータ要求リクエストがあったら,現在の状態を返す部分と,データを受信してその内容に応じて正しいデータだったら「ack」を返し,状態をセットする部分を作ってある。実に単純だ。
クライアント部分も似たようなものである。ClientSocketコンポーネントを使っていることと,ボタンをクリックしたらラジオボタンの状態を取得してそれに対応した値を送るだけである(リスト3[拡大表示])。なお,受信したデータはバッファから別途取り出している。この組み合わせで,ソケットコンポーネントに処理を依頼すれば簡単に通信プログラムが作れるのだ(写真2[拡大表示])。
|
|
ただこのままでは同じパソコンで動いていてつまらないので,ソケットを使えばOSや言語処理系に依存しないことを示そう。Javaを使って同じクライアントのプログラムを作成した。1枚の画面で動いているが,Windowsで動作するXサーバー・プログラムを使ってリモートのLinuxにログインしている。そこで実行しても全く同じように動作する(写真3[拡大表示])。
![]() |
リスト4●Javaで記述したクライアントの一部 Socketクラスのオブジェクトを利用している。 |
Javaの場合は,Socketクラスのオブジェクトを使う(リスト4[拡大表示])。ここでは受信はあまり発生しないので,スレッドに分けてない。データをシリアライズしてストリームにして,ソケットに流すだけだ。
「自分で何か決めてやり取りするなら,ソケットを使えばいいってことですね」
「通信は相手あってのものだから,ちゃんと約束事を決めておいて,それをきっちり守ることが大事だよね」
「でもWebとかFTPとかもやっぱり,ソケットを使ってるんですよね」
「そうだよ」
「じゃぁ,ソケットを使って同じ手順を再現できれば,まったく新しい解釈のWebブラウザを作ったりできるってことですね」
「まあその通りだけど,それならHTTPプロトコルのコンポーネントを使った方がいいよ」