Socket.io на Node.js. Простой пример, но обмен некорректный. Почему?

Все привет. Беру простейший, минимальный пример. Фактически, из мануала.

Сервер:
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(3000);

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) {
  console.log('client connect');
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});


Клиент:
var socket = require('socket.io-client')('http://localhost:3000');

socket.on('connect', function() {
    console.log('connected to server');
    socket.on('news', function (data) {
      console.log(data);
      socket.emit('my other event', { my: 'data' });
    });
});


Запускаю в первом терминале серверную часть, во втором клиентскую. Все что они делают, обмениваются сообщением.

Сервер передает сообщение: { hello: 'world' }
Клиент, в ответ на него: { my: 'data' }

Далее, перезапускаю сервер. И сообщений уже 2. Еще раз перезапускаю, получаю обмен 3-мя сообщениями. И так далее.... Если перезапустить клиента, все восстановится. Что за ерунда? То есть, при потере и следующем восстановлении связи между клиентом и сервером количество сообщений увеличивается на 1.
  • Вопрос задан
  • 4635 просмотров
Решения вопроса 1
@miki131
Событие connect на клиенте происходит каждый раз код он подключается к серверу.
Когда вы перезапускаете сервер происходит разрыв соединения, а потом снова connect.
Вы каждый раз при connect-е вешаете socket.on('news'... - этого делать не надо.

var socket = require('socket.io-client')('http://localhost:3000');

socket.on('connect', function() {
  console.log('connected to server');
});

socket.on('news', function (data) {
  console.log(data);
  socket.emit('my other event', { my: 'data' });
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы