Socket IO输出次数过多
Socket IO output too many times
这个问题已经有人回答了,但是我完全看不懂。您可以在 link.
找到它
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)
});
});
谢谢!
您可以使用 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 用户显示一次。
好的,我终于找到问题了
我正在使用 Express 4.0。这意味着,我正在使用到 运行 服务器的路由,并且我在路由中有套接字 io 代码 运行ning。用户每次连接都要先走路由,都绑定到同一个socket_io.
感谢所有帮助过的人!
这个问题已经有人回答了,但是我完全看不懂。您可以在 link.
找到它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)
});
});
谢谢!
您可以使用 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 用户显示一次。
好的,我终于找到问题了
我正在使用 Express 4.0。这意味着,我正在使用到 运行 服务器的路由,并且我在路由中有套接字 io 代码 运行ning。用户每次连接都要先走路由,都绑定到同一个socket_io.
感谢所有帮助过的人!