所以我在寫一個的NodeJS應用程序,並作序,我的問題,請理解我的設置目前是如何工作的:Socket.IO的Emit被髮射到所有客戶端
我有誰通過Socket.io連接的客戶端「服務器X「,然後我的」服務器X「通過Socket.io連接到」服務器Y「,它們都通過Socket.io將數據發回給對方。
客戶< --->服務器X < --->服務器Ÿ
客戶端是指用戶和他們的瀏覽器,然後我有我的服務器X和我的服務器Y都運行的節點的應用程序。
因此,在我的服務器X下面的代碼中,如果你看看第4行,它的工作原理與它應該完全一樣。它僅將消息發送給請求它的客戶端。
io.on('connection', function(socket){
// This works just fine.
socket.emit('return_login', 'Test Message');
socket.on('login', function(data){
// This line correctly sends the data to Server Y
server_y.emit('login', data);
});
server_y.on('return_login', function(data){
// This emits to all connected clients???
socket.emit('return_login', data);
});
});
現在我的問題是,當「服務器Y」發出return_login
到服務器X,我希望發生什麼是服務器X採取通過服務器Ÿ發出的價值,只是其發回給原來的客戶端,或網頁瀏覽器。但出於某種原因,該線路發射給所有連接的客戶端。
我有一臺筆記本電腦,這臺電腦和我的手機都在測試這個,每次發生這種情況都會發送給所有人。
如果有人可以請幫助我,我將不勝感激。如果我需要發佈更多的代碼,請讓我知道。
你解決了我的問題,但我仍然困惑。爲什麼要從該tempData對象中刪除套接字ID?你說在評論中刪除ID值的數據副本,所以我們不會發送到客戶端,但你不想知道他們是什麼套接字ID?另外,我刪除了'server_y.removeListener('return_login',fn)''這一行,因爲它使得它只能嘗試一次登錄。 – flakeyjake
@flakeyjake - 客戶端不需要知道服務器端連接的'socket.id',所以我想我會刪除它以保持與之前發送給客戶端的數據結構相同。我沒有理由想把它發送給客戶。如果您想避免將其移除,您可以允許將其發送給客戶端 - 無損。我不知道你想要多次登錄。是的,要做到這一點,您要麼在發送登錄信息時建立新的聽衆,要麼不要刪除它。 – jfriend00
@flakeyjake - 由於您看起來可能是新手,如果我的答案爲您提供瞭解決方案,那麼您可以通過單擊答案左側的綠色複選標記來向社區表明這一點。這也將爲您遵循正確的程序贏得一些聲望點。 – jfriend00