2017-04-04 26 views
0

我有一个设置,服务器正在侦听客户端,然后向他们发送实时通知。服务器的代码如下所示:每次刷新都会将另一个监听器添加到socket.io连接

var io = require('socket.io').listen(8888); 
 

 
io.sockets.on('connection', function (socket) { 
 
\t socket.emit('connected', { connected: true }); 
 
\t console.log("New user " + socket.id); 
 
    
 
    \t socket.on('ready for data', function (data) { 
 
\t pg_client.on('notification', function(content) { 
 
      socket.broadcast.to('ROOM').emit('update', content) 
 
    }); 
 
    }); 
 
}); 
 
\t \t \t

每当一个通知从DB进来,在ROOM所有客户端得到的消息。这是有效的,但是如果客户端刷新他们的页面,他们现在正在监听两次,并为每个更新获取两个通知。 socket.id的补充,但永远不会消失。下面是客户端代码:

var socket = require('socket.io-client')('http://IP:8888') 
 
socket.on('connected', function (data) { 
 
\t 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 
 
})

我试图在客户端和没有运气的服务器端都替换为onceon。这将导致只有第一次更新才能通过,而不是其他

回答

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) 
}); 
+0

这会导致错误'socket is not defined',因为我们在回调之外不再有'socket'。编辑:也许你可以遍历所有连接的客户端,但除非我错过了一些东西,这对socket.io来说很棘手。 –

+0

@BonnieScott - 将'socket.broadcast.to()'改为'io.to()'。 – jfriend00

+0

谢谢。这似乎现在正在进行全面验证... –

相关问题