ここではTCP/IPの通信について説明します。TCP/IPはいわゆる電話の通信のように、自分と相手の2つの
マシンが双方向で行う通信です。送ったデータは欠如したり、間違えて伝わったり、順番が入れ替わることは
ありません。しかし、瞬時に到達することは保証されていません。
これに対して、UDP通信は携帯電話のパケット通信のような物で、間違えて到達することはないものの、
データが欠如したり、先に送ったデータが後に送ったデータよりも遅くに到達してしまうことがある通信
プロトコルです。そのかわりTCP/IPに比べて不可が非常に少ないというメリットもあります。これについては
後述します。
TCP/IP通信を行うためにはSocketというクラスを利用します。クライアントは接続したい
サーバー名とポート(サーバーには1〜65535のポートがあります)番号を指定してSocketインスタンスを
作り、通信を行います。もう少し詳しく説明すると下記のようになります。
- サーバー
- ServerSocketクラスのインスタンスを作る
- クライアントからのアクセスを待つ(acceptメソッド)
- クライアントからのアクセスがあるとSocketクラスのオブジェクトが返ってくる
- Socketクラスからストリームを得る(getInputStream, getOutputStreamメソッド)
- 必要ならば他のストリームにつなげる
- 通信を開始する
- Socketをクローズする(closeメソッド)
|
- クライアント
- サーバー名とポート番号を指定してSocketインスタンスを作る(接続する)
- Socketクラスからストリームを得る(getInputStream, getOutputStreamメソッド)
- 必要ならば他のストリームにつなげる
- 通信を開始する
- Socketをクローズする(closeメソッド)
|
サーバーは通常、複数のクライアントからアクセスされます。したがって上述のサーバーのフローだと、
1つのクライアントが接続したら、次のクライアントは接続できなくなってしまいます。このような場合は、
クライアントが接続されたら新しくスレッドを立ち上げ、新しいスレッドで通信を開始し、自分のスレッドは
すぐに次のクライアントに向けてアクセスを待ちに行くようにします。これに関しては
2つめのサンプルプログラムで説明します。
import java.net.ServerSocket |
メソッド |
Socket |
accept() throws IOException
|
- コンストラクタで指定したポートでクライアントからの接続を待ちます。
- 入出力エラーが発生するとIOExceptionが投げられます。
- セキュリティ上問題があるとSecurityExceptionが投げられます。
- setSoTimeoutでタイムアウト時間を設定している場合で、そのタイムアウト時間になった場合はJavaのバージョンによって異なりますが、InterruptedIOExceptionやSocketTimeoutExceptionが投げられます。
- 別スレッドでcloseメソッドが呼ばれるとSocketExceptionが投げられます。
|
|
void |
close() throws UnknownHostException
|
- このサーバーソケットをクローズします。
- 他のスレッドなどでacceptメソッドが呼ばれブロッキング中の場合は、SocketExceptionが発生して、ブロッキングから抜け出します。
|
|
InetAddress |
getInetAddress()
|
int |
getLocalPort()
|
void |
setSoTimeOut(int msec) throws SocketException
|
- acceptのタイムアウト時間をミリ秒で設定します。
- 0を与えると、無限に待ちます。
- 実際に正確にmsecで設定した値となるかは保証されません。例えばWindowsではOS自体が10ミリ秒単位でしかカウントしていないため、例えば8を与えても実際は10ミリ秒となります。
- ソケットに異常がある場合はSocketExceptionが投げられます。
|
|
int |
getSoTimeOut() throws IOException
|
- acceptのタイムアウト時間を取得します。
- 0が返されると、無限に待つことを意味します。。
- 入出力に失敗するとIOExceptionが投げられます。
|
|
Socket(String address, int port) throws IOException, UnknownHostException
|