10. UNIXSocket
unixsocketオブジェクトは、UNIXドメインソケットを使用した外部アプリケーション間プロセス通信機能を提供する組み込みオブジェクトです。
機能概要:
- UNIXソケットサーバー機能を提供します。
- UNIXソケットクライアント機能を提供します。
- ソケットタイプは
SOCK_STREAM
(ストリーム指向)となります。 - 任意のパス名を指定可能です。抽象ソケットアドレスも使用可能です。
制限事項:
- 使用可能なUNIXソケットリソースは3本です。
- 1つのUNIXソケットサーバーに接続できるクライアント数は最大3となります。
unixsocket Global Object
Methods()/Properties | Summary | Version | Note |
---|---|---|---|
unixsocket.create() | UNIXソケットインスタンスを生成します。 |
Details
unixsocket.create(mode,path[,options])
UNIXソケットインスタンスを生成します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
mode | string | mandatory | 'server' または'client' を指定します。 | |
path | string | mandatory | ソケットパスを指定します。 例: /tmp/test.unixsocket 抽象ソケットアドレスを指定する場合は、パスの先頭に '@' を挿入します。例: @/tmp/test.unixsocket | |
options | Object | optional | オプション 詳細はOptionsを参照してください。 | |
return | {Server}, {Client}, null | - | {Server} : 生成された{Server} {Client} : 生成された{Client} null : リソース不足でインスタンスの生成が失敗した場合、指定されたパスのインスタンスが既に生成されている場合(サーバー時)、指定されたパスが存在しない場合(クライアント時) | パラメータ異常の場合は例外となります。 |
Options
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
recvBuffSize | number | optional | 受信バッファサイズ[Byte] 設定範囲: 1~2,147,483,647 デフォルト値は4096となります。 |
{Server}
Methods()/Properties | Summary | Version | Note |
---|---|---|---|
.on() | イベントハンドラを登録します。 | ||
.listen() | クライアントのソケット接続待ちを開始します。 | ||
.read() | クライアントから受信したデータを読み出します。 | ||
.write() | クライアントにデータを送信します。 | ||
.isConnected() | ソケットの接続状態を取得します。 | ||
.close() | ソケットを切断します。 | ||
.release() | サーバーリソースを解放します。 |
Details
.on(event,callback)
イベントハンドラを登録します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
event | string | mandatory | イベント名 使用できるイベント名は、accept, readable, closeとなります。 | |
callback() | function | mandatory | イベント発生時にコールバック処理を実行します。 | |
return | undefined | - | - | パラメータ異常の場合は例外となります。 |
event : ’accept’
クライアントがソケット接続した際にコールバック処理を実行します。
Arguments | Type | Summary | Note |
---|---|---|---|
index | number | 割り当てられたクライアントインデックス |
event : ’readable’
ソケット受信バッファにデータが存在する場合、コールバック処理を実行します。
Arguments | Type | Summary | Note |
---|---|---|---|
index | number | イベントが発生したクライアントインデックス |
event : ’close’
ソケット切断が発生した際にコールバック処理を実行します。
尚、ソケット受信バッファにデータが存在する状態でクライアント側からソケット切断された場合、コールバック処理はすぐに実行されません。必ず.read()メソッドで全てのデータを読み出す必要があります。
Arguments | Type | Summary | Note |
---|---|---|---|
index | number | イベントが発生したクライアントインデックス |
.listen()
クライアントのソケット接続待ちを開始します。
本メソッドは、インスタンス生成後に一度のみ実行します。
以降、クライアントが接続する度にクライアント管理番号(クライアントインデックス)が割り当てられます。クライアントインデックスは'accept'イベント通知もしくは.isConnected()メソッドを使用して確認することができます。インデックスは0
~クライアントの最大接続数 - 1
の範囲のうちいずれかとなります。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | boolean | - | true: 成功 false: 失敗 |
.read(index[,isBin])
クライアントから受信したデータを読み出します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
index | number | mandatory | 対象のクライアントインデックスを指定します。 | |
isBin | boolean | optional | 読み出しデータの形式を指定します。 true: バイナリデータ形式で読み出し false: 文字列形式で読み出し デフォルト値はfalseとなります。 | |
return | ArrayBuffer, string | - | 読み出しデータ 戻り値の型はisBinで決定されます。 trueを指定した場合はArrayBuffer型、falseを指定した場合は、string型となります。 | 読み出しデータはrecvBuffSizeで指定したサイズ以下となります。読み出しデータがない場合はサイズが0となります。 パラメータ異常の場合は例外となります。 |
.write(index,data)
クライアントにデータを送信します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
index | number | mandatory | 対象のクライアントインデックスを指定します。 | |
data | string, ArrayBuffer | mandatory | 送信データ | |
return | number | - | 送信されたデータサイズ | 送信が失敗した場合は-1を返します。 パラメータ異常の場合は例外となります。 |
.isConnected(index)
ソケットの接続状態を取得します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
index | number | mandatory | 対象のクライアントインデックスを指定します。 | |
return | boolean | - | ソケットの接続状態 true: ソケット接続済み false: ソケット未接続 | パラメータ異常の場合は例外となります。 |
.close(index)
ソケットを切断します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
index | number | mandatory | 対象のクライアントインデックスを指定します。 | |
return | undefined | - | - | パラメータ異常の場合は例外となります。 |
.release()
サーバーリソースを解放します。
尚、接続中のソケットはすべて切断されます。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | undefined | - | - |
{Client}
Methods()/Properties | Summary | Version | Note |
---|---|---|---|
.on() | イベントハンドラを登録します。 | ||
.connect() | サーバーにソケット接続します。 | ||
.read() | サーバーから受信したデータを読み出します。 | ||
.write() | サーバーにデータを送信します。 | ||
.isConnected() | ソケットの接続状態を取得します。 | ||
.close() | ソケットを切断します。 | ||
.release() | クライアントリソースを解放します。 |
Details
.on(event,callback)
イベントハンドラを登録します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
event | string | mandatory | イベント名 使用できるイベント名は、connect, readable, closeとなります。 | |
callback() | function | mandatory | イベント発生時にコールバック処理を実行します。 | |
return | undefined | - | - | パラメータ異常の場合は例外となります。 |
event : ’connect’
ソケット接続した際にコールバック処理を実行します。
event : ’readable’
ソケット受信バッファにデータが存在する場合、コールバック処理を実行します。
event : ’close’
ソケット切断が発生した際にコールバック処理を実行します。
再接続する場合は、.connect()メソッドを実行する必要があります。
尚、ソケット受信バッファにデータが存在する状態でサーバー側からソケット切断された場合、コールバック処理はすぐに実行されません。必ず.read()メソッドで全てのデータを読み出す必要があります。
.connect()
サーバーにソケット接続します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | boolean | - | true: 成功 false: 失敗 |
.read([isBin])
サーバーから受信したデータを読み出します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
isBin | boolean | optional | 読み出しデータの形式を指定します。 true: バイナリデータ形式で読み出し false: 文字列形式で読み出し デフォルト値はfalseとなります。 | |
return | ArrayBuffer, string | - | 読み出しデータ 戻り値の型はisBinで決定されます。 trueを指定した場合はArrayBuffer型、falseを指定した場合は、string型となります。 | 読み出しデータはrecvBuffSizeで指定したサイズ以下となります。読み出しデータがない場合はサイズが0となります。 パラメータ異常の場合は例外となります。 |
.write(data)
サーバーにデータを送信します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
data | string, ArrayBuffer | mandatory | 送信データ | |
return | number | - | 送信されたデータサイズ | 送信が失敗した場合は-1を返します。 パラメータ異常の場合は例外となります。 |
.isConnected()
ソケットの接続状態を取得します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | boolean | - | ソケットの接続状態 true: ソケット接続済み false: ソケット未接続 |
.close()
ソケットを切断します。
再接続する場合は、.connect()メソッドを実行する必要があります。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | undefined | - | - |
.release()
クライアントリソースを解放します。
尚、接続中のソケットは切断されます。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | undefined | - | - |
オブジェクトの使用例
Sample 1
UNIXソケットサーバーのサンプルです。
クライアントから受信したデータをループバック送信します。
//The maximum number of clients that can connect to a UNIX socket server is 3
var readEvt = [false,false,false];
var path ='/tmp/test.unixsocket'
var server = unixsocket.create('server', path);
if(!server) throw new Error('Failed to create server instance');
server.on('accept', function(index) {
print('accept', index);
});
server.on('readable', function(index) {
print('readable', index);
readEvt[index] = true;
});
server.on('close', function(index) {
print('close', index);
});
if(!server.listen()) throw new Error('Failed to start server listening');
print('Server listening started! [' + path + ']');
while(1) {
for(var i=0; i<readEvt.length; i++) {
if(readEvt[i]) {
readEvt[i] = false;
var rStr = server.read(i);
print('recv ' + i + ': ' + rStr.replace(/[\x00-\x1F\x7F-\x9F]/g,'\\') + ' (' + rStr.length + ')');
//Loopback
if(server.write(i, rStr) == rStr.length) {
print('send ' + i + ': OK');
}
}
}
}
Sample 2
UNIXソケットクライアントのサンプルです。
サーバー接続中、1秒周期でデータを送信します。又、サーバーからの受信データを常時待ち受けます。
var path ='/tmp/test.unixsocket'
var client = unixsocket.create('client', path);
if(!client) throw new Error('Failed to create client instance');
client.on('connect', function() {
print('connect');
});
client.on('readable', function() {
print('readable');
});
client.on('close', function() {
print('close');
});
var sendEvt = false;
var tmobj = setInterval(function() { sendEvt = true; }, 1000);
while(1) {
if(!client.isConnected()) {
print('Connecting... [' + path + ']');
if(!client.connect()) {
setTimeout(1000).wait(); //1sec wait
}
} else {
if(sendEvt) {
sendEvt = false;
var sStr = Date.now() + ' to server\n';
if(client.write(sStr) == sStr.length) {
print('send: OK');
}
}
var rStr = client.read();
if(rStr.length) {
print('recv: ' + rStr.replace(/[\x00-\x1F\x7F-\x9F]/g,'\\') + ' (' + rStr.length + ')');
}
}
}