NodeJS con dati ritardo Socket.IO emettitori
-
27-10-2019 - |
Domanda
sto usando l'esempio dalla homepage Socket.IO (http://socket.io/). Funziona e tutto, ma c'è un enorme ritardo tra il momento i dati vengono inviati, e quando i dati vengono ricevuti su l'altra estremità.
sto usando XAMPP, ho socket.html nel mio dir, e creare una rotta con "http: //localhost/socket.html". Nel mio browser, e ho l'ascolto server sulla porta 8080
Server:
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);
});
});
HTML file:
<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>
Soluzione
Ho trovato il problema.
Nel server Ho cambiato:
var io = require('socket.io').listen(8080);
a
var io = require('socket.io', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling'] }).listen(8080);
che costringe il server da utilizzare sia WebSockets, prese Flash o lungo polling. Si wil tenta di utilizzare quelli in questo ordine. Le forze rememberTransport il server e client da dimenticare che il collegamento ha usato scorso, e cercano di connettersi con i 'trasporti' di cui sopra.
Sul lato client ho praticamente fatto la stessa cosa. Ho aggiunto:
{ rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']}
al costruttore socket. Così sembrava che:
var socket = io.connect('http://localhost:843', { rememberTransport: false, transports: ['WebSocket', 'Flash Socket', 'AJAX long-polling']});
Ora sembra funzionare perfettamente.
Grazie ragazzi.
Altri suggerimenti
Hai provato con un messaggio più lungo?
C'è sicuramente un buffer sulla presa. Se si invia meno di X byte ci potrebbe essere qualche tempo di attesa prima che il buffer si svuota dal momento che non è stato riempito.
Quale browser stai usando? Socket.IO degrada fino al polling, che sarebbe molto più lento rispetto prese browser web nativo o polling flash.
Uso WebSockets migliora il comportamento nel senso che disabilita il buffering. WebSockets viene implementato con setNoDelay(true)
come si può vedere nella WebSockets codice in modo da non tamponare i messaggi.
E 'possibile richiedere WebSockets esplicitamente di prima immissione della parola websocket
all'interno della matrice transports
. Su versioni recenti di socket.io
e engine.io
gli argomenti corretti e sguardi di implementazione in questo modo:
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'] });
E sul lato client:
import io from 'socket.io-client';
let socket = io(SERVER_URL, { transports: ['websocket', 'polling'] });