Javascript 套接字IO输出次数过多

Javascript 套接字IO输出次数过多,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,这个问题已经回答了,但我一点也不明白。你可以在这个链接上找到它 我和这个家伙有同样的问题。我正试图用socket.io制作一个聊天程序,但当多个用户加入时,每条消息都会输出已连接用户的次数 例如,当一个用户连接时,他提交了一条消息。它输出一次。当两个用户连接时,每个用户的消息输出两次。 连接三个用户时,每个用户的消息输出三次 这是我的客户端代码: $('document').ready(function() { var server = io.connect('http://localh

这个问题已经回答了,但我一点也不明白。你可以在这个链接上找到它

我和这个家伙有同样的问题。我正试图用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>");
  });
});

谢谢大家!

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


$('document').ready(函数(){
var server=io.connect('http://localhost');
$('.chat').keydown(函数(事件){
if(event.which==13){
var$save=$(此);
emit('message',$save.val());
$save.val(“”);
返回false;
}
});
server.on('传入')函数(消息){
$('#textfield')。追加(“”+消息+”

”); }); });

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

好的,我终于解决了问题

我用的是Express 4.0。这意味着,我使用路由来运行服务器,并且在路由中运行套接字io代码。每次用户连接时,都必须首先通过路由,并且都绑定到同一个套接字io上


感谢所有帮助过我的人

尝试将客户端套接字部分放在
$('document')之外。准备好
事件。顺便说一下,您可以通过
var io=require('socket.io')(8888)启动套接字
我不确定
.sockets
的功能,但您并不真正需要它。如果我把它放在外面,那么jquery由于某种原因就不能工作了。只需放一些
控制台.log(“就绪”)在第二行。也许这个活动会被多次调用?是我做的。事实证明,socket_io.on('connection')的回调是获得额外请求的原因。但是我不知道如何修复它。所以一个客户端有多个连接?尝试将第三行放在
$('document').ready
事件之外。如果我发送一条消息,它仍会发送两条消息。这完全没有意义。问题是客户端连接了不止一次。当它连接时,它会发出不止一个“连接”事件。我已经包含了一个前端和后端的示例,对我来说效果很好。谢谢,但我已经解决了这个问题。我没有给你们提供必要的信息来帮助你们。解决方案是?我不记得我完全记得的问题,因为它发生在一年前,但我记得解决方案是将Socket.IO侦听器从路由函数中移除。
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);
  });
});