2011-11-27 41 views
8

Dưới đây là 2 câu hỏi liên quan. Đăng chúng lại với nhau có ý nghĩa hơn.Tạo danh sách Khách hàng được kết nối bằng socket.io

Câu hỏi 1

Tôi có một ứng dụng Node.js mà phát ra một sự kiện ra cho tất cả các khách hàng, và tất cả các khách hàng hiện tại sẽ phản ứng với một Emit ready. Làm thế nào tôi có thể tạo danh sách tất cả các khách hàng đã trả lời phát ban đầu tiên và loại nhận dạng nào có thể được sử dụng để phân biệt khách hàng?

question2:

Những gì tôi đang cố gắng để làm sau khi thu thập một danh sách khách hàng được kết nối, là để sau đó truy cập vào một bảng cơ sở dữ liệu MySQL của N số hàng và gán cho mỗi khách hàng X hàng mỗi. Những hàng này sẽ được phát lại cho khách hàng tương ứng. Điều này có thể giải quyết như thế nào?

Mã hiện tại cho Qn 1

Node Mã

setInterval(function() { 
    util.log('Checking for new jobs...'); 
    dbCheckQueue(function(results) { // checks if there are new rows to "distribute" to clients 
     if (results.length) { 
      util.log(results.length + ' new jobs found.'); 
      io.sockets.emit('job_available'); 
     } 
    }); 
}, 10*1000); 

Client-side JS Mã

socket.on('job_available', function() { 
       console.log('Job Available.. Responding with Ready!'); 
       socket.emit('ready'); 
      }); 

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

Mã hiện tại cho Qn 2 Mã hoạt động cho một máy khách, nhưng làm cách nào để lặp qua tất cả các máy khách được kết nối và thực hiện cập nhật cùng một cột và chọn các hàng?

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

Trả lời

16

Bạn sẽ cần theo dõi chính các khách hàng được kết nối. Cách đơn giản để làm điều đó sẽ được sử dụng một mảng:

var clients = []; 

io.sockets.on('connect', function(client) { 
    clients.push(client); 

    client.on('disconnect', function() { 
     clients.splice(clients.indexOf(client), 1); 
    }); 
}); 

Sau đó, bạn có thể tham khảo mà clients mảng trên máy chủ bất cứ nơi nào bạn cần, trong ready xử lý sự kiện của bạn hoặc bất cứ điều gì. Một cái gì đó như:

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     clients.forEach(function(client, index) { 
      var client_id = index; // Just use the index in the clients array for now 
      getListings(client_id, function(listings) { 
       socket.emit('job', listings); // send jobs 
      }); 
     }); 
    }); 
}); 
+0

bạn có thể đặt trước logic của hàm getListings(), vì tôi áp dụng giải pháp quen thuộc nhưng tôi thấy trên màn hình trên tên của một người dùng đã đăng nhập đầu tiên. – johannesMatevosyan

+0

Lệnh gọi 'getListings' chỉ là mã mẫu mà tôi đã lấy từ câu hỏi gốc. Tôi không biết nó chứa cái gì hay nó được triển khai như thế nào. – rossipedia

+0

Tôi thấy, bởi vì tôi đang lưu trữ các máy khách trong mảng và khi tôi cố gắng truy xuất chúng với các vòng của 'foreach' hoặc' for', tôi chỉ là tên người dùng đã đăng nhập đầu tiên trong trình duyệt. – johannesMatevosyan

19

Socket.io cung cấp cho bạn với một api công cộng cho rằng, nên thay vì hack cái gì đó lên như Bryan đề nghị bạn có thể sử dụng:

io.sockets.clients() 

Đó sẽ trả về một mảng của tất cả các kết nối khách hàng.

Nếu bạn muốn tất cả khách hàng kết nối với một không gian tên nào đó:

io.of('/namespace').clients() 

Nhưng bạn thậm chí có thể lọc nó thậm chí nhiều hơn .. nếu bạn muốn có tất cả các ổ cắm trong một căn phòng:

io.sockets.clients('room name here as first argument') 

Sẽ trả lại một loạt các ổ cắm được kết nối cho phòng room name here as first argument

+0

Cảm ơn 3rdEden, tôi đã sử dụng giải pháp của Bryan với những sửa đổi nhỏ vì tôi chỉ muốn những khách hàng được kết nối đó trả lời bằng một tin nhắn 'sẵn sàng' được đẩy vào một mảng. Có thể sử dụng API làm điều gì đó theo một cách khác? – Nyxynyx

+0

Thực sự hơi hacking với api sẽ là tốt hơn tất cả các bạn phải làm là một cái gì đó giống như socket.isReady = true; khi đã sẵn sàng được nhận và do đó bạn sẽ tiết kiệm cho mình từ mantaining danh sách khác: P – ShrekOverflow

+0

Đây là con đường để đi! Cảm ơn :) –

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