2012-12-11 30 views
6

Tôi có một ứng dụng nodeJS thêm với io ổ cắm và nhanh như thế này:kết nối người dùng io ổ cắm được thêm vào mỗi lần làm mới trang html?

Server:

var storeEachSocket=[]; 
var io = require('socket.io').listen(80); 
io.sockets.on('connection', function (socket) { 
    storeEachSocket.push(socket); 
    console.log(storeEachSocket.length); 
    var clients = io.sockets.clients(); //clients is an array 
    console.log(clients.length); 
}); 

Chủ đầu tư:

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('http://localhost'); 
</script> 

Hiện nay chỉ có một trang html phục vụ bởi các máy chủ. Tôi thấy rằng, sau khi kết nối ổ cắm được xây dựng giữa html và máy chủ (tại thời điểm này storeEachSocket.length là 1 và clients.length là 1), và nếu tôi làm mới trang html này, cả hai storeEachSocket.length và clients.length sẽ là 2, chỉ ra rằng có 2 kết nối ổ cắm giữa html này và máy chủ. Tôi muốn biết là điều này bình thường? kết nối socket đầu tiên sẽ không chết ngay cả sau khi tôi tạo kết nối socket thứ hai?

Và tôi cũng muốn biết, nếu tôi định theo dõi người dùng này (html), tôi phải làm gì nếu có hai kết nối socket được sử dụng bởi một người dùng?

Trả lời

9

Làm mới trang không thêm kết nối mới, về cơ bản loại bỏ kết nối hiện tại và tạo một kết nối mới khác. Tôi nghĩ rằng bạn nên thêm một người nghe để ngắt kết nối sự kiện và loại bỏ các ổ cắm trong mảng đã bị ngắt kết nối. Tôi cũng không tin rằng io.sockets.clients() sẽ trả về 2 sau khi làm mới như tôi đã thử nghiệm nó trên máy tính của tôi.

Nếu bạn muốn theo dõi người dùng, bạn cần có ID người dùng và lưu trữ nó vào bộ sưu tập cặp khóa/giá trị. Sau đó, bạn có thể hạn chế người dùng tạo 2 kết nối bằng cách kiểm tra bộ sưu tập trong trình xử lý ủy quyền thr.

var storeEachSocket = {}; 
    io.set('authorization', function(handshake, accept){ 
     var user = handshake.query; 
     if(user.id in storeEachSocket) 
     accept('User already connected', false); 
     else 
     accept(null, true); 
    }); 

    io.on('connection', function(socket){ 
     var user = socket.handshake.query; 
     storeEachSocket[user.id] = socket; 
    }); 

    io.on('disconnect', function(socket){ 
     var user = socket.handshake.query; 
     delete storeEachSocket[user.id] 
    }); 
+0

tốt, cảm ơn rất nhiều. – user1893787

+0

socket.handshake.query không chứa socket.handshake.query – Sever

Các vấn đề liên quan