תקשורת רשת

אפליקציות Chrome יכולות לתפקד כלקוח רשת עבור חיבורי TCP ו-UDP. במסמך הזה מוסבר איך להשתמש ב-TCP ו-UDP כדי לשלוח ולקבל נתונים ברשת. למידע נוסף: תוכלו להיעזר בממשקי ה-API של Sockets UDP, Sockets TCP ו-Sockets TCP Server.

דרישות למניפסט

באפליקציות Chrome שמשתמשות ב-TCP או ב-UDP, מוסיפים את הערך sockets למניפסט ומציינים את כללי ההרשאות של נקודת הקצה של ה-IP. לדוגמה:

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

התחביר של ערכי "host-pattern" ב-socket יתבצע לפי הכללים הבאים:

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

לקבלת תיאור מפורט של התחביר, יש לעיין במפתח מניפסט של שקע.

דוגמאות לרשומות של מניפסט socket:

  • { "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) ל-socket:

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

שמירת נקודת אחיזה ל-socketId כדי שאפשר יהיה לקבל ולשלוח נתונים (sockets.tcp.send) לשקע הזה.

קבלה ושליחה מ-socket

קבלה מ-(sockets.tcp.onReceive) ושליחה אל socket משתמשות באובייקטים מסוג ArrayBuffer. כדי ללמוד על ArrayBuffer, קרא את הסקירה הכללית, מערכים מקלידים ב-JavaScript ואת המדריך בנושא המרת ArrayBuffer ל-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.
});

התנתקות משקע

כך מתנתקים (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);