Socket IO输出太多次了

这个问题已经回答了,但是我根本听不懂。 你可以在这个链接find它。

socket.on调用它的callback太多次了

我和这个家伙有同样的问题。 我试图用socket.io做一个聊天程序,但是当多个用户join时,每个信息都会输出有多less用户连接的次数。

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

这是我的客户端代码:

$('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()发送给除socket之外的所有人:

 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> 

按回车键后,input框中的信息只会显示给所有其他连接的socket.io用户。

好的,我终于明白了这个问题。

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

感谢所有帮助过的人!