具有多个命名空间的Socket.io



我有一个路由,它侦听特定的路由id。

/**
 * Chat app routes.
 */
app.get('/games/:id', gameChatController.chatRoom);

基于路线id,我可以确定聊天是关于什么游戏的。

我的问题是如何使用它传递到socket.io?

bin/www

/*
* setup socket.io, and socket-session
*/
var socketIO = require('socket.io');
var io = socketIO(server);
var SessionSocket = require('session.socket.io');
var sessionSockets = new SessionSocket(io, app.sessionStore, app.cookieParser);
var setEvents = require('../events');
setEvents(sessionSockets);

events/index.js

'use strict';
var redis = require('redis');
var sub = redis.createClient();
var pub = redis.createClient();
sub.subscribe('chat');
module.exports = function(io) {
    // here io basically is sessionSockets
    // TODO: Set a namespace, make it dynamic
    var theRoom = 'fifa14';
    var namespaceRoom = io.of('/'+theRoom);
    namespaceRoom.on('connection', function(err, socket, session) {
        if (!session.user) return;
        console.log(socket);
    }
}

所以我要问的是,我如何构建它,以便我可以轻松地传递应用程序的当前状态以匹配套接字命名空间的状态,这样特定游戏中的用户就只能在其中聊天了?

因为我不认为做下面这样的事情是非常有效的

controllers/chat.js

/**
 * GET /
 * ChatRoom page.
 */
exports.chatRoom = function(req, res) {
/*
* setup socket.io, and socket-session
*/
var socketIO = require('socket.io');
var io = socketIO(server);
var SessionSocket = require('session.socket.io');
var sessionSockets = new SessionSocket(io, app.sessionStore, app.cookieParser);
var setEvents = require('../events');
// so here I can pass the route parameters, not efficient!
setEvents(sessionSockets, req.params.id);
  res.render('chatRoom', {
    roomName: req.params.id
  });
};

所以现在我可以将一个新的游戏id传递到setEvents(),但我认为这会更好。

'use strict';
var redis = require('redis');
var sub = redis.createClient();
var pub = redis.createClient();
sub.subscribe('chat');
module.exports = function(io, gameId) {
    // here io basically is sessionSockets
    // Now I can pass the proper id
    var namespaceRoom = io.of('/'+gameId);
    namespaceRoom.on('connection', function(err, socket, session) {
        if (!session.user) return;
        console.log(socket);
    }
}

很难准确说出你在这里问什么问题,所以我将从概念上解释这是如何工作的。

您的聊天应用程序路由是每个客户端的。每个客户端都会分别点击该路线。如果你想与来自同一客户端的未来传入socket.io连接共享一些状态,你有两种主要方法:

  1. 当路由被命中时,您可以设置一个cookie,并将特定状态放入cookie中。然后,当一个传入的socket.io连接到达时,你可以检查cookie,看看这个套接字应该去哪个聊天室。

  2. 当路由被命中时,您可以设置一个会话ID(作为cookie),然后将一些状态存储在某种会话存储中。然后,当传入的socket.io连接从该客户端到达时,您可以从cookie中获取会话ID,然后您可以查看会话存储,以查看该socket.io的连接状态。

您不能将任何内容直接传递给socket.io,因为传入的http路由和传入的socket.io连接都是每个客户端的,并且不是同时进行的,因此您无法设置有关特定未来socket.io的任何全局状态。相反,您可以使用客户端cookie在特定客户端上设置一些状态,或者建立会话ID,以便状态可以在会话存储中。

相关内容

  • 没有找到相关文章

最新更新