2015-06-22 3 views
3

Я использую socket.io с Express.Получение соединения socket.io, относящегося к HTTP-запросу

Скажем, пользователь попадает в канонический маршрут /, и запрос получает направляется на:

app.get('/',function(req,res,next){ 

    var msg =...; 
    socket.emit('channel',msg); //how do I find the right socket object that pertains to this HTTP request? 

}); 

, что это лучший способ найти сокет-соединения, относящуюся к этому запросу HTTP с Socket.io?

Мое лучшее предположение заключается в том, чтобы отмечать сокеты с идентификатором сеанса при аутентификации сокета, а затем извлекать их позже (в таком месте, как функция выше) с тем же идентификатором сеанса связи? Идентификатор сеанса доступен на объекте запроса в промежуточном программном обеспечении Express.

Также у меня есть эта привязка Socket.io к серверу экспресс-код:

var server = http.createServer(app).listen(port); 
var io = require('socket.io').listen(server); //we need to bind socket.io to the http server 

и мой собственный модуль socketio, я делаю это:

var cookie = require("cookie"); 
var connect = require("connect"); 

var io = null; 
var connectedUsers = {}; //hash of sockets with socket.id as key and socket as value 

var init = function ($io) { 

    if (io === null) { 

     io = $io; 

     io.use(function (socket, next) { 
      var handshakeData = socket.request; 

      if (handshakeData.headers.cookie && handshakeData.cookie) { 

       handshakeData.cookie = cookie.parse(handshakeData.headers.cookie); 

       //handshakeData.sessionID = connect.utils.parseSignedCookie(handshakeData.cookie['express.sid'], 'foo'); //pass session secret at end 

       handshakeData.sessionID = cookie.parse(handshakeData.cookie['express.sid'], 'foo'); //pass session secret at end 

       if (handshakeData.cookie['express.sid'] == handshakeData.sessionID) { 
        return next('Cookie is invalid.', false); 
       } 

      } else { 
       return next('No cookie transmitted.', false); 
      } 

      console.log('user with socket.id=', socket.id, 'has authenticated successfully.'); 
      return next(null, true); 

     }); 


     io.on('connection', function (socket) { 
      console.log('a user connected - ', socket.id); 

      connectedUsers[socket.id] = socket; 

      socket.on('chat message', function (msg) { 
       console.log(socket.id, 'says', msg); 

       socket.emit('chat message', 'hey baby hey - I am '.concat(socket.id)); 
      }); 

      socket.on('disconnect', function() { 
       console.log('user disconnected -', socket.id); 
       connectedUsers[socket.id] = null; 
      }); 
     }); 
    } 
    else if ($io != null) { 
     throw new Error('tried to re-init socketio.js by passing new value for io in?? what are you doing.') 

    } 
    else { 

    } 


    return { 

     addListener: function(){ 

    } 


}; 

module.exports = init; 

ответ

1

Вы должны создать массив или JSON объектов и сохранять объекты сокета при их подключении к серверу. Так же, как это:

var clients = {} 
io.on("connection", function(socket){ 
    socket.on("login", function(data){ 
     clients[data.user] = socket; 
    }); 
}); 

Затем, когда вы получаете HTTPS запроса клиента, передать пользователю в качестве параметра, и вы смотрите на объект клиентов:

clients[user].emit(...) 
Смежные вопросы