Chrome アプリは、TCP 接続と UDP 接続のネットワーク クライアントとして機能できます。このドキュメントでは、TCP と UDP を使用してネットワーク経由でデータを送受信する方法について説明します。詳細については、ソケット UDP、ソケット TCP、ソケット TCP サーバーの各 API をご覧ください。
マニフェストの要件
TCP または UDP を使用する Chrome アプリの場合、マニフェストに sockets エントリを追加し、IP エンドポイントの権限ルールを指定します。例:
"sockets": {
"udp": {
"send": ["host-pattern1", ...],
"bind": ["host-pattern2", ...],
...
},
"tcp" : {
"connect": ["host-pattern1", ...],
...
},
"tcpServer" : {
"listen": ["host-pattern1", ...],
...
}
}
ソケット「host-pattern」エントリの構文は、次のルールに従います。
<host-pattern> := <host> | ':' <port> | <host> ':' <port>
<host> := '*' | '*.' <anychar except '/' and '*'>+
<port> := '*' | <port number between 1 and 65535>)
構文の詳細については、ソケット マニフェスト キーをご覧ください。
ソケット マニフェスト エントリの例:
{ "tcp": { "connect" : "*:23" } }
- 任意のホストのポート 23 で接続{ "tcp": { "connect" : ["*:23", "*:80"] } }
- 任意のホストのポート 23 または 80 で接続{ "tcp": { "connect" : "www.example.com:23" } }
- www.example.com の接続ポート 23{ "tcp": { "connect" : "" } }
- 任意のホストの任意のポートの接続{ "udp": { "send" : ":99" } }
- 任意のホストのポート 99 に UDP パケットを送信します。{ "udp": { "bind" : ":8899" } }
- UDP パケットを受信するようにローカルポート 8899 をバインドする{ "tcpServer": { "listen" : ":8080" } }
- TCP はローカルポート 8080 でリッスン
TCP の使用
Chrome アプリは、TCP をサポートするあらゆるサービスに接続できます。
ソケットへの接続
ソケットに接続する方法(sockets.tcp.connect)の例を次に示します。
chrome.sockets.tcp.create({}, function(createInfo) {
chrome.sockets.tcp.connect(createInfo.socketId,
IP, PORT, onConnectedCallback);
});
後でこのソケットとデータ(sockets.tcp.send)を送受信できるように、socketId
へのハンドルを保持します。
ソケットの受信と送信
sockets.tcp.onReceive からの受信とソケットへの送信には、ArrayBuffer オブジェクトを使用します。ArrayBuffers については、概要、JavaScript 型配列、チュートリアルの ArrayBuffer と文字列を変換する方法をご覧ください。
chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);
chrome.sockets.tcp.onReceive.addListener(function(info) {
if (info.socketId != socketId)
return;
// info.data is an arrayBuffer.
});
ソケットからの切断
接続を解除する方法は次のとおりです(sockets.tcp.disconnect)。
chrome.sockets.tcp.disconnect(socketId);
UDP の使用
Chrome アプリは、UDP をサポートするあらゆるサービスに接続できます。
データの送信
次のサンプルは、UDP を使用してネットワーク経由でデータ(sockets.udp.send)を送信する方法を示しています。
// Create the Socket
chrome.sockets.udp.create({}, function(socketInfo) {
// The socket is created, now we can send some data
var socketId = socketInfo.socketId;
chrome.sockets.udp.send(socketId, arrayBuffer,
'127.0.0.1', 1337, function(sendInfo) {
console.log("sent " + sendInfo.bytesSent);
});
});
データの受信
この例は「データの送信」の例とよく似ていますが、データを受信するイベント ハンドラを設定する点が異なります。
var socketId;
// Handle the "onReceive" event.
var onReceive = function(info) {
if (info.socketId !== socketId)
return;
console.log(info.data);
};
// Create the Socket
chrome.sockets.udp.create({}, function(socketInfo) {
socketId = socketInfo.socketId;
// Setup event handler and bind socket.
chrome.sockets.udp.onReceive.addListener(onReceive);
chrome.sockets.udp.bind(socketId,
"0.0.0.0", 0, function(result) {
if (result < 0) {
console.log("Error binding socket.");
return;
}
chrome.sockets.udp.send(socketId, arrayBuffer,
'127.0.0.1', 1337, function(sendInfo) {
console.log("sent " + sendInfo.bytesSent);
});
});
});
TCP Server の使用
Chrome アプリは、sockets.tcpServer API を使用して TCP サーバーとして動作できます。
TCP サーバー ソケットの作成
sockets.tcpServer.create を使用して TCP サーバー ソケットを作成します。
chrome.sockets.tcpServer.create({}, function(createInfo) {
listenAndAccept(createInfo.socketId);
});
クライアント接続を受け入れる
次のサンプルは、TCP サーバー ソケットで接続(sockets.tcpServer.listen)を受け入れる方法を示しています。
function listenAndAccept(socketId) {
chrome.sockets.tcpServer.listen(socketId,
IP, PORT, function(resultCode) {
onListenCallback(socketId, resultCode)
});
}
後で新しい接続を受け入れることができるように、socketId
へのハンドルを保持します(sockets.tcpServer.onAccept)。
var serverSocketId;
function onListenCallback(socketId, resultCode) {
if (resultCode < 0) {
console.log("Error listening:" +
chrome.runtime.lastError.message);
return;
}
serverSocketId = socketId;
chrome.sockets.tcpServer.onAccept.addListener(onAccept)
}
新しい接続が確立されると、新しい TCP 接続の clientSocketId
で onAccept
が呼び出されます。クライアント ソケット ID は sockets.tcp API で使用する必要があります。新しい接続のソケットはデフォルトで一時停止されています。sockets.tcp.setPaused を使用して一時停止を解除し、データの受信を開始します。
function onAccept(info) {
if (info.socketId != serverSocketId)
return;
// A new TCP connection has been established.
chrome.sockets.tcp.send(info.clientSocketId, data,
function(resultCode) {
console.log("Data sent to new TCP client connection.")
});
// Start receiving data.
chrome.sockets.tcp.onReceive.addListener(function(recvInfo) {
if (recvInfo.socketId != info.clientSocketId)
return;
// recvInfo.data is an arrayBuffer.
});
chrome.sockets.tcp.setPaused(false);
}
クライアント接続の受け入れを停止する
サーバー ソケット ID で sockets.tcp.disconnect を呼び出して新しい接続の受け入れを停止します。
chrome.sockets.tcpServer.onAccept.removeListener(onAccept);
chrome.sockets.tcpServer.disconnect(serverSocketId);