2015-06-24 1 views
1

У меня есть маршрут, который прослушивает конкретный идентификатор маршрута.Socket.io с несколькими пространствами имен?

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

Основываясь на маршруте id я могу определить, что игра чат о.

Мой вопрос в том, как использовать это для передачи в socket.io?

бен/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); 

события/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); 

    } 
} 

Так что я спрашиваю, как я могу построить это так, что я могу легко передать текущее состояние приложения, чтобы соответствовать состоянию пространства имен сокетов, поэтому пользователи внутри конкретной игры могут только чат внутри этого?

Потому что я не думаю, что делать что-то вроде ниже очень эффективен

Контроллеры/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 
    }); 
}; 

Так что теперь я могу передать новую игру идентификатор в 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); 

    } 
} 

ответ

3

Трудно точно рассказать, какой вопрос вы задаете здесь, поэтому я объясню концептуально, как это может работать.

Ваш маршрут для вашего чата предназначен для каждого клиента. Каждый клиент отправляется по этому маршруту. Если вы хотите поделиться какой-то состояние с будущего подключения входящего Socket.io с того же клиента, у вас есть два основных способа сделать это:

  1. Когда маршрут хит, вы можете установить печенье и поставить конкретное состояние в cookie. Затем, когда поступит входящее соединение socket.io, вы можете проверить куки-файл, чтобы узнать, в какую чат-комнату должен входить этот сокет.

  2. При ударе маршрута вы можете установить идентификатор сеанса (как файл cookie), а затем сохранить некоторое состояние в каком-либо хранилище сеансов. Затем, когда входящее соединение socket.io поступает с этого клиента, вы извлекаете идентификатор сеанса из файла cookie, и затем вы можете заглянуть в хранилище сеансов, чтобы узнать, какое состояние идет с этим соединением socket.io.

Вы ничего не можете перейти непосредственно к Socket.io, потому что как входящие HTTP маршруты и входящие соединения Socket.io являются для одного клиента и не в то же самое время, так что вы не можете установить любое глобальное состояние о конкретное будущее разъем.io подключение. Вместо этого вы используете cookie-клиент для установки какого-либо состояния на этом конкретном клиенте или для установления идентификатора сеанса, чтобы состояние могло находиться в вашем хранилище сеансов.

+0

Удивительный человек, очень благодарен за ответ. Я собираюсь его прочитать очень внимательно и попытаться его реализовать. –

 Смежные вопросы

  • Нет связанных вопросов^_^