套接字发送到房间适用于除发件人之外的所有套接字

时间:2017-09-14 04:34:05

标签: node.js express socket.io

我正在使用socket.io创建一个投票功能。插座由channelId放入房间。每当房间中的任何套接字发出vote事件时,我都会尝试将当前vote-list发送到该房间中的所有套接字。

我的问题是,如果我在同一个房间里有套接字A,B,C,那么来自套接字A的投票对于B和C是可见的(也就是说,B和C的on.('vote')监听器被调用),但不是到A本身。

我期望发生的是,如果套接字A,B,C在同一个房间,并且A发出vote,则将调用所有套接字A,B,C vote侦听器

客户:

这些侦听器是在方法中定义的,但为了清楚起见,我将它们单独列出。所有变量都已定义。

const socket = io('https://localhost:3001')

socket.emit('join-channel',{ 
    channelId: payload.channelId,
    senderId: socket.id
 })

socket.emit('vote',{
    senderId: socket.id,
    channelId: state.channelId,
    vote: payload.vote,
    userId: state.userId
})

socket.on(`vote`, function (data) {
    store.commit(MUTATIONS.SET_VOTES, data)
});

服务器

module.exports =(app,server)=> {     var io = require('socket.io')(server);

io.on('connection', function (socket) {

    socket.on('join-channel',data=>{
        socket.join(data.channelId)
    })

    socket.on('vote',data=>{
        postVote(data)
        let { channelId } = data

        socket.to(channelId).emit(`vote`,STORE[channelId])
        //socket.emit(`vote`,STORE[channelId]) //My workaround so that the socket's messages are emitted back to itself
    })


});

};

我目前的解决方法是添加socket.emit('vote',STORE[channelId]),以便它可以将数据发回给自己。

2 个答案:

答案 0 :(得分:2)

这是在socket.io API中设计的。您正在使用此表单:

socket.to(channelId).emit(...)

专门设计用于发送到channelId房间的所有套接字,但不包括socket

如果要发送给该会议室中的所有用户,请将上述代码更改为:

io.to(channelId).emit(...)

以下是socket.io doc for socket.to()

的引用
  

为事件将发生的后续事件发射设置修饰符   只有广播给已加入特定房间的客户(   套接字本身被排除在外。)

答案 1 :(得分:0)

制作套接字列表并隐藏发件人的可见性

Get-ChildItem