ソケット通信を行うには(サーバ編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:Web・通信

ソケット通信を行うには(サーバ編)

【概要】

PROCESSING公式の通信ライブラリを使う事で、簡単にソケット通信が行えるようになります。

ソケット通信には、TCP/IP(ストリーム通信)とUDP/IP(データグラム通信)がありますが、PROCESSINGの通信ライブラリではTCP/IPをサポートしています。

Javaのライブラリなどで1から作ると小難しい(面倒くさい)処理なのですが、PROCESSINGの通信ライブラリを使えば簡単に実現できます。ビバ!。素晴らしい。

一般的に何らかの要求を送る側をクライアント、要求を待ち受けて処理を実行し、その結果を返す側をサーバと呼びます。

(画像URL:illust-AC 様:acworksさん、wayさん)

ここでは、サーバ側の処理を作る方法を紹介します。クライアント側の処理については「ソケット通信を行うには(クライアント編)」記事を参照してください。

サーバ側のソケットは、Serverクラスのインスタンスとして作成します。
Serverクラスの主なメソッドには、以下のようなものがあります。

番号 メソッド 処理概要
1 active() Serverソケットが有効か検査します
2 available() Server側で受信すべきデータがあるか検査します
3 disconnect() 接続されたクライアントソケットを切断します
4 stop() ソケットを切断します
5 write() データを送信します
6 serverEvent() 接続イベントを処理します
7 disconnectEvent() 切断イベントを処理します

なおPROCESSINGの通信ライブラリを使うには、プログラムの先頭に
import processing.net.*;
を記述してください。

 

【詳細】

Serverインスタンス作成

Serverインスタンス作成Server myServer = new Server( PApplet applet, int port ) ;
Server myServer = new Server( PApplet applet, int port, String secondHost ) ;

applet : PAppletインスタンス。通常は this を与える
port : 接続を受け付けるポート番号
secondHost : 複数のNICを搭載している場合、別のホスト名かIPアドレスを与える

クライアントからの要求を待ち受けるポート番号を指定して、サーバ側ソケットを生成します。

ポート番号には、他のサービスと重ならない一意の番号を指定する必要があります。利用できない番号を指定すると、サーバソケット生成時に例外が発生します。

一般的にポート番号は

番号 範囲 説明
1 0–1023 ウェルノウンポート(予約済みポート)
2 1024–49151 登録済みポート
3 49152–65535 プライベートポート

のように区分けされています(参考:wikiペディア:TCPやUDPにおけるポート番号の一覧)。

この中で自由に使って良いのは、49152番以降(OSによっては32768番以降)のプライベートポートエリアとなっています。

以下は5204番ポートで待ち受けを行うサーバソケットの生成例です。

 

ソケットの有効性を確認する

有効性を確認するboolean alive = myServer.active() ;

alive : 有効ならTrue
myServer : Serverインスタンス

サーバソケットが有効(生成できた)場合はTrueが戻されます。

 

受信可能ソケットの有無を検査する

受信可能ソケットの有無を検査するClient conClient = myServer.available() ;

conClient : 受信可能なデータがあるClientインスタンス
myServer : Serverインスタンス

受信可能なソケットがあるか調べます。受信可能な接続済みソケットがある場合、該当データを送ってきたクライアントソケットのインスタンスが戻されます。

受信可能なソケットがない場合は、null が戻されます。

以下はサーバソケットを生成後、受信可能なソケットがあるか調べながら読み取り処理を行う例です。

データの受信は、戻されたClientインスタンスのメソッド(readBytesなど)を利用します。Clientの使い方については「ソケット通信を行うには(クライアント編)」記事を参照してください。

 

送信する

送信するvoid myServer.write( byte[] sendData ) ;

sendData : 送信データ
myServer : Serverインスタンス

接続済みのクライアントソケットにデータを書き込みます。

本メソッドは、該当サーバへ接続済みのすべてのクライアントソケットに対して、データを送信する事に注意してください。

特定のクライアントに向けてデータを送信したい場合は、serverEvent() などで接続してきたクライアントソケットを取得し、該当クライアントに対して write() を行う必要があります。

上記例はマウスクリック時に、その時点で接続済みのすべてのクライアントソケットにデータを送信する例です。

 

ソケットを切断する

ソケットを切断するvoid myServer.stop( ) ;

myServer : Serverインスタンス

待受中のソケットを閉じます。ソケットを閉じると、再度ソケットを生成するまで、そのソケットでの待ち受けを行うことはできません。

ソケットを切断すると、コンソール領域に
Server SocketException: socket closed

のような赤いメッセージが表示されますが、これは異常ではありません。

 

接続イベントを処理する

接続イベントを処理void serverEvent(Server evtServer, Client conClient){ }

evtServer : イベントが発生したサーバソケット
conClient : イベントが発生したクライアントソケット

クライアント側からの接続が発生した場合、serverEvent 関数が呼び出されます。

上記は接続イベントが発生した際に、接続してきたクライアントにデータを送信する例です。

 

切断イベントを処理する

切断イベントを処理void disconnectEvent(Client disClient){ }

disClient : イベントが発生したクライアントソケット

接続済みのクライアントソケットが破棄された場合、disconnectEvent 関数が呼び出されます。

 

【関連記事】

 


サンプルプログラム

イメージを送信する例:

接続があったクライアントに、イメージデータを送信します。

<出力サンプル>

(画像URL:illust-AC 様:くみた柑さん)

対応するクライアント側のサンプルは、以下のようになります。利用しているクライアントソケット命令の詳細については、「ソケット通信を行うには(クライアント編)」記事を参照してください。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。