我是Node.js和socket.io的新手。我创建了一个小应用程序,其想法是当通过websocket激活一个函数时,socket实时显示该表(函数运行“emit”)。 问题是每次我打开一个新客户端时,如果我打开两个客户端,那么信息会复制每个客户端,然后我更新其中一个客户端,然后更新之前的重复信息,我该如何修复它?
谢谢!
这是服务器中的代码:
// socket.io
var http = require('http').Server(app);
var io = require('socket.io')(http);
// winner
function bitcoin_winner_socket(){
bitcoin_winners.find().limit(50).exec(function (err, response) {
console.log(response);
io.sockets.emit('bitcoin_winners', JSON.stringify(response));
});
}
// veasy
function bitcoin_veasy_socket(){
bitcoin_veasy.find().exec(function (err, response) {
console.log(response);
io.sockets.emit('bitcoin_veasy', JSON.stringify(response));
});
}
io.on('connection', function(socket){
console.log('user connected');
bitcoin_winner_socket();
bitcoin_veasy_socket();
});
http.listen(3001, function(){
console.log('listening on *:3001');
});
// socket.io
这是客户端代码:
<script>
var socket = io();
socket.on('bitcoin_winners', function(response){
$('#abc').text(response);
});
socket.on('bitcoin_veasy', function(response){
$.each(JSON.parse(response), function(index, value){
$("#tabla-veasy").append("<tr><td>" + (parseInt(index+1)) + "</td> <td>" + value.senders + "</td><td>" + value.amount_received + "</td><td><a href='https://chain.so/tx/BTCTEST/"+value.txid+"'>"+value.txid+"</a></td></tr>");
});
});
</script>
答案 0 :(得分:1)
让我们跟踪每次套接字连接到服务器时会发生什么。
connection
事件中(当套接字连接时),您将调用两个函数&#34; bitcoin_winner_socket()
和bitcoin_veasy_socket()
。bitcoin_winner_socket()
看起来像是对获胜者进行数据库查找,然后将获胜者列表发送给所有现有的套接字。#abc
项目,并列出获奖者名单。虽然这可能是因为新的套接字连接而导致每个客户端不必要的工作,但这不会导致任何问题。bitcoin_veasy_socket()
看起来像进行某种其他数据库搜索,然后将响应发送给所有连接的客户端。'bitcoin_veasy'
消息时,它会将所有这些信息附加到现有表(而不是替换它)。这就是造成重复信息的原因。在连接新套接字后,您需要将'bitcoin_veasy'
信息的全新副本附加到所有连接的客户端。一个简单的解决方法是更改您的'bitcoin_veasy'
消息处理以替换现有信息,而不是附加它。然后,你永远不会得到重复。
更完整的解决方案是在信息实际发生变化时仅向客户端传输新信息,而不是每次新连接时向所有连接的客户端发送数据。
我不确切地从您的问题中了解何时需要将此信息发送给已连接的客户端。您可以将此信息的发送更改为仅将其发送到新连接的套接字,而不是将其发送到所有套接字。
您可以将新连接的socket
传递给bitcoin_winner_socket()
和bitcoin_veasy_socket()
函数,这样他们就可以socket.emit()
到单个套接字而不是io.sockets.emit()
到所有连接的套接字。