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:
- ArrayBuffer y Blob en el navegador
- ArrayBuffer y Buffer en Node.js
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
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
Implementación de otro cliente
Hay varias implementaciones de clientes en otros idiomas, mantenidas por la comunidad:
- Java: https : //github.com/socketio/socket.io-client-java
- C ++ :https://github.com/socketio/socket.io-client-cpp
- Rápido: HTTPS : //github.com/socketio/socket.io-client-swift
- Dardos: HTTPS : //github.com/rikulo/socket.io-client-dart
- Python :https://github.com/miguelgrinberg/python-socketio
- .Net :https://github.com/Quobject/SocketIoClientDotNet
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
, message
y 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 multiplexing
la ventaja de una sola conexión. En lugar de usar dos WebSocket
conexiones, 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 broadcast
en emit
y send
añ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 send
y escucha el message
evento:
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.