我有一个设置,服务器监听客户端,然后发送实时通知。服务器代码如下所示:
var io = require('socket.io').listen(8888);
io.sockets.on('connection', function (socket) {
socket.emit('connected', { connected: true });
console.log("New user " + socket.id);
socket.on('ready for data', function (data) {
pg_client.on('notification', function(content) {
socket.broadcast.to('ROOM').emit('update', content)
});
});
});
每当来自数据库的通知进入时,ROOM
中的所有客户端都会收到消息。这有效,但如果客户端刷新其页面,他们现在正在侦听两次,并为每次更新获得两个通知。 socket.id
已被添加,但永远不会消失。这是客户端代码:
var socket = require('socket.io-client')('http://IP:8888')
socket.on('connected', function (data) {
socket.emit('ready for data', {});
});
// Triggered by an addChannel function
socket.emit('add room', {room: 'ROOM'})
socket.on('update', function(data) {
// This gets hit multiple times per update, depending on the number of client refreshes
})
我尝试在客户端和服务器端替换once
on
,但没有运气。这导致仅第一次更新通过,而没有其他
答案 0 :(得分:1)
看起来每次新套接字连接时,您都要为此创建一个新的事件处理程序:
pg_client.on('notification', ...)
因此,每当新页面连接时,这些事件处理程序将累积。这可以解释您在页面刷新时看到的行为,因为每次刷新都与新页面连接相同。该事件处理程序应该只在服务器初始化时注册一次,而不是每次新的套接字连接时。您可以将它移出套接字连接处理程序,如下所示:
var io = require('socket.io').listen(8888);
io.sockets.on('connection', function (socket) {
socket.emit('connected', { connected: true });
console.log("New user " + socket.id);
socket.on('ready for data', function (data) {
});
});
pg_client.on('notification', function(content) {
io.to('ROOM').emit('update', content)
});