2012-07-26 55 views
7

Máy tính xách tay thường đi ngủ. Điều này làm cho client socket.io ngắt kết nối. Khi người dùng quay lại ứng dụng web, ứng dụng khách socket.io không cố gắng kết nối lại (có thể giới hạn kết nối lại đã đạt được?). Làm cách nào để tôi yêu cầu ổ cắm kết nối lại nếu người dùng thực hiện một số thao tác?Làm thế nào để kết nối lại máy khách socket.io hoạt động sau khi tự động kết nối lại lần?

Ví dụ: tôi muốn có chức năng emit để kiểm tra xem kết nối có đang hoạt động hay không và nếu không, hãy thử kết nối lại.

Lưu ý: Tôi chỉ cần mã JS phía máy khách và tôi không sử dụng node.js.

Trả lời

2

Bạn có thể cố gắng sử dụng các sự kiện connect.failed:

socket.on('connect_failed', function() { 
    /* Insert code to reestablish connection. */ 
}); 
+0

Tôi cố gắng đó đã. Vấn đề là connect_failed không được kích hoạt sau khi máy tính xách tay thức dậy hoặc sau khi một mạng không dây bị mất được kết nối lại. Đó là lý do tại sao tôi đang nghĩ đến việc buộc phải kết nối lại với hoạt động của người dùng, nhưng tôi không biết cách thực hiện nó. –

+0

+1 vì phương pháp này được gọi khi máy tính xách tay thức dậy. Nhưng tôi vẫn cần một cách để thử kết nối lại sau khi thời gian tự động kết nối lại và socket.io bỏ cuộc, chẳng hạn như khi không có kết nối mạng. –

4

trường hợp Ổ cắm có một nội tâm 'ổ cắm' bất động sản, do đó có kết nối() phương pháp mà bạn có thể gọi. Nó thường được gọi tự động khi bạn khởi tạo đối tượng (được điều khiển bởi tùy chọn 'tự động kết nối'). Ổ cắm bên trong cũng có một thuộc tính "kết nối" boolean mà bạn có thể kiểm tra nếu bạn không chắc chắn trạng thái là gì. Giống như vậy:

sio = io.connect(); 
//... time passes ... 
if (! sio.socket.connected) { 
    sio.connect(); 
} 

Phương thức connect() kiểm tra để đảm bảo rằng ổ cắm không cố gắng kết nối, mặc dù vì một lý do nào đó nó không kiểm tra xem nó đã được kết nối chưa. Không chắc chắn điều gì sẽ xảy ra nếu bạn kết nối() ổ cắm đã được kết nối ...

Mã nguồn cho thư viện khách hàng khá rõ ràng và được nhận xét tốt, rất tốt vì the README on github không cung cấp nhiều trợ giúp. Thật tiện lợi khi sử dụng phiên bản chưa được rút gọn của thư viện trong khi bạn đang phát triển để có thể đào sâu vào nguồn.

+0

Cảm ơn Dirk. Tôi sẽ đặt cái này ở đâu để nói socket.io có thể kết nối lại nếu không được kết nối bất cứ khi nào máy khách cố gửi một cái gì đó đến máy chủ? –

+0

Phụ thuộc rất nhiều vào cách mã của bạn được cấu trúc. Bạn có thể đặt một wrapper xung quanh emit() để kiểm tra trạng thái kết nối. Bạn có thể có chức năng bật ("ngắt kết nối") bật lên một hộp thoại hỏi xem người dùng có muốn kết nối lại hay không. Bạn cũng sẽ phải thử nghiệm để xem những gì thực sự xảy ra khi bạn đóng nắp trên một máy tính xách tay. Bạn không chắc chắn mã socket.io sẽ nhận ra rằng ... –

7

Trong phiên bản 0.9 bạn có thể cố gắng thiết lập các tùy chọn kết nối phản đối một số cài đặt hung hăng:

var main = io.connect('/', { 
    'reconnection delay': 100, // defaults to 500 
    'reconnection limit': 100, // defaults to Infinity 
    'max reconnection attempts': Infinity // defaults to 10 
    }); 

Lưu ý rằng max reconnection attemps không có nghĩa là khách hàng io sẽ dừng lại để kết nối đến máy chủ sau 10 thất bại nỗ lực. Nếu nó có thể kết nối lại với máy chủ 10 lần và mất kết nối lần thứ 11, nó sẽ dừng lại để kết nối lại.

Xem Socket.IO Configuration

-1

Bạn có thể có một chạy setInterval mà kiểm tra tình trạng kết nối như

s.connect() 

if (! s.socket.connected) { 
    s.connect(); 
Các vấn đề liên quan