ソケット通信を行うには(クライアント編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:Web・通信

ソケット通信を行うには(クライアント編)

【概要】

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

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

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

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

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

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

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

番号 メソッド 処理概要
1 active() Clientソケットが有効か検査します
2 available() Client側で受信すべきデータがあるか検査します
3 readBytes() 受信したデータをByte配列に読み取ります
4 readString() 受信したデータをStringとして読み取ります
5 readStringUntil() 受信したデータを指定サイズだけ、Stringとして読み取ります
6 write() データを送信します
7 stop() ソケットを切断します
8 clientEvent() 受信イベントを処理します

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

 

【詳細】

Clientインスタンス作成

Clientインスタンス作成Client myClient = new Client( PApplet applet, String ipAddr, int port ) ;

applet : PAppletインスタンス。通常は this を与える
ipAddr : 接続先のサーバIPアドレス
port : 接続先のサーバポート番号

接続先となるサーバIPアドレスとポート番号を指定して、クライアント側ソケットを生成します。

IPアドレスにはdot(.)区切りのIPv4形式のアドレスを指定します。

クライアント側ソケット生成時に、サーバ側で待ち受けの準備ができていない場合やIPアドレスが不正な場合は、例外エラーが発生します。

以下はローカルホストの5204番ポートへ接続するクライアントソケットの生成例です。

 

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

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

alive : 有効ならTrue
myClient : Clientインスタンス

クライアントソケットが有効(生成できた)場合はTrueが戻されます。

 

受信可能データの有無を検査する

データの有無を検査するint bytes = myClient.available() ;

bytes : 受信可能なデータのバイト数。0ならデータなし
myClient : Clientインスタンス

受信可能なデータがあるか調べます。受信可能なデータがある場合、そのバイト数を戻します。0なら受信可能なデータが無いという事になります。

以下はクライアントソケットを生成後、受信可能なデータがあるか調べながら読み取り処理(後述)を行う例です。

 

バイトデータを受信する

バイトデータ受信int recvSize = myClient.readBytes( byte[] recvData ) ;
byte[] recvData = myClient.readBytes( maxSize ) ;

recvSize : 受信したデータサイズ
recvData : 受信用のbyte配列
myClient : Clientインスタンス
maxSize : 一度に受信する最大バイトサイズ

受信したデータをbyte配列として取り出します。

受信する方法は大きく2種類あります。1つは予め受信用のbyte配列を用意しておき、そこに受信する方法です。

もう1つは1度に受信する最大サイズを決めておいて、受信結果をbyte配列として受け取る方法です。

上記は受信データがある場合、1回の受信(readBytes)で最大1024バイトのデータを受け取る例です。

もしも受信したデータがmaxSize(この例では1024)バイト以上ある場合は、複数回に分けて受信されます。

全データサイズ(available()で得られたサイズ)を指定して受信した場合は、すべてのデータが一度に受信されます。

 

文字列データを受信する

文字列データを受信するString recvData = myClient.readString( ) ;

recvData : 受信した文字列
myClient : Clientインスタンス

受信したデータを文字列として取り出します。

この命令は受信する文字列がASCIIであると仮定して動作しています。送信側がPROCESSING以外の場合は、本命令で文字列を受信するためには、送信側で文字列をUTF-8形式のバイト配列として送り出す必要があります。

ただしPROCESSING同士(つまり送信側もPROCESSINGの通信ライブラリ)で文字列を送受信するのであれば、UTF-8形式の文字列を扱う限り、上記のようなことを意識する必要はありません。

上記例は受信データがある場合、任意の文字列データを受け取る例です。

 

決められた位置まで受信する

文字列データを受信するString recvData = myClient.readStringUntil( int interesting ) ;

recvData : 受信した文字列
myClient : Clientインスタンス
interesting :区切りデータ

受信したデータを、区切りデータが見つかった位置まで文字列として取り出します。

このメソッドは、例えば改行コードなどで区切られた一連の文字列を受信したい場合に活用できます。

(画像URL:illust-AC 様:ちょろぎさん)

受信データの中に区切りデータが見つからない場合は、null が戻されます。

ただしnullが戻された場合でも、受信データが破棄されるわけではない事に注意してください。

上記例では、送信側から「くじら\nイルカ\n最後は改行なし」というデータを受信する例です。

<出力例>

最後の文字列(「最後は改行なし」)には改行データが含まれていないため、この部分は readStringUntil() では受信できない事に注意してください。

 

データを送信する

データ送信void myClient.write( byte sendData[] ) ;
void myClient.write( String sendData ) ;

sendData: 送信するデータ
myClient : Clientインスタンス

接続されているソケットに、データを書き込みます。

この命令は、すべてのデータをソケットに書き出すまでBLOCKする事(つまり上位に制御が戻ってこない事)に注意してください。

 

ソケットを切断する

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

myClient : Clientインスタンス

接続されているソケットを閉じます。ソケットを閉じると、そのソケットは再度接続するまで利用できません。

受信可能状態でソケットを切断すると、コンソール領域に
Client SocketException: Socket closed


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

 

受信イベントを処理する

受信イベントを処理するvoid clientEvent( Client someClient ){ }

someClient : データを受信したClientインスタンス

クライアントソケットが何某かのデータを受信した場合、clientEvent 関数が呼び出されます。

関数にはデータを受信したクライアントインスタンスが渡ってきます。

上記は本イベントの利用例です。

前述までのサンプルが draw() 関数の中で受信データを処理していたのに対し、本処理ではclientEvent 関数の中で処理しています。

draw() 関数の中で受信データを処理するよりは、こちらのほうが効率が良いですが、clientEvent 関数はデータを受信するたびに呼び出される事に注意してください。

例えば大きなサイズのデータを受信した場合、データが複数回に分けて分割受信される事があります。その場合は、clientEvent 関数が複数回呼び出されます。

 

【関連記事】

 


サンプルプログラム

イメージを受信する例:

サーバ側からイメージデータを受信し、表示します。

<出力サンプル>

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

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

 


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

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