2012-05-07 56 views
10

Tôi đã làm theo hướng dẫn này: http://www.danielbaulig.de/socket-ioexpress/ để liên kết express.js với socket.io và nó hoạt động rực rỡ.Cách phát hiện nhiều kết nối socket.io từ cùng một người dùng

Tôi có người dùng đăng nhập trên một trang (yêu cầu POST express.js đặt đối tượng phiên) và khi họ đã xác thực nó hướng họ đến trang mới nơi socket.io tải và trên máy chủ socket.io có thể lấy phiên được thiết lập từ express. Vì vậy, tất cả các công trình tốt.

Bây giờ tôi có người dùng trên trang sử dụng socket.io và khi trang đó được làm mới - đôi khi kết nối socket.io vẫn ở đó (ví dụ: không ngắt kết nối). Những gì tôi đang cố gắng làm là thay đổi chức năng io.set('authorization') để đảm bảo rằng khi người dùng kết nối - nó sẽ ngắt kết nối tất cả các phiên bản socket.io hiện có vẫn mở cho máy khách đó.

Đây là cách nó nhìn vào thời điểm hiện tại:

//socket.io connect to express 
var parseCookie = require('connect').utils.parseCookie; 
io.set('authorization', function (data, accept) { 
    if (data.headers.cookie) 
    { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     // (literally) get the session data from the session store 
     sessionStore.get(data.sessionID, function (err, session) 
     { 
      if (err || !session) 
      { 
       // if we cannot grab a session, turn down the connection 
       //note: a session is created when the user logs in 
       accept('Error', false); 
      } 
      else 
      { 
       //TODO something here before we accept the connection 
       //?? 

       // save the session data 
       data.session = session; 
       //accept the connection 
       accept(null, true); 
      } 
     }); 
    } 
    else 
    { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

Làm thế nào để kiểm tra xem khách hàng đó là về để được chấp nhận có một kết nối trước đây, và nó vẫn còn mở (và do đó chúng ta cần phải ngắt kết nối cái cũ đó).

Phiên thể hiện có "tên người dùng" trong đó - vì vậy chúng tôi có thể lấy đối tượng phiên và nhận tên người dùng, tôi không thể tìm ra cách đi qua danh sách tất cả các khách hàng socket.io và có hãy xem phiên thể hiện cho từng phiên và kiểm tra xem nó có giống với người dùng xác thực hiện tại hay không.

Trả lời

6

Trong ứng dụng của tôi, tôi quản lý rõ ràng các phiên socket.io. Về phía máy chủ, bất cứ khi nào một kết nối mới được thiết lập, tôi làm một cái gì đó như: socketio_session[user_id].push(session). Điều này cho phép tôi truy cập vào tất cả các phiên được kết nối cho một người dùng cụ thể. Trong trường hợp của bạn, bạn có thể không cần lưu trữ danh sách phiên cho mỗi người dùng, nhưng chỉ lưu trữ phiên mới nhất và onconnect buộc ngắt kết nối trên phiên hiện tại, nếu có, trước khi lưu phiên mới.

+0

Có, đây là lựa chọn dễ nhất. Mặc dù tôi chắc chắn phải có một cách để làm điều đó với biến socket.io toàn cầu. – Andrew

+0

Tôi sử dụng TornadIO2, trong trường hợp không có cách nào được xây dựng cho một thứ như vậy (tôi đọc dòng mã nguồn theo dòng tìm kiếm một). Nhưng nếu sử dụng Node.js với socket.io trên máy chủ, thì tôi không chắc chắn. –

+0

Vâng, có vẻ như đây là cách dễ nhất để làm mọi thứ. Bây giờ tôi đang lưu trữ tất cả các kết nối trong một mảng vì vậy tôi có quyền truy cập vào chúng ... Chúc mừng cho điều đó. – Andrew

0

Có rất nhiều mã trên Socket.IO đã cũ.

Các tài liệu mới (Socket.IO 1.3.6, ngay bây giờ), cho biết:

"The io.set cũ() và io.get() phương pháp được chấp nhận và chỉ được hỗ trợ cho khả năng tương thích ngược đây. là một bản dịch của một ví dụ ủy quyền kiểu cũ thành phần mềm trung gian. " trong phần "Di chuyển từ 0,9"

Nếu bạn sử dụng phiên bản mới của Socket.IO. Mã bạn cần là một cái gì đó như:

var sessionStore = new MongoStore({ url: config.db }); 
    var cookie   = require('cookie-parser')("SECRET"); 
    io.use(function(socket, callback) { 
     if (socket.request.headers.cookie) { 
      cookie(socket.request, null, function(err) { 
       sessionStore.get(socket.request.signedCookies["connect.sid"], function(err, session) { 
        if (err || !session) { 
         callback('Session error', false); 
        } else { 
         socket.request.sessionID = socket.request.signedCookies["connect.sid"]; 
         console.log(socket.request.sessionID); 
         callback(null, true); 
        } 
        }); 
      }); 
     } 
     else { 
      return callback('No session.', false); 
     } 
    }); 
    io.on('connection', function(socket) { 
     console.log(socket.request.sessionID); 
    }); 
Các vấn đề liên quan