网络通信

Chrome 应用可以充当 TCP 和 UDP 连接的网络客户端。本文档介绍如何使用 TCP 和 UDP 通过网络发送和接收数据。如需了解详情,请参阅 Sockets UDPSockets TCPSockets 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 对象。如需了解 ArrayBuffer,请查看概览、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 服务器

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