网络通信
Chrome 应用可以用作 TCP 与 UDP 连接的网络客户端,该文档向您展示如何使用 TCP 与 UDP 在网络上发送与接收数据。有关更多信息,请参见 UDP 套接字、TCP 套接字 以及 TCP 服务器套接字 API。
注意:前一版本的网络 API(socket)已弃用。
API 示例:想试试这些代码吗?请参见 telnet 与 udp 示例。
清单文件的要求
如果 Chrome 应用使用 TCP 或 UDP,请在清单文件中添加 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>)
有关语法的详细描述请参见清单文件中的 sockets 属性。
清单文件中套接字项的例子如下:
{ "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" } }
– 绑定本地端口 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 对象。如果您想了解 ArrayBuffer,请参见 JavaScript 类型化数组概述以及如何在 ArrayBuffer 和字符串之间转换的教程。
chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);
chrome.sockets.tcp.onReceive.addListener(function(info) { if (info.socketId != socketId) return; // info.data 为 ArrayBuffer 对象。 });
断开套接字的连接
如下是断开连接(sockets.tcp.disconnect)的方法:
chrome.sockets.tcp.disconnect(socketId);
使用 UDP
Chrome 应用可以连接到支持 UDP 的任何服务。
发送数据
以下示例演示如何使用 UDP 通过网络发送数据(sockets.udp.send):
// 创建套接字 chrome.sockets.udp.create({}, function(socketInfo) { // 套接字已创建,现在我们可以发送一些数据 var socketId = socketInfo.socketId; chrome.sockets.udp.send(socketId, arrayBuffer, '127.0.0.1', 1337, function(sendInfo) { console.log("已发送 " + sendInfo.bytesSent + " 字节"); }); });
接收数据
下面的例子和“发送数据”的例子类似,只是我们需要设置一个事件处理程序来接收数据。
var socketId; // 处理 onReceive 事件。 var onReceive = function(info) { if (info.socketId !== socketId) return; console.log(info.data); }; // 创建套接字 chrome.sockets.udp.create({}, function(socketInfo) { socketId = socketInfo.socketId; // 设置事件处理程序并绑定套接字。 chrome.sockets.udp.onReceive.addListener(onReceive); chrome.sockets.udp.bind(socketId, "0.0.0.0", 0, function(result) { if (result < 0) { console.log("无法绑定套接字。"); return; } chrome.sockets.udp.send(socketId, arrayBuffer, '127.0.0.1', 1337, function(sendInfo) { console.log("已发送 " + 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.tcp.listen(socketId, IP, PORT, function(resultCode) { onListenCallback(socketId, resultCode) }); }
请保存 socketId
的值,之后可以接受新连接(sockets.tcpServer.onAccept)。
var serverSocketId; function onListenCallback(socketId, resultCode) { if (resultCode < 0) { console.log("无法监听连接:" + chrome.runtime.lastError.message); return; } serverSocketId = socketId; chrome.sockets.tcpServer.onAccept.addListener(onAccept) }
连接建立后调用 onAccept
并传递新的 TCP 连接的
clientSocketId
,客户端套接字标识符只能在 sockets.tcp API
中使用。新连接的套接字默认情况下已经暂停,请使用 sockets.tcp.setPaused
取消暂停状态,以便开始接收数据。
function onAccept(info) { if (info.socketId != serverSocketId) return; // 新的 TCP 连接已经建立。 chrome.sockets.tcp.send(info.clientSocketId, data, function(resultCode) { console.log("Data sent to new TCP client connection.") }); // 开始接收数据。 chrome.sockets.tcp.onReceive(info.clientSocketId, onReceive); chrome.sockets.tco.setPaused(false); }
停止接受客户端连接
在服务器套接字上调用 sockets.tcp.disconnect 停止接受新连接。
chrome.sockets.tcpServer.onAccept.removeListener(onAccept); chrome.sockets.tcpServer.disconnect(serverSocketId);