2012-03-23 82 views
1

我想不同的網址,許多socket.io客戶端連接在Node.js的,像這樣:如何將多個socket.io客戶端連接到Node.js的不同的網址?

app.get('/:id',function(req,res){ 
io.of('/'+id).on('connection',function(socket){ 
    socket.emit('hello'); 

}) 
}); 

然而這工作有一個問題:

當瀏覽器refreshs http://localhost:3000/xyz頁面例如,事件socket.emit被激發兩次。

如果有人訪問該頁面http://localhost:3000/xyz 10次,則事件觸發的10倍。

這是不好的,因爲每次用戶瀏覽該網頁時,插座事件將被解僱N + 1次。

應該怎樣做,這樣我可以註冊套接字不同的URL,並在同一時間不會有這種異常現象。

另一件事:

如果我這樣做:

var sock; 

io.of('/'+xyz).on('connection',function(socket){ 
    sock=socket; 

}) 


app.get('/:id',function(req,res){ 
    sock.emit('hello'); 

}) 

如果我使用上面的代碼,然後插座沒有得到成功地保存到襪子變量時間。這意味着,我必須做一個約1000的setInterval ..以便

sock=socket 

線被激發。

請幫幫我。

回答

0

因爲這種情況,在每個請求http://localhost:3000/id,你註冊一個新的處理程序,你應該這樣做一次,而不是在每一個請求。

app.get('/:id',function(req,res){ 
    io.of('/'+id).on('connection',function(socket){ 
     socket.emit('hello'); 

    }) 
}); 
+0

是的,我知道, ..但是什麼是s解決我的用例? – Deepak 2012-03-24 16:53:36

+0

你approahc是錯誤的,你必須存儲的ID插槽的關係,並通過與請求的ID找到它發出事件到尊重插座。 – Mustafa 2012-03-24 17:06:18

0

我用下面的方法來實現這一目標:

客戶端:

var socket = io.connect('http://localhost:8183/?clientId='+clientId,{"force new connection":true}); 

服務器端:

var io = require('socket.io').listen(server); 
io.sockets.on('connection', function(socket) { 
    console.log("url"+socket.handshake.url); 
    clientId=socket.handshake.query.clientId; 
    console.log("connected clientId:"+clientId); 

}); 

參考:https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

相關問題