2017-09-14 17 views
0

我使用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 =(应用程序,服务器)=> { 变种IO =要求( 'socket.io')(服务器);

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]),以便它可以将数据发回自己。

回答

1

这是由socket.io API设计。你用这种形式:

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

专门发送给所有插座中的channelID房间EXCEPT socket

如果您要发送到在那个房间里所有用户,然后更改上面的代码:

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

下面是来自socket.io doc for socket.to()报价:

设置一个修改器随后的事件发射事件将仅向已经加入给定房间的客户端( 套接字本身被排除)广播到事件 。

0

让使插座和隐藏知名度的列表,发件人

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]) 
    }