Socket.io документация

Материал из support.qbpro.ru

Документация

Использование Node HTTP server

Установить npm install socket.io

SERVER (APP.JS)

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , 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.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
 });

CLIENT (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>

Использование совместно с Express 3 web framework

Express 3 requires that you instantiate a `http.Server` to attach socket.io to first:


SERVER (APP.JS)

var app = require('express')()
 , server = require('http').createServer(app)
 , io = require('socket.io').listen(server);

server.listen(80);

app.get('/', function (req, res) {
 res.sendfile(__dirname + '/index.html');
});
 
io.sockets.on('connection', function (socket) {
 socket.emit('news', { hello: 'world' });
 socket.on('my other event', function (data) {
   console.log(data);
 });
});

CLIENT (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>

Использование совместно с Express web framework

You can serve normal pages and AJAX requests with Express, and attach your socket.io server

For this example, simply run `npm install socket.io express`

SERVER (APP.JS)

var app = require('express').createServer()
 , io = require('socket.io').listen(app);
app.listen(80);
app.get('/', function (req, res) {
 res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
 socket.emit('news', { hello: 'world' });
 socket.on('my other event', function (data) {
   console.log(data);
 });
});

CLIENT (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` and `disconnect`, можно создавать произвольные события:

SERVER

// note, io.listen(<port>) will create a http server for you
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
 io.sockets.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.sockets.emit('user disconnected');
 });
});

Прикрепление данных, ассоциированных с клиентом

Иногда необходимо хранить данные, ассоциированные с клиентом, что необходимо для продолжении (duration) сессии.

SERVER

var io = require('socket.io').listen(80);
 io.sockets.on('connection', function (socket) {
  socket.on('set nickname', function (name) {
    socket.set('nickname', name, function () {
      socket.emit('ready');
    });
  });
  socket.on('msg', function () {
    socket.get('nickname', function (err, name) {
      console.log('Chat message by ', name);
    });
  });
 });

CLIENT

<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>

Оборачивание себя (своего кода) в namespace.

Если вы контролируете все сообщения и события в коде, используйте namespace works по умолчанию (default namespace works) Если вы хотите использовать сторонний код или предоставлять код другим, socket.io предоставляет возможность использования именованных сокетов (namespacing a socket.)

Это полезно при мультиплексировании соединений. Вместо использования двух соединений WebSocket, будет использовано одно.

SERVER

var io = require('socket.io').listen(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' });
  });

CLIENT

<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>

Отправка летучих (volatile) сообщений.

Иногда некоторые сообщения могут быть удалены (отброшены). Скажем, у вас есть приложение, которое показывает в реальном времени количество твитов по ключевому слову Бибер.

Если определенный клиент не готов к приему сообщений (из-за медлительности сети или других вопросов, или потому, что он связан через длинные голосования и находится в середине запрос-ответ цикла), если он не получит всех твитов, связанных с Бибер, то ваша заявка не будет страдать.

В этом случае, вы можете отправить эти сообщения, как летучие сообщений.

SERVER

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

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

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

Отправка и получение данных (подтверждения)

Иногда, вы можете получить обратный вызов, когда клиент подтвердил прием сообщения.

Чтобы сделать это, просто передать функцию в качестве последнего параметра `.send` или `.emit`. Более того, когда вы используете `.emit`, подтверждение было сделано вами, значит, вы также можете продолжить передавать данные.

SERVER

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

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

CLIENT

<script>
  var socket = io.connect(); // TIP: .connect 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>

Broadcasting messages.

To broadcast, simply add a `broadcast` flag to `emit` and `send` method calls. Broadcasting means sending a message to everyone else except for the socket that starts it.

SERVER

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

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

Using it just as a cross-browser WebSocket.

If you just want the WebSocket semantics, you can do that too. Simply leverage `send` and listen on the `message` event:

SERVER

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

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

CLIENT

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

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

Примеры кода