2012-03-23 34 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

相关问题