Giao tiếp qua mạng

Ứng dụng Chrome có thể đóng vai trò là một ứng dụng mạng cho các kết nối TCP và UDP. Tài liệu này hướng dẫn bạn 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 bài viết Sockets API UDP, 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 socket vào tệp kê khai và chỉ định IP quy tắc cấp quyền điểm cuối. Ví dụ:

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

Cú pháp của socket "host-pattern" mục nhập 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>)

Hãy xem bài viết Sockets Manifest Key (Khoá tệp kê khai của Sockets) để biết nội dung mô tả chi tiết về cú pháp.

Ví dụ về các mục nhập tệp kê khai của ổ cắm:

  • { "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" } } – cổng kết nối 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 với 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

Sử dụng TCP

Ứng dụng Chrome có thể tạo 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à mẫu 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);
});

Duy trì tên người dùng 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 một ổ cắm

Việc nhận từ (sockets.tcp.onReceive) và gửi đến một ổ cắm sẽ sử dụng các đối tượng ArrayBuffer. Người nhận tìm hiểu về ArrayBuffers, xem thông tin tổng quan, Mảng đã nhập JavaScript và hướng dẫn, Cách chuyển đổi ArrayBuffer thành và từ Chuỗi.

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ể tạo 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à mẫu 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 nút 'Gửi dữ liệu' ngoại trừ thiết lập trình xử lý sự kiện cho đang 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 cách sử dụng API sockets.tcpServer.

Tạo 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 với khách hàng

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

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

Duy trì tên người dùng đố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 kết nối mới được thiết lập, onAccept sẽ được gọi bằng clientSocketId của TCP mới kết nối. Mã cổng ứng dụng khách phải được sử dụng với API sockets.tcp. Ổ cắm của thiết bị mới kết nối sẽ bị tạm dừng theo mặc định. Hãy huỷ tạm dừng bằng sockets.tcp.setPaused để bắt đầu nhận .

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 với ứng dụng khách

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

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