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" } }
- 监听本地端口 8080 的 TCP
使用 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 对象。接收者 了解 ArrayBuffers,请查看概览、JavaScript 类型数组和教程, 如何将 ArrayBuffer 与 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) socket:
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);