2012-03-14 49 views
10

Trong sản xuất, tôi có một trò chơi sử dụng các biến kết nối cục bộ để giữ trạng thái trò chơi. Tuy nhiên tôi nhận thấy rằng nếu tôi nhàn rỗi trong một thời gian nhất định trên kết nối, nó sẽ ngắt kết nối và kết nối lại sẽ mất trạng thái hiện tại. Trong các thử nghiệm của tôi trên một máy chủ địa phương, tôi không bao giờ nhận thấy hành vi này. Đây có phải là hành vi chuẩn cho các kết nối socket hoặc là một thứ khác khiến cho các kết nối bị ngắt.Kết nối NodeJS + Socket.io giảm/kết nối lại?

Nếu đó là hành vi bình thường thì điều này thường được xử lý như thế nào? Giá trị kết nối có nên được lưu trữ trên toàn cầu để chúng có thể được khôi phục nếu người dùng thả/kết nối lại không?

Trả lời

22

Sự cố của bạn sắp hết thời gian chờ của ổ cắm. Nếu không có hoạt động nào trên một ổ cắm nào đó, socket.io sẽ tự động đóng nó.

Khắc phục dễ dàng (và hack) là gửi nhịp tim cho khách hàng được kết nối để tạo hoạt động và dừng ổ cắm khỏi thời gian chờ.

Server:

function sendHeartbeat(){ 
    setTimeout(sendHeartbeat, 8000); 
    io.sockets.emit('ping', { beat : 1 }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.on('pong', function(data){ 
     console.log("Pong received from client"); 
    }); 
} 

setTimeout(sendHeartbeat, 8000); 

Chủ đầu tư:

socket.on('ping', function(data){ 
     socket.emit('pong', {beat: 1}); 
    }); 

biết thêm thông tin:

Bạn có thể tìm thêm thông tin về cấu hình socket.io here.

EDIT: Mark nhận xét rằng nếu người dùng sẽ mất kết nối (kết nối giảm xuống kết thúc vì sự cố internet), bạn sẽ có thể khôi phục người dùng về trạng thái cuối cùng của mình.

Để làm điều đó, cách tốt nhất là sử dụng phương pháp đã được sử dụng rộng rãi để lưu trữ dữ liệu người dùng, cookie và phiên.

Hướng dẫn thực hiện rất tốt về cách thực hiện điều này located here. Mặc dù ông sử dụng Express để thiết lập các tập tin cookie, bạn có thể làm điều này bằng cách sử dụng bất cứ điều gì (tôi làm điều đó bằng cách sử dụng đường ray). Sử dụng phương pháp này, bạn có thể lưu trữ dữ liệu người dùng trong cookie và tìm nạp nó trong quá trình bắt tay. Từ đó bạn chỉ có thể truy cập dữ liệu bằng cách sử dụng socket.handshake.data.

+0

Giải pháp khá thông minh, cảm ơn bạn :) –

+2

Đây là giải pháp thông minh nhưng nó sẽ giữ máy chủ và khách hàng bận rộn với ping pong :-(bất kỳ giải pháp nào khác? –

0

Những gì bạn cần làm là tạo hoặc xác định phiên cho mỗi lần kết nối (lại). Bạn có thể giảm số lần kết nối lại theo câu trả lời của Moox ở trên nhưng vẫn không an toàn - ví dụ: người dùng mất kết nối wifi cho một chút, vv Nói cách khác - duy trì siêu dữ liệu người dùng mỗi phiên chứ không phải trên mỗi socket và thỉnh thoảng ngắt kết nối và kết nối lại.

+0

Bạn nói đúng, tôi đã chỉnh sửa câu hỏi của mình để xem xét. – Moox

+0

Những gì tôi đã làm trong ứng dụng của tôi là duy trì dữ liệu người dùng mỗi phiên chứ không phải kết nối socket.io và quản lý các phiên trên mỗi người dùng kết nối/ngắt kết nối. Tôi không nghĩ rằng tính năng này thực sự là "tương thích" trong cách socket.io hoạt động. Cố gắng sử dụng nó và bỏ nó, do liên tục ngắt kết nối/kết nối lại. – Mark

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