2016-08-14 87 views
0

當我呼叫發出沒有io.emit()時,所有連接的客戶端都會收到您所期望的消息。但是,當嘗試使用io.to(socket.id).emit()將消息發送到默認房間時,客戶端不會收到消息。socket.io發射到默認房間不起作用

指的默認文檔的房間在 http://socket.io/docs/rooms-and-namespaces/#default-room

使用的NodeJS v4.2.6

客戶:

var socket = io(); 
socket.on('connect', function() { 
    $.ajax({ 
    url: '/some-path', 
    type: 'POST', 
    data: {socket_id: socket.id}, 
    success: function(data) { 
     console.log(data); 
    } 
    }); 
}); 

服務器:

app.post('/some-path', function(req, res) { 
    var socketID = req.body.socket_id; 
    io.to(socketID).emit('message', {'message': socketID}); 
    res.end(socketID); 
}); 
+0

請告訴我們相關的代碼。發送到房間時,在正確完成socket.io時工作得很好,這很明顯,這必須是您的代碼。關於代碼的問題必須包含相關的代碼。如果你不包含它,我們如何知道你在代碼中做了什麼錯誤? – jfriend00

+0

謝謝@ jfriend00,我認爲你的建議對理解我發現的內容會有很大的影響。 – chmoder

回答

1

這是正確的解決方案。發現服務器用來設置默認房間的默認房間socket.id與客戶端socket.id不同。請指教。

客戶如果評估socket.id你喜歡的東西,v4eEdSX5RnDSXjzuAAAA

服務器中,io.on('connection', function(socket){})如果評估socket.id,你會得到這樣的事情,/#v4eEdSX5RnDSXjzuAAAA。 請注意前綴爲客戶端socket.id的/#

所以,你必須解決這個問題

  1. 兩種方式撥打電話時EMIT前插/#插座上的ID
  2. 覆蓋的IO「連接」監聽器設置沒有/#預謀房間的插座ID

選擇方案(2)如下:

io.on('connection', function(socket) { 
    socketID = socket.client.id; 
    socket.join(socketID); 
    console.log('a user connected ' + socketID); 
});