Chrome 應用程式可做為 TCP 和 UDP 連線的網路用戶端。本文件將說明如何使用 TCP 和 UDP,透過網路傳送及接收資料。詳情請參閱通訊端 UDP、Sockets TCP 和 Sockets TCP Server 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" } }
– 傳送 UDP 封包到任何主機的通訊埠 99{ "udp": { "bind" : ":8899" } }
- 繫結本機通訊埠 8899,用於接收 UDP 封包{ "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);
});
保留 socketId
的控制代碼,以便稍後接收及傳送資料
(sockets.tcp.send) 傳送給這個通訊端。
從通訊端接收並傳送至通訊端
從 (sockets.tcp.onReceive) 接收和傳送至通訊端都會使用 ArrayBuffer 物件。目的地: 請參閱總覽、JavaScript 類型陣列,以及教學課程。 如何將 ArrayBuffer 轉換為 String,以及如何將 String 轉換。
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 伺服器
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 搭配使用。新 Pod 的通訊端
連線。如要開始接收訊息,請使用 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);