Giao tiếp qua mạng

Ứng dụng Chrome có thể hoạt động như một ứng dụng mạng cho các kết nối TCP và UDP. Tài liệu này cho bạn biết cách sử dụng TCP và UDP để gửi và nhận dữ liệu qua mạng. Để biết thêm thông tin, hãy xem các API Sockets TCP, Sockets TCPSockets TCP Server.

Yêu cầu về tệp kê khai

Đối với Ứng dụng Chrome sử dụng TCP hoặc UDP, hãy thêm mục nhập sockets vào tệp kê khai và chỉ định quy tắc cấp quyền đối với điểm cuối IP. Ví dụ:

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

Cú pháp của các mục nhập "host-pattern" của ổ cắm tuân theo các quy tắc sau:

<host-pattern> := <host> | ':' <port> | <host> ':' <port>
<host> := '*' | '*.' <anychar except '/' and '*'>+
<port> := '*' | <port number between 1 and 65535>)

Xem Khoá tệp kê khai cổng để biết mô tả chi tiết về cú pháp.

Ví dụ về các mục nhập tệp kê khai socket:

  • { "tcp": { "connect" : "*:23" } }–kết nối trên cổng 23 của bất kỳ máy chủ nào
  • { "tcp": { "connect" : ["*:23", "*:80"] } }–kết nối trên cổng 23 hoặc 80 của bất kỳ máy chủ nào
  • { "tcp": { "connect" : "www.example.com:23" } }–kết nối cổng 23 của www.example.com
  • { "tcp": { "connect" : "" } }–kết nối mọi cổng của máy chủ bất kỳ
  • { "udp": { "send" : ":99" } }–gửi gói UDP đến cổng 99 của máy chủ bất kỳ
  • { "udp": { "bind" : ":8899" } } – liên kết cổng cục bộ 8899 để nhận các gói UDP
  • { "tcpServer": { "listen" : ":8080" } }–TCP đang nghe trên cổng cục bộ 8080

Dùng TCP

Ứng dụng Chrome có thể kết nối với bất kỳ dịch vụ nào hỗ trợ TCP.

Kết nối với ổ cắm

Dưới đây là ví dụ minh hoạ cách kết nối (sockets.tcp.connect) với một ổ cắm:

chrome.sockets.tcp.create({}, function(createInfo) {
  chrome.sockets.tcp.connect(createInfo.socketId,
    IP, PORT, onConnectedCallback);
});

Giữ một handle đối với socketId để sau này bạn có thể nhận và gửi dữ liệu (sockets.tcp.send) đến ổ cắm này.

Nhận từ và gửi đến ổ cắm

Việc nhận từ (sockets.tcp.onReceive) và gửi tới một ổ cắm sử dụng các đối tượng ArrayBuffer. Để tìm hiểu về ArrayBuffers, hãy xem thông tin tổng quan, Mảng JavaScript đã nhập và hướng dẫn, Cách chuyển đổi ArrayBuffer thành và từ 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.
});

Ngắt kết nối khỏi ổ cắm

Sau đây là cách ngắt kết nối (sockets.tcp.disconnect):

chrome.sockets.tcp.disconnect(socketId);

Sử dụng UDP

Ứng dụng Chrome có thể kết nối với bất kỳ dịch vụ nào hỗ trợ UDP.

Đang gửi dữ liệu

Dưới đây là ví dụ minh hoạ cách gửi dữ liệu (sockets.udp.send) qua mạng bằng 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);
  });
});

Đang nhận dữ liệu

Ví dụ này rất giống với ví dụ "Gửi dữ liệu", ngoại trừ việc chúng tôi thiết lập một trình xử lý sự kiện để nhận dữ liệu.

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

Sử dụng máy chủ TCP

Ứng dụng Chrome có thể hoạt động như máy chủ TCP bằng API sockets.tcpServer.

Tạo một cổng máy chủ TCP

Tạo một cổng máy chủ TCP bằng sockets.tcpServer.create.

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

Chấp nhận kết nối ứng dụng

Dưới đây là ví dụ minh hoạ cách chấp nhận kết nối (sockets.tcpServer.listen) trên cổng máy chủ TCP:

function listenAndAccept(socketId) {
  chrome.sockets.tcpServer.listen(socketId,
    IP, PORT, function(resultCode) {
      onListenCallback(socketId, resultCode)
  });
}

Giữ một handle đối với socketId để sau này bạn có thể chấp nhận các kết nối mới (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)
}

Khi một kết nối mới được thiết lập, onAccept sẽ được gọi bằng clientSocketId của kết nối TCP mới. Bạn phải sử dụng mã cổng kết nối ứng dụng với API sockets.tcp. Theo mặc định, ổ cắm của kết nối mới sẽ bị tạm dừng. Hãy huỷ tạm dừng bằng sockets.tcp.setPaused để bắt đầu nhận dữ liệu.

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

Ngừng chấp nhận kết nối từ máy khách

Gọi sockets.tcp.disconnect trên mã cổng máy chủ để dừng chấp nhận các kết nối mới.

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