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.
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
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. –
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