2017-09-14 19 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]) 
    }