第8講:サーバ・クライアント間の通信を行う |
その1 Javaプログラムにおける通信のしくみを理解する |
ここでは「通信の準備」と「通信の実行」の2段階に分けて、通信を行うプログラムの作成に不可欠な概念の解説と実際に使用するクラスの紹介、その利用方法の説明を行います。 |
(1)通信の準備 プログラム同士が通信を行うというのは、たとえば片方のプログラムが送信した「こんにちは」という文字列が、もう片方のプログラムによって受け取られディスプレイに表示される、というような状況を指しています。基本となるのは複数のプログラム同士での「データの送受信」です。 ここでは二つのプログラムがそれぞれ「サーバ」と「クライアント」として通信する場合を考えてみます。 双方がデータのやりとりを行う場合、双方を結んで情報を運ぶための「線」が必要となります。Javaにおいてはこの「線」のことを「Socket(ソケット)」という概念で表します。「Socket」は逆方向の情報の流れ(Stream)をもつ二本の通信線を一本に束ねたものだと考えられます。仮にAとBという二つのプログラムが通信を行うとすれば、一方の通信線がAにとっての「InputStream」でありかつBにとっての「OutptStream」、もう一方の通信線はAにとっての「OutputSteam」かつBにとっての「InputStream」となるわけです。この2本の通信線を束ねる「Socket」を介して情報のやりとりが行われるのです。
通信をはじめる一番最初の段階では、まだこの「Socket」は二つのプログラムを結んでいません。クライアント側からサーバ側に向かって「Socket」が送り込まれて、初めて通信が開通します。クライアントがサーバに「Socket」を送り込むことを、一般に「接続要求を送る」といいます。 クライアントが「Socket」を送り込む際には、必ず「どのサーバコンピュータ」の「何番の通信口」に向かって送り込むのかを明らかにしなければなりません。その際の「どのサーバコンピュータ」のことを一般に「サーバ名」、「何番の通信口」のことを「ポート番号」、と呼びます。サーバには複数の「通信口=ポート」があり、番号で管理しています。サーバの側は、プログラムによって決まった番号のポートを監視しています。クライアントはサーバが監視するポート番号に「Socket」を送らなければなりません。 無事にサーバに「Socket」が受け取られて、はじめて通信の準備が完了します。 つぎに、これらの手順を実現するJavaのクラスに関する説明です。この「通信の準備」を行うに当たっては、「java.net.パッケージ」に用意されている次の二つのクラスを利用します。
この二つのクラスを用いて行われる通信の準備の状況を、時系列的に図式化すると次のようになります。図は右に向かって時間が進行してゆくものとしています。
|
(2)通信の実行 通信の準備が終わったら、次は実際にデータのやりとりを行います。データのやりとりはサーバ、クライアント双方を結ぶSocketを介して行います。先ほど説明したとおり、Socketには通信を行う双方のプログラムにとっての入力の流れ(InputStream)、出力の流れ(OutputStream)が用意されています。データを通信したい場合にはOutputStreamを、受信したい場合にはInputStreamを、それぞれ取得し、そこにデータを書き込む(送信)/そこからデータを読み込む(受信)ことで、通信が行われます。つまり、Socketが開通した後は、
というような命令を実行することで通信が実行されるわけです。 それでは、それぞれを行うためにはどのようなクラスとメソッドを利用すればよいのでしょうか。この場合、送受信するデータの型によって利用すべきクラスが異なってきます。ここでは「時間割表示システム」の実現を想定しています。通信されるデータは「授業の情報」、すなわちClassTableのインスタンスです。そこで、「ある任意のクラスのインスタンスを自由に送受信できる」ことを前提に、利用するクラスを解説します。
ということで、このつぎでは「通信の準備」「通信の実行」を用いて簡単なクライアント・サーバの通信を行うサンプルプログラムを作成します。 |
リンク: <全体のトップページ> | <第8講のトップページ> |-------------------------| <第8講・その1> <第8講・その2>