2012-03-05 8 views
8

Tôi đang cố gắng thiết lập máy chủ node.js bằng cách sử dụng socket.io. Vấn đề tôi thấy là máy chủ của tôi đang ngắt kết nối + kết nối lại máy khách sau mỗi 25 giây.node.js sockets.io ngắt kết nối mỗi ~ 25 giây (liên quan đến nhịp tim)

Đây là mã máy chủ của tôi:

var io = require('socket.io').listen(5876); 
io.sockets.on('connection', function (socket) 
{ 
    console.log("New connection established"); 

    socket.on('disconnect', function() 
    { 
     console.log("A client has disconnected."); 
    }); 
} 

Khách hàng của tôi kết nối bằng cách sử dụng phân phối socket.io.js. Khi tôi hiểu nó (dường như không chính xác), tôi cần khách hàng của tôi gửi một "nhịp tim" (một thông điệp của ":: 2") mỗi 15 giây để ngăn máy chủ nghĩ rằng kết nối đã chết và ngắt kết nối nó. Về cơ bản:

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

    socket.on('connect', function(data) 
    { 
     console.log("Connected to server."); 
     setInterval(function() { socket.emit("::2"); console.log("sent heartbeat"); }, 15000); // schedule a heartbeat for every 15 seconds 
    }); 
</script> 

Nhưng khách hàng vẫn bị ngắt kết nối + được kết nối lại sau mỗi 25 giây (không bao gồm dấu đầu tiên thứ 25 giây).

Các Node.js máy chủ giao diện điều khiển log trông như thế này (có thể cắt ra một số giống hệt giai đoạn kết nối/ngắt kết nối trước đó, như nó đã được lặp lại mỗi 25 giây):

New connection established 
    debug - emitting heartbeat for client 652791160849839915 
    debug - websocket writing 2:: 
    debug - set heartbeat timeout for client 652791160849839915 
    debug - got heartbeat packet 
    debug - cleared heartbeat timeout for client 652791160849839915 
    debug - set heartbeat interval for client 652791160849839915 
    info - transport end 
    debug - set close timeout for client 652791160849839915 
    debug - cleared close timeout for client 652791160849839915 
    debug - cleared heartbeat interval for client 652791160849839915 
A client has disconnected. 
    debug - discarding transport 
    debug - client authorized 
    info - handshake authorized 5961067041159055274 
    debug - setting request GET /socket.io/1/websocket/5961067041159055274 
    debug - set heartbeat interval for client 5961067041159055274 
    debug - client authorized for 
    debug - websocket writing 1:: 
New connection established 

Làm thế nào tôi có thể ngăn chặn máy chủ của tôi từ ngắt kết nối + kết nối lại máy khách sau mỗi 25 giây?

+0

như xa như tôi biết bạn không cần phải tự gửi các gói nhịp tim như thế này được xử lý bởi socket.io. Hãy thử kiểm tra các sự kiện kết nối và ngắt kết nối sau khi thực hiện các cuộc gọi nhịp tim thủ công của bạn. – f0x

+0

bạn đã bao giờ giải quyết vấn đề này chưa? \t tôi đang gặp vấn đề chính xác. Tôi hạ cấp xuống 0.8.7 và vẫn còn vấn đề tương tự. gỡ lỗi - bắn heartbeat timeout cho khách hàng 3744936361854682925 thông tin - vận chuyển kết thúc gỡ lỗi - thiết lập thời gian chờ đóng cho khách hàng 3744936361854682925 gỡ lỗi - xóa thời gian chờ đóng cho khách hàng 3744936361854682925 –

+0

@PranoyC Có một workaround ở đây có thể làm việc: https://github.com/socketio/socket .io/issues/777 Bên cạnh đó, gần đây tôi đã sử dụng các phiên bản mới nhất của socket.io và không gặp phải bất kỳ sự cố nào. – Josh1billion

Trả lời

9

Bạn đang sử dụng phiên bản mới nhất của socket.io, 0.9.1/0.9.1 -1? Nếu vậy, đây là một vấn đề đã được xác nhận bởi Guillermo. Các khuyến cáo hiện nay là quay trở lại để 0.9.0 hoặc 0.8.7

https://github.com/LearnBoost/socket.io/issues/777

+0

Đó phải là nó; Tôi chỉ cài đặt nó tối qua, vì vậy nó có lẽ là phiên bản mới nhất. Làm thế nào tôi có thể quay trở lại 0.9.0? Tôi đã cài đặt bằng cách sử dụng phương pháp npm được đề xuất như sau: "npm install socket.io" – Josh1billion

+1

Bạn có thể chỉ định phiên bản cụ thể để cài đặt: npm install [email protected] – maroonmed

+0

Ah hoàn hảo, cảm ơn! – Josh1billion

2

bạn không cần phải gửi một nhịp tim để giữ ổ cắm kết nối, cũng là cú pháp của socket.emit là

  socket.emit('event_name',{"data"});