NodeJS с задержкой передачи данных Socket.IO - PullRequest
5 голосов
/ 02 декабря 2011

Я использую пример с домашней страницы Socket.IO (http://socket.io/). Это работает и все, но существует огромная задержка между временем отправки данных и моментом получения этих данных на другом конце.

Я использую XAMPP, у меня есть файл socket.html в моей директории, и в браузере к нему используйте "http://localhost/socket.html"", и у меня есть сервер, прослушивающий порт 8080.

Сервер:

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-файл:

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

Ответы [ 4 ]

6 голосов
/ 03 декабря 2011

Я обнаружил проблему.

На сервере я изменил:

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

на

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

, что заставляет сервер использовать либо WebSockets, FlashРозетки или длинные опросы.Он попытается использовать их в таком порядке.Параметр RememberTransport заставляет сервер и клиент забыть, какое соединение оно использовало последним, и попытаться установить соединение с помощью вышеупомянутых «транспортов».

На стороне клиента я просто сделал то же самое.Я добавил:

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

в конструктор сокетов.Так это выглядело так:

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

Теперь, похоже, работает отлично.

Спасибо, ребята.

1 голос
/ 02 декабря 2011

Вы пробовали с более длинным сообщением?

В сокете наверняка есть буфер.Если вы отправляете меньше X байтов, может пройти некоторое время, прежде чем буфер будет очищен, так как он не был заполнен.

0 голосов
/ 28 сентября 2018

Использование веб-сокетов улучшает поведение в том смысле, что отключает буферизацию.Веб-сокеты реализованы с setNoDelay(true), как видно из кода веб-сокетов , поэтому они не будут буферизировать сообщения.

Вы можете явно запрашивать веб-сокеты, поместив сначала слово websocket внутри transports массив.В последних версиях socket.io и engine.io правильные аргументы и реализация выглядят так:

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

А на стороне клиента:

import io from 'socket.io-client';
let socket = io(SERVER_URL, { transports: ['websocket', 'polling'] });
0 голосов
/ 02 декабря 2011

Какой браузер вы используете?Socket.IO снижается до опроса, который будет намного медленнее, чем собственный веб-сокет браузера или флэш-опрос.

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