اتصالات الشبكة

يمكن لتطبيقات Chrome العمل كبرنامج شبكة لاتصالات بروتوكول TCP وUDP. يوضح لك هذا المستند كيفية استخدام TCP وUDP لإرسال البيانات وتلقيها عبر الشبكة. لمزيد من المعلومات، يمكنك الاطّلاع على واجهات برمجة تطبيقات Sockets TCP و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-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. للتعرّف على ArrayBuffer، يمكنك الاطّلاع على النظرة العامة والصفائف المكتوبة بلغة 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 باستخدام واجهة برمجة التطبيقات sockets.tcpServer.

إنشاء مقبس خادم 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 الجديد. يجب استخدام معرّف مقبس العميل مع واجهة برمجة التطبيقات 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);