Socket.IO



socketio

كيف تستعمل

تثبيت

$ npm install socket.io

باستخدام خادم http العقدة

الخادم (app.js)

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

العميل (index.html)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

باستخدام Express 3/4

الخادم (app.js)

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

العميل (index.html)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

باستخدام الإطار السريع

الخادم (app.js)

var app = require('express').createServer();
var io = require('socket.io')(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

العميل (index.html)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

إرسال واستقبال الأحداث

يسمح لك Socket.IO بإصدار وتلقي أحداث مخصصة. إلى جانب connect message disconnect ، يمكنك بث أحداث مخصصة:

الخادم

// note, io(<port>) will create a http server for you
var io = require('socket.io')(80);

io.on('connection', function (socket) {
  io.emit('this', { will: 'be received by everyone'});

  socket.on('private message', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    io.emit('user disconnected');
  });
});

تقييد نفسك إلى مساحة اسم

إذا كنت تتحكم في جميع الرسائل والأحداث المنبعثة من أجل تطبيق معين ، فإن استخدام / مساحة الاسم الافتراضية يعمل. إذا كنت ترغب في الاستفادة من شفرة طرف ثالث ، أو إنشاء رمز لمشاركته مع الآخرين ، يوفر socket.io طريقة لتحديد موقع مأخذ التوصيل.

هذا له فائدة multiplexing اتصال واحد. بدلاً من socket.io باستخدام اتصالات WebSocket جهازي ، فإنه سيتم استخدام واحد.

الخادم (app.js)

var io = require('socket.io')(80);
var chat = io
  .of('/chat')
  .on('connection', function (socket) {
    socket.emit('a message', {
        that: 'only'
      , '/chat': 'will get'
    });
    chat.emit('a message', {
        everyone: 'in'
      , '/chat': 'will get'
    });
  });

var news = io
  .of('/news')
  .on('connection', function (socket) {
    socket.emit('item', { news: 'item' });
  });

العميل (index.html)

<script>
  var chat = io.connect('http://localhost/chat')
    , news = io.connect('http://localhost/news');
  
  chat.on('connect', function () {
    chat.emit('hi!');
  });
  
  news.on('news', function () {
    news.emit('woot');
  });
</script>

إرسال رسائل متقلبة

في بعض الأحيان يمكن إسقاط بعض الرسائل. لنفترض أن لديك تطبيقًا يعرض التغريدات في الوقت الفعلي للكلمة الرئيسية bieber .

إذا لم يكن عميل معين جاهزًا لاستقبال الرسائل (بسبب بطء الشبكة أو مشكلات أخرى ، أو بسبب كونها متصلة عبر الاستقصاء الطويل وفي منتصف دورة طلب-رد) ، إذا لم يتلقوا جميع التغريدات المتعلقة بيبر التطبيق الخاص بك لن تعاني.

في هذه الحالة ، قد ترغب في إرسال هذه الرسائل كرسائل متقلبة.

الخادم

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  var tweets = setInterval(function () {
    getBieberTweet(function (tweet) {
      socket.volatile.emit('bieber tweet', tweet);
    });
  }, 100);

  socket.on('disconnect', function () {
    clearInterval(tweets);
  });
});

إرسال البيانات والحصول عليها (إقرارات)

في بعض الأحيان ، قد ترغب في الحصول على رد اتصال عند تأكيد العميل لاستلام الرسالة.

للقيام بذلك ، قم ببساطة بتمرير دالة كمعلمة أخيرة من .emit أو .emit . ما هو أكثر من ذلك ، عند استخدام .emit ، يتم الإقرار .emit ، مما يعني أنه يمكنك أيضًا تمرير البيانات على طول:

الخادم (app.js)

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

العميل (index.html)

<script>
  var socket = io(); // TIP: io() with no args does auto-discovery
  socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); // data will be 'woot'
    });
  });
</script>

رسائل البث

للبث ، ما عليك سوى إضافة إشارة broadcast send استدعاءات الأسلوب. البث يعني إرسال رسالة إلى أي شخص آخر باستثناء المقبس الذي يبدأ تشغيلها.

الخادم

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

استخدامه كمجرد WebSocket عبر متصفح

إذا كنت ترغب فقط في دلالات WebSocket ، فيمكنك القيام بذلك أيضًا. ما عليك سوى الضغط على send واستماع حدث message :

الخادم (app.js)

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.on('message', function () { });
  socket.on('disconnect', function () { });
});

العميل (index.html)

<script>
  var socket = io('http://localhost/');
  socket.on('connect', function () {
    socket.send('hi');

    socket.on('message', function (msg) {
      // my msg
    });
  });
</script>

إذا كنت لا تهتم بمنطق إعادة الاتصال ، Engine.IO نظرة على Engine.IO ، الذي يستخدم طبقة نقل بيانات دلالة ويب WebSocket Socket.IO.