Сетевые коммуникации

Приложения Chrome могут выступать в качестве сетевого клиента для соединений TCP и UDP. В этом документе показано, как использовать TCP и UDP для отправки и получения данных по сети. Дополнительные сведения см. в разделах API Sockets UDP , Sockets TCP и Sockets TCP Server .

Требования к манифесту

Для приложений Chrome, использующих TCP или UDP, добавьте запись о сокетах в манифест и укажите правила разрешения конечной точки IP. Например:

"sockets": {
    "udp": {
      "send": ["host-pattern1", ...],
      "bind": ["host-pattern2", ...],
      ...
    },
    "tcp" : {
      "connect": ["host-pattern1", ...],
      ...
    },
    "tcpServer" : {
      "listen": ["host-pattern1", ...],
      ...
    }
  }

Синтаксис записей «шаблона хоста» сокета соответствует следующим правилам:

<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" } } – подключение порта 23 www.example.com
  • { "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. Чтобы узнать о 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.

Отправка данных

Вот пример, показывающий, как отправлять данные ( sockets.udp.send ) по сети с использованием UDP:

// 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 могут выступать в качестве TCP-серверов с помощью API-интерфейса sockets.tcpServer .

Создание сокета TCP-сервера

Создайте сокет TCP-сервера с помощью sockets.tcpServer.create .

chrome.sockets.tcpServer.create({}, function(createInfo) {
  listenAndAccept(createInfo.socketId);
});

Прием клиентских подключений

Вот пример, показывающий, как принимать соединения ( sockets.tcpServer.listen ) в сокете TCP-сервера:

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

Когда устанавливается новое соединение, onAccept вызывается с clientSocketId нового TCP-соединения. Идентификатор сокета клиента должен использоваться с API сокетов.tcp . Сокет нового соединения по умолчанию приостановлен. Снимите паузу с помощью сокетов.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);
}

Прекратить принимать клиентские подключения

Вызовите sockets.tcp.disconnect для идентификатора сокета сервера, чтобы прекратить прием новых подключений.

chrome.sockets.tcpServer.onAccept.removeListener(onAccept);
chrome.sockets.tcpServer.disconnect(serverSocketId);