javascript - Socket IO输出次数过多

标签 javascript node.js socket.io

这个问题已经有答案了,但是我根本看不懂。您可以在此链接中找到它。

socket.on calls its callback too many times

我和这位 friend 有同样的问题。我正在尝试使用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)
    });
});

谢谢!

最佳答案

您可以使用 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>

按 Enter 键时,输入框中的消息仅向所有其他已连接的 socket.io 用户显示一次。

关于javascript - Socket IO输出次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815911/

相关文章:

javascript - 从 Google Maps API V3 获取旅行距离和旅行时间

node.js - 聊天应用程序的结构和所需的技术

ajax - WebSockets(或 AJAX 长轮询等)能否在与原始 HTTP 请求不同的端口上运行?

javascript - 如何单击下拉列表中的链接并通过实时搜索显示在文本框中,然后在删除时删除值

javascript - Bootstrap 博客修复了侧边栏问题

javascript - Omniture/Adobe Analytics 跟踪破坏了 Safari 中的外部链接

node.js - 理解hapi js的生命周期

javascript - 如何在 CSS 中使用通过 Node.js 呈现的 Jade 文件中使用的图像

php - laravel-echo-server 404 尝试进行身份验证时

javascript - 在网页上显示日志文件内容