2012-03-26 38 views
10

Khi ai đó kết nối với máy chủ nút, tôi giữ một mảng với tất cả các ổ cắm. Bằng cách đó, tôi có thể phát tin nhắn cho mọi người bất cứ khi nào cần hoặc lặp lại người dùng để đếm số người dùng trực tuyến, v.v.node.js không gửi socket ngắt kết nối sự kiện

Tất cả điều này hoạt động tốt, nhưng khi sự kiện ngắt kết nối được kích hoạt, tôi không nhận được một ổ cắm trong các đối số của tôi. Có cách nào khác để biết ổ cắm nào bị ngắt kết nối không?

var allClients = []; 

io.sockets.on('connection', function(socket) { 
    allClients.push(socket); 

    socket.on('disconnect', function(socket) { 
     console.log('Got disconnect!'); 

     var i = allClients.indexOf(socket); 
     delete allClients[i]; 
    }); 
}); 

Tất nhiên ví dụ trên không có tác dụng, vì ngắt kết nối sự kiện không đưa ra tham số socket (hoặc bất kỳ đối số nào khác). Vì vậy, có một sự kiện khác được kích hoạt trước khi ngắt kết nối nơi ổ cắm vẫn còn ở đó?

Ali

Trả lời

22

Bạn đã có ổ cắm, vì trình xử lý ngắt kết nối được khai báo trong phạm vi sự kiện 'kết nối'. Hãy thử loại bỏ các tham số bạn đang đi đến xử lý 'ngắt kết nối', bạn sẽ có thể làm việc với tham số socket từ trình xử lý kết nối.

io.sockets.on('connection', function(socket) { 
    allClients.push(socket); 

    socket.on('disconnect', function() { 
     console.log('Got disconnect!'); 

     var i = allClients.indexOf(socket); 
     delete allClients[i]; 
    }); 
}); 

Ngoài ra, bạn không cần một mảng ổ cắm để phát sóng, bạn có thể sử dụng phòng để ổ cắm nhóm và phát sóng đến tất cả các ổ cắm bên trong căn phòng đó.

+0

nếu tôi cần gửi dữ liệu từ máy khách đến máy chủ như những gì anh ta đã làm trong lần đầu tiên, tôi sẽ không giải quyết bất kỳ giải pháp nào? –

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