【问题标题】:Socket IO output too many timesSocket IO 输出次数过多
【发布时间】:2015-10-27 05:59:14
【问题描述】:

这个问题已经回答了,但我完全看不懂。您可以在此链接中找到它。

socket.on calls its callback too many times

我和这个人有同样的问题。我正在尝试用socket.io做一个聊天程序,但是当多个用户加入时,每条消息都会输出连接了多少用户的次数。

例如,当一个用户连接时,他提交了一条消息。它输出一次。当两个用户连接时,他们的每个消息都会输出两次。 当三个用户连接时,他们的每个消息输出 3 次。

这是我的客户端代码:

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

谢谢!

【问题讨论】:

  • 尝试将客户端套接字部分放在$('document').ready 事件之外。顺便说一句,您可以通过var io = require('socket.io')(8888); 启动套接字。我不确定.sockets 是做什么的,但您并不需要它。
  • 如果我把它放在外面,那么 jquery 由于某种原因无法工作。
  • 只需在第二行添加一些console.log("ready");。也许该事件被多次调用?
  • 我做到了。事实证明 socket_io.on('connection') 的回调是获得额外请求的原因。我不知道如何解决它。
  • 那么一个客户端有多个连接?尝试将第三行放在$('document').ready 事件之外。

标签: javascript node.js socket.io


【解决方案1】:

好的,我终于解决了问题。

我使用的是 Express 4.0。这意味着,我正在使用路由来运行服务器,并且我在路由内运行了套接字 io 代码。用户每次连接都要先经过路由,而且都是绑定到同一个socket_io上。

感谢所有帮助过的人!

【讨论】:

  • 解决方案是?
  • 我不完全记得这个问题,因为它发生在一年多以前,但我确实记得解决方案是将 Socket.IO 侦听器从路由函数中取出。
【解决方案2】:

您可以使用socket.broadcast.emit() 发送给除该套接字之外的所有人:

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

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

更新:以下示例对我来说很好:

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用户显示一次。

【讨论】:

  • 如果我发送一条消息,它仍然会发送两条消息。这完全没有意义。
  • 问题是客户端连接不止一次。它在连接时会发出多个“连接”事件。
  • 我已经包含了一个前端和后端的示例,它对我来说很好用。
  • 谢谢,但我想通了。我没有给你们必要的信息来帮助你们。
猜你喜欢
  • 2019-09-20
  • 2019-10-10
  • 2022-01-22
  • 2019-07-05
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多