Notas de estudio de Socket.IO

Que es Socket.IO

Socket.IO es una biblioteca que se puede utilizar para la comunicación en tiempo real, bidireccional y basada en eventos entre el navegador y el servidor. incluye:

  • Crear un servidor Node.js: Fuente | API
  • Una biblioteca cliente de JavaScript para el navegador (que también se puede ejecutar desde Node.js): Fuente | API

Sus principales características son:

fiabilidad

La conexión se establecerá incluso si se dan las siguientes condiciones:

  • Proxy y balanceador de carga.
  • Firewall personal y software antivirus.

Con este fin, depende de Engine.IO , el motor primero establece una conexión de sondeo larga y luego intenta actualizar a una mejor transmisión de una "prueba" en el lateral, por ejemplo, WebSocket. Consulte la sección " Destino" para obtener más información.

Soporte de reconexión automática

A menos que se indique lo contrario, los clientes desconectados intentarán volver a conectarse de forma permanente hasta que el servidor vuelva a estar disponible. Haga clic aquí para ver la opción de reconexión disponible.

Detección de rotura de cable

El mecanismo de latido se implementa en el nivel Engine.IO, de modo que tanto el servidor como el cliente pueden saber cuándo la otra parte ya no responde.

Esta función se puede lograr configurando temporizadores en el servidor y el cliente y compartiendo el valor de tiempo de espera (parámetros pingInterval y pingTimeout) durante el protocolo de enlace de la conexión. Estos temporizadores requieren que las llamadas de los clientes posteriores se dirijan al mismo servidor, por lo que se requieren sesiones permanentes cuando se utilizan varios nodos.

Soporte binario

Se puede emitir cualquier estructura de datos serializable, que incluye:

Soporte multiplex

Para crear una separación de preocupaciones dentro de una aplicación (por ejemplo, por módulo o en función de los permisos), Socket.IO le permite crear múltiples espacios de nombres , que actuarán como canales de comunicación separados, pero compartirán la misma conexión básica.

Soporte de sala

En cada espacio de nombres , puede definir los canales a los que los sockets pueden unirse y salir, denominados Salas . Luego puede transmitir a cualquier sala determinada, llegando a cada espacio que se haya unido a esa sala.

Esta es una función útil para enviar notificaciones a un grupo de usuarios o un usuario determinado conectado a varios dispositivos.

Estas funciones vienen con una API simple y conveniente, como se muestra a continuación:

io.on('connection',function(socket) { 
  socket.emit('request',/ * * /); //向套接字发出事件
   io.emit('broadcast',/ * * /); / /向所有连接的套接字发出事件
   socket.on('reply',function() { / * * / }); //监听事件
 });

Que no es Socket.IO

Socket.IO no es una implementación de WebSocket. Aunque Socket.IO usa WebSocket como herramienta de transmisión cuando es posible, agrega algunos metadatos a cada paquete: cuando se requiere confirmación de mensaje, tipo de paquete, espacio de nombres e ID de paquete. Esta es la razón por la que el cliente WebSocket no podrá conectarse correctamente al servidor Socket.IO y el cliente Socket.IO no podrá conectarse al servidor WebSocket. Consulte la especificación del protocolo aquí .

//警告:客户端将无法连接!
const client = io('ws://echo.websocket.org');

Instalando

servidor

npm install --save socket.io

Recursos

Cliente Javascript

De forma predeterminada, el servidor expondrá la versión independiente del cliente /socket.io/socket.io.js.

También puede proporcionar servicios desde CDN, como cdnjs .

Para utilizar de Node.js como un uso incluida o de WebPack o browserify , también se puede instalar el paquete NPM:

npm install-save socket.io-client

Recursos

Implementación de otro cliente

Hay varias implementaciones de clientes en otros idiomas, mantenidas por la comunidad:

Usar con servidor http Node

Servidor (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);
  });
});  

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

Usar con Express

Servidor (app.js)

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

server.listen(80);
// WARNING: app.listen(80) will NOT work here!

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);
  });
});

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

Envía y recibe eventos

Socket.IO le permite transmitir y recibir eventos personalizados. Además connect, messagey disconnect, puede emitir eventos personalizados:

servidor

// 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');
  });
});

Restringirse a un espacio de nombres

Si puede controlar todos los mensajes y eventos emitidos para una aplicación en particular, puede usar el valor / espacio de nombres predeterminado. Si desea utilizar código de terceros o generar código para compartir con otros, socket.io proporciona una forma de nombrar sockets.

Esto tiene multiplexingla ventaja de una sola conexión. En lugar de usar dos WebSocketconexiones, use una conexión.

Servidor (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' });
  });

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

Envía mensajes volátiles

A veces, algunos mensajes pueden descartarse. Suponga que tiene una aplicación que muestra tweets de palabras clave en tiempo real bieber.

Si un cliente no está listo para recibir mensajes (debido a la baja velocidad de la red u otros problemas, o porque están conectados a través de un sondeo largo y están en el medio del ciclo de solicitud-respuesta), no ha recibido todos los tweets y bieber relacionados su aplicación no se verá afectada.

En este caso, es posible que desee enviar estos mensajes como mensajes volátiles.

servidor

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);
  });
});

Enviar y recibir datos (confirmación)

A veces, cuando el cliente confirma la recepción del mensaje, es posible que desee obtener una devolución de llamada.

Para hacer esto, simplemente pase la función como .sendúltimo parámetro del OR .emit. Además, cuando lo usa .emit, la confirmación la realiza usted, lo que significa que también puede pasar datos:

Servidor (app.js)

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

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

Cliente (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', 'woot', function (data) { // args are sent in order to acknowledgement function
      console.log(data); // data will be 'tobi says woot'
    });
  });
</script>

Mensaje de difusión

Para la emisión, justo broadcasten emity sendañadir una llamada al método señal. Difundir significa enviar un mensaje a otros (excepto al conector que inició el mensaje).

servidor

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

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

Úselo como un WebSocket entre navegadores

Si solo necesita la semántica de WebSocket, puede hacer lo mismo. Aprovecha sendy escucha el messageevento:

Servidor (app.js)

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

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

Cliente (index.html)

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

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

Si no le importa este tipo de lógica de reconexión, consulte Engine.IO , que es la capa de transporte semántico de WebSocket utilizada por Socket.IO.

Al pisar la diferencia entre la versión de Socket.io, el uso de @ 3.xx provocará un error anormal al no poder vincular normalmente, @ 2.xx no existe.

Supongo que te gusta

Origin blog.csdn.net/weixin_45670301/article/details/113104339
Recomendado
Clasificación