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

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

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

สำหรับแอป Chrome ที่ใช้ TCP หรือ UDP ให้เพิ่มรายการ sockets ในไฟล์ Manifest และระบุกฎสิทธิ์จุดสิ้นสุด 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>)

ดูคีย์ไฟล์ Manifest ของซ็อกเก็ตสำหรับคำอธิบายโดยละเอียดของไวยากรณ์

ตัวอย่างรายการซ็อกเก็ตไฟล์ 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 และบทแนะนำวิธีแปลง ArrayBuffers เป็นและจากสตริง

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 โดยใช้ sockets.tcpServer API

การสร้างซ็อกเก็ตเซิร์ฟเวอร์ 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);