2015-08-04 2 views
1

Этот вопрос уже дан ответ, но я не понимаю его вообще. Вы можете найти его по этой ссылке.Socket IO output too many times

socket.on calls its callback too many times

У меня такая же проблема, как этот парень. Я пытаюсь сделать чат-программу с socket.io, но когда присоединяется более одного пользователя, каждое сообщение выводит количество раз, сколько пользователей было подключено.

Например, когда один пользователь подключен, и он отправляет сообщение. Он выводится один раз. Когда два пользователя подключены, каждое их сообщение выводится дважды. Когда три пользователя подключены, каждое их сообщение выводится три раза.

Вот мой код клиента сторона:

$('document').ready(function() { 

    var server = io.connect('http://localhost:8888'); 

    $('.chat').keydown(function(event){ 
    var save = this; 
    if(event.which == 13){ 

     server.emit('message', $(save).val()); 

     $(save).val(''); 
     return false; 
    } 
    }); 

    server.on('incoming', function(message){ 
    $('#textfield').append("<p>" + message + "</p>"); 
    }); 
}); 

Вот мой код на стороне сервера:

var socket_io = require('socket.io').listen(8888).sockets; 

socket_io.on('connection', function(socket){ 
    socket.on('message', function(message){ 
     socket_io.emit('incoming', message) 
    }); 
}); 

Спасибо!

+0

Попробуйте поместить часть сокета на стороне клиента вне поля '$ ('document'). Ready'. Кстати, вы можете запустить сокет 'var io = require ('socket.io') (8888);' Я не уверен, что делает '.sockets', но вам это действительно не нужно. – Cludch

+0

Это не сработало. – studentTrader24

+0

Если я поместил это снаружи, то jquery не работает по какой-то причине. – studentTrader24

ответ

1

Вы можете использовать socket.broadcast.emit() для отправки всех, кроме этого сокета:

var io = require('socket.io')(8888); 

io.on('connection', function(socket) { 
    socket.on('message', function(message) { 
    socket.broadcast.emit('incoming', message); 
    }); 
}); 

UPDATE: Следующий пример прекрасно работает для меня:

server.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.on('message', function(message) { 
    socket.broadcast.emit('incoming', message); 
    }); 
}); 

index.html :

<html> 
    <head> 
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     $('document').ready(function() { 
     var server = io.connect('http://localhost'); 
     $('.chat').keydown(function(event) { 
      if (event.which == 13) { 
      var $save = $(this); 
      server.emit('message', $save.val()); 
      $save.val(''); 
      return false; 
      } 
     }); 
     server.on('incoming', function(message){ 
      $('#textfield').append("<p>" + message + "</p>"); 
     }); 
     }); 
    </script> 
    </head> 
    <body> 
    <input type="text" class="chat"> 
    <div id="textfield"></div> 
    </body> 
</html> 

При нажатии ввода сообщение в поле ввода отображается только один раз всем другим подключенным пользователям socket.io.

+0

Он по-прежнему отправляет два сообщения, если я их отправлю. Это не имеет никакого смысла. – studentTrader24

+0

Проблема заключается в том, что клиент подключается более одного раза. Он испускает больше, чем одно соединение, когда оно подключается. – studentTrader24

+0

Я включил пример интерфейса и бэкэнда, который отлично подходит для меня. – mscdex

0

Хорошо, я, наконец, понял проблему.

Я использую Express 4.0. Это означает, что я использую маршруты для запуска сервера, и у меня был код сокета io внутри маршрута. Каждый раз, когда пользователь подключается, он должен сначала пройти маршрут, и он привязан к одному сокету.

Спасибо всем, кто помог!

+0

И решение было? – Ragnar

+0

Я не очень хорошо помню проблему, потому что это произошло более года назад, но я помню, что решение заключалось в том, чтобы вывести слушателей Socket.IO из функции маршрута. – studentTrader24