現(xiàn)在網(wǎng)絡環(huán)境錯綜復雜,socket心跳包是獲得健康強壯的連接的有效解決方案,今天,我們就在web socket中實現(xiàn)心跳包方案,是的,盡管我們只是做一個簡單的聊天室,但我們讓他穩(wěn)定可靠一些一點也沒有錯。
我的心跳包方案很是簡單,原理就是間隔發(fā)送心跳包數(shù)據(jù)給服務器,服務器在一定時間內(nèi)發(fā)回心跳包響應,對比超時限定,如果超過設定的超時時間,則認為當前與服務器的websocket連接已經(jīng)斷開,關閉當前web socket連接,善后處理,例如重新連接,或者彈出提示……
比較有用的核心代碼是這樣子的:
function keepalive( ws ){
var time = new Date();
if( last_health != -1 && ( time.getTime() - last_health > health_timeout ) ){
//此時即可以認為連接斷開,可設置重連或者關閉連接
$("#keeplive_box").html( "服務器沒有響應." ).css({"color":"red"});
//ws.close();
}
else{
$("#keeplive_box").html( "連接正常" ).css({"color":"green"});
if( ws.bufferedAmount == 0 ){
ws.send( '~H#C~' );
}
}
}
這就是心跳函數(shù),發(fā)送心跳包和檢測心跳健康度。我們將其植入到websocket的onopen事件中,來開啟心跳檢測。像這樣:
var ws = new WebSocket( to_url );
ws.onopen=function(){
$("#statustxt").html("connected.");
$("#send_btn").attr("disabled", false);
heartbeat_timer = setInterval( function(){keepalive(ws)}, 1000 );
}
是的,這樣子就可以實現(xiàn)web socket的心跳包,這里有些類似于多線程的發(fā)送方式,在發(fā)送心跳包的同時,并不影響正常的數(shù)據(jù)通信,我們的例子還是以上次的websocket聊天室來改進,我們可以發(fā)現(xiàn),心跳包運行過程中,并不會干擾到我們的正常聊天。服務端我也進行了一些修改,原理類似,在超過一定時間內(nèi)都沒有收到客戶端發(fā)來的心跳包,則認為該客戶端已經(jīng)掉線,關閉連接,收回資源。
Demo在這里:http://www.zendstudio.net/libs/websocket/chat/demo2.html
現(xiàn)在,有一個新的問題出現(xiàn),如果我們要用php socket來模擬心跳包技術,該怎么實現(xiàn)?各位路過的朋友請多指教,感恩戴德。