Pregunta

Estoy usando el ejemplo de la página de inicio de Socket.io (http://socket.io/). Funciona y todo, pero hay un gran retraso entre el tiempo que se envían los datos, y cuando esos datos se reciben en el otro extremo.

Estoy usando XAMPP, tengo socket.html en mi director y navegue a él usando "http: //localhost/socket.html" en mi navegador, y tengo el servidor escuchando en el puerto 8080.

Servidor:

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

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

Archivo HTML:

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

<body>

</body>
</html>
¿Fue útil?

Solución

He encontrado el problema.

En el servidor cambié:

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

a

var io = require('socket.io', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling'] }).listen(8080);

lo que obliga al servidor a usar websockets, sockets flash o versiones largas. Intentará usarlos en ese orden. RememberTransport obliga al servidor y al cliente a olvidar qué conexión utilizó el último, e intente conectarse con los 'transportes' anteriores.

En el lado del cliente, prácticamente hice lo mismo. Yo añadí:

{ rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']}

al constructor de socket. Entonces parecía:

var socket = io.connect('http://localhost:843', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']});

Ahora parece funcionar perfectamente.

Gracias chicos.

Otros consejos

¿Has intentado con un mensaje más largo?

Seguramente hay un amortiguador en el enchufe. Si envía menos de X bytes, puede haber algo de tiempo de espera antes de que el búfer se enjuague ya que no se llenó.

¿Qué navegador estás usando? Socket.io se degrada hasta las encuestas, lo que sería mucho más lento que los enchufes web nativos del navegador o las encuestas flash.

El uso de WebSockets mejora el comportamiento en el sentido de que deshabilita el amortiguación. WebSockets se implementa con setNoDelay(true) como se puede ver en el Código de WebSockets Por lo tanto, no amortiguará los mensajes.

Puede solicitar WebSockets explícitamente colocando la palabra websocket primero dentro del transports formación. En versiones recientes de socket.io y engine.io Los argumentos e implementación correctos se ven así:

import socketIO from 'socket.io';
const server = express();
const requestHandler = server.listen(PORT, () => console.log(`Listening on ${PORT}`));
const io = socketIO(requestHandler, { transports: ['websocket', 'polling'] });

Y en el lado del cliente:

import io from 'socket.io-client';
let socket = io(SERVER_URL, { transports: ['websocket', 'polling'] });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top