网络通信

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);