การสื่อสารของเครือข่าย

แอป Chrome สามารถทำหน้าที่เป็นไคลเอ็นต์เครือข่ายสำหรับการเชื่อมต่อ TCP และ UDP เอกสารนี้แสดงวิธีการใช้ TCP และ UDP เพื่อส่งและรับข้อมูลผ่านเครือข่าย สำหรับข้อมูลเพิ่มเติม โปรดดูที่ซ็อกเก็ต UDP, Sockets TCP และ Sockets TCP Server API

ข้อกำหนดของไฟล์ Manifest

สำหรับแอป Chrome ที่ใช้ TCP หรือ UDP ให้เพิ่มรายการ Sockets ลงในไฟล์ Manifest และระบุ IP กฎการให้สิทธิ์การเข้าถึงปลายทาง เช่น

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

ไวยากรณ์ของ Socket "host-pattern" รายการเป็นไปตามกฎต่อไปนี้

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

ดูคำอธิบายไวยากรณ์โดยละเอียดได้ที่คีย์ไฟล์ Manifest ของ Sockets

ตัวอย่างรายการไฟล์ Manifest ของซ็อกเก็ต

  • { "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 เป็นสตริงและมาจากสตริง

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 sockets.tcp ซ็อกเก็ตของอุปกรณ์ใหม่ การเชื่อมต่อจะหยุดชั่วคราวโดยค่าเริ่มต้น เลิกหยุดชั่วคราวโดยใช้ 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);
}

หยุดการยอมรับการเชื่อมต่อไคลเอ็นต์

เรียก sockets.tcp.disconnect ด้วยรหัสซ็อกเก็ตเซิร์ฟเวอร์เพื่อหยุดรับการเชื่อมต่อใหม่

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