【问题标题】:Socket emit to room works for all sockets except the sender套接字发射到房间适用于除发送方之外的所有套接字
【发布时间】:2018-02-22 22:27:17
【问题描述】:

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

我的问题是,如果我在同一个房间里有 Socket A、B、C,则来自 Socket 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]),以便它可以将数据发回给自己。

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    让我们列出套接字并隐藏对发送者的可见性

    var sockets = [A,B,C]
        socket.on('vote',data=>{
        let []tovisible = sockets - data.senderId 
        //emit event only tovisible arry
        socket.to(tovisible).emit(`vote`,STORE[channelId])
       }
    

    【讨论】:

      【解决方案2】:

      这是在 socket.io API 中设计的。您使用的这个表格:

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

      专门设计用于发送到 channelId 房间中的所有套接字,除了 socket

      如果你想发送给那个房间里的所有用户,那么把上面的代码改成:

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

      这是socket.io doc for socket.to()的引述:

      为事件将要发生的后续事件发射设置一个修饰符 仅广播给已加入给定房间的客户端( 套接字本身被排除)。

      【讨论】:

        猜你喜欢
        • 2018-03-03
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 2018-09-13
        • 2023-03-22
        • 2017-12-04
        • 2015-04-22
        • 1970-01-01
        相关资源
        最近更新 更多