2014-06-05 29 views
0

我必须在node.js模块中的服务器上的ajax请求中获取套接字实例。这是我的代码。在服务器上获取选项卡的套接字实例

app.js

在我的Ajax请求的一个
io.set('authorization', function (handshake, callback) { 
    if (handshake.headers.cookie) { 
     cookieParser(handshake, null, function(err) { 
      handshake.sessionID = handshake.signedCookies['express.sid']; 
     }); 
    } else { return callback('No cookie transmitted.', false); } 
}); 

io.sockets.on('connection', function(socket) { 
    var session = socket.handshake.session; 
    var userid = session.userid; 
    socket.join("room"); 
    //make user offline 

    socket.on('disconnect', function() { 
     //my code goes here... 
     //make user offline 
    }) 
}); 

现在,我想Socket实例

app.post('/logout', function (req, res) { 
    //here i want socket instance, so I can emit message to all socket, accept this. 
}); 

据我所知,每个标签创建它自己的新的套接字连接,但会话在浏览器的所有选项卡之间是唯一的。那么,如何为服务器端的每个选项卡存储套接字,在那里我可以轻松找到套接字实例,然后将消息广播到所有套接字,不包括正在创建事件的套接字。 (表示用户的活动标签的套接字连接)

任何猜测。

感谢

回答

1

在我的应用程序,我可以做你说什么,因为我使用的命名空间和余地,因此在一个房间里,我可以找人的每一个插座。

因此,我可以删除用户的每个插座。但是如果你不能使用它,我想在你的应用程序中,你将不得不在外部实现socket.io类(使用会话作为一种方式来查看它是否已经打开了套接字或者是否必须创建一个新实例) 。在这个类中,有一个套接字表,以便您能够处理某人的套接字。

在我的情况,我做同样的事情,除了我使用socket.io的房间来做到这一点。

而要广播到每个套接字,它取决于你的应用程序。如果您的应用发送给同一名称空间中的任何人,它不会更改任何内容,因为同一会话的套接字也会收到该消息。但是,如果没有,你将不得不实现一个函数发射到我上面建议的表的每个插座。 在我的情况我使用'排除',以确保当前套接字不会收到消息,但通常你可以使用广播。

io.of('/user').in(this.id).except(socket.id).emit('msg', { text: text,type:person}); 

最后,socket.io不会帮你处理会话和几个插座一个用户/会话,但你能设法对付使用房间的功能它(对我来说这是最好的方式),或实现一个用户类,您将在其中管理会话套接字表。

相关问题