本發明屬于通信技術領域,特別涉及一種檢測客戶端與服務器之間連接狀態的方法。
背景技術:
在cs架構的程序中,服務器主要提供數據管理、數據共享、數據以及系統維護和并發控制客戶端。客戶端需要針對用戶具體的業務與服務器建立連接,在客戶端與服務器連接前或者連接中,如果連接中斷的話將導致業務處理失敗,造成資源的浪費,更嚴重者可能導致客戶端阻塞崩潰。
針對上述情況,常用的方式是客戶端定時向服務器發送心跳幀,以確認客戶端是否與服務器保持連接,然而,定時發送心跳幀會出現一個問題,例如客戶端每隔20秒向服務器發送一次心跳幀確保在線,如果在確認連接后斷開了連接,這將造成客戶端有一個20秒的錯誤狀態(客戶端認為在線,但實際已經斷線),需要等待20秒后狀態才能正確。在這個階段用戶如果操作客戶端,很容易因為狀態不對造成阻塞或者崩潰的問題。
如果將心跳幀的發送間隔縮短,例如由20秒發送修改為5秒發送,則頻繁的發送容易造成資源的競爭和浪費,增加系統出錯的概率。
如果將心跳幀的發送時間延長,則狀態的更新延時更加嚴重。
技術實現要素:
本發明的目的,在于提供一種客戶端與服務器連接狀態的檢測方法,其可在減少資源浪費與消除連接延時之間達成平衡。
為了達成上述目的,本發明的解決方案是:
一種客戶端與服務器連接狀態的檢測方法,判斷客戶端的狀態屬性是否處于空閑狀態,若客戶端處于空閑狀態,則定時發送心跳幀;若客戶端與服務器正在數據交互中,則即時發送心跳幀。
上述定時發送心跳幀的具體內容是:客戶端定時向服務器發送心跳幀,并判斷是否在指定時間內收到服務器反饋的消息回復,若收到,則表示客戶端與服務器連接正常;若未收到,則客戶端等待設定時間后向服務器重新發送心跳幀。
上述客戶端等待設定時間后向服務器重新發送心跳幀,客戶端在指定時間內收到服務器的消息回復,則表示客戶端與服務器連接正常,等待下一次定時發送心跳幀;若客戶端在指定時間內未收到服務器的消息回復,則判定客戶端和服務器連接中斷,再定時自動重連服務器。
上述客戶端與服務器正在數據交互中,則即時發送心跳幀的具體內容是:若客戶端與服務器正在數據交互中,則客戶端實時向服務器發送心跳幀,并判斷是否在指定時間內收到服務器反饋的消息回復,若收到,則表示客戶端與服務器通信正常,然后開始客戶端與服務器的數據交互;若未收到,則客戶端等待設定時間后向服務器重新發送心跳幀。
上述客戶端等待設定時間后向服務器重新發送心跳幀,客戶端在指定時間內收到服務器的消息回復,則表示客戶端與服務器連接正常,等待下一次定時發送心跳幀;若客戶端在指定時間內未收到服務器的消息回復,則判定客戶端和服務器連接中斷,再定時自動重連服務器。
采用上述方案后,本發明在客戶端空閑階段定時發送心跳幀,而在需要交互時即時發送心跳幀,這樣,在空閑階段能夠節省資源,而需要交互時則能夠消除連接延時,防止因為延時而導致的服務器和客戶端獲取狀態不一致的情況。本發明消除了心跳幀定時發送導致的延時問題,解決頻繁發送心跳幀導致資源的浪費和競爭,在功能上能夠減少資源浪費和消除延時平衡,不需要為了哪個功能犧牲另一個,在整體結構上簡潔明了,不需要增加系統的復雜性。
附圖說明
圖1是本發明的原理圖。
具體實施方式
以下將結合附圖,對本發明的技術方案及有益效果進行詳細說明。
如圖1所示,本發明提供一種客戶端與服務器連接狀態的檢測方法,包括如下步驟:
步驟1,首先判斷客戶端的狀態屬性是否處于空閑狀態(在客戶端接入服務器的時候默認初始狀態屬性為:未與服務器通信,空閑;當客戶端和服務器數據交互時,客戶端狀態屬性為:與服務器通信中,繁忙),若客戶端處于空閑狀態,則轉步驟2,若客戶端與服務器正在數據交互中,則轉步驟4;
步驟2,當客戶端處于空閑狀態,與服務器沒有業務上的交互需求時,采用定時發送心跳幀的方式:即客戶端定時向服務器發送一條特定格式的消息(即心跳幀),然后進入一個定時等待服務器回復操作;若客戶端與服務器連接正常,則服務器會在收到消息后,向客戶端反饋連接正常的回復,當客戶端在指定時間內收到該回復時,確認兩者連接正常,并將客戶端的狀態屬性更新為:未與服務器通信,空閑,再返回步驟1;若客戶端與服務器連接異常,則客戶端在指定時間內不會接收到服務器的消息回復,則轉步驟3;
步驟3,客戶端發出心跳幀后,在指定時間內未接收到服務器的消息回復,則在到達指定時間時,客戶端會在設定時間后(可設為1s)向服務器重新發送心跳幀,以確認客戶端和服務器的通信情況(因為可能第一次發送的心跳幀產生了丟包現象)。若重發心跳幀后,客戶端在指定時間內成功收到服務器的應答消息,則確認客戶端與服務器連接正常,將客戶端的狀態屬性更新為:未與服務器通信,空閑,再返回步驟1;若重發心跳幀后,在指定時間內仍未能收到服務器的應答消息,則說明客戶端和服務器通信出現異常,更新客戶端的屬性狀態為:與服務器連接中斷,同時客戶端會每隔設定時間(如5s)自動重連服務器,若客戶端重新連接服務器成功,則重新進入步驟1;
步驟4,當客戶端需要與服務器進行數據交互時,客戶端首先向服務器發送心跳幀,詢問與服務器的連接狀態。若客戶端在發送心跳幀后的指定時間內收到服務器的應答,證明客戶端與服務器通信正常,然后開始客戶端與服務器的數據交互,同時更新客戶端的狀態屬性為:與服務器通信中,繁忙;若客戶端在發送心跳幀后,指定時間內未收到服務器的應答消息,則轉步驟5;
步驟5,客戶端發送心跳幀后,若在指定時間內未收到服務器的應答消息,客戶端會在設定時間后(如1s)重發一次心跳幀,確認客戶端和服務器的通信情況(因為可能第一次發送的心跳幀產生了丟包現象)。若重發心跳幀后,客戶端成功收到服務器的應答消息,則證明客戶端與服務器通信正常,開始數據交互,同時更新客戶端的狀態屬性為:與服務器通信中,繁忙;若重發心跳幀后仍未能在指定時間內收到服務器的應答消息,則說明客戶端和服務器通信出現異常,更新客戶端的屬性狀態為:與服務器連接中斷,同時客戶端會每隔設定時間(如5s)自動重連服務器;若客戶端重新連接服務器成功,則重新進入步驟1。
以上實施例僅為說明本發明的技術思想,不能以此限定本發明的保護范圍,凡是按照本發明提出的技術思想,在技術方案基礎上所做的任何改動,均落入本發明保護范圍之內。