我必须在node.js模块的服务器上的ajax请求获得套接字实例。这是我的代码。
app.js
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
})
});
现在在我的一个ajax请求中,我想要socket实例
app.post('/logout', function (req, res) {
//here i want socket instance, so I can emit message to all socket, accept this.
});
据我所知,每个选项卡创建它自己的新的套接字连接,但会话是唯一的浏览器的所有选项卡之间。所以,我如何存储套接字的每个选项卡在服务器端,在那里我可以很容易地找到套接字实例,然后广播消息到所有套接字,不包括套接字,这是创建事件。(表示用户的活动选项卡的套接字连接)
任何猜测。
谢谢
在我的应用程序中,我可以做你说的,因为我使用命名空间和房间,所以在一个房间里,我可以找到某人的每个套接字。
io.of('/user').clients(idRoom);
这样我就可以删除用户的每个套接字。但如果你不能使用这个,我认为在你的应用程序你将不得不实现外部套接字。为某人创建一个类(使用session来查看它是否已经打开了套接字,或者是否必须创建一个新实例)。在这门课上,有一个套接字表,这样你就可以处理别人的套接字。
在我的情况下,我做了相同的,除了我使用插座的房间。
广播到每个套接字,这取决于你的应用程序是什么。如果你的应用程序发送到相同命名空间中的任何人,它不会改变任何东西,因为相同会话的套接字也会收到消息。但如果没有,您将不得不实现一个函数来向上面建议的表的每个套接字发出。在我的情况下,我使用'排除'来确保当前套接字不接收消息,但通常你可以使用广播。
io.of('/user').in(this.id).except(socket.id).emit('msg', { text: text,type:person});
总结,socket。IO不会帮助你处理一个用户/会话的会话和几个套接字,但你可以使用房间功能来处理它(在我的情况下,这是最好的方法),或者实现一个用户类,在那里你将管理会话套接字的表。