本發(fā)明涉及通信技術(shù)領(lǐng)域,特別是涉及一種實(shí)時(shí)同步方法和裝置。
背景技術(shù):
目前,在許多應(yīng)用場(chǎng)景中要求客戶端和服務(wù)器持續(xù)同步,以便客戶端及時(shí)獲得服務(wù)器側(cè)的最新數(shù)據(jù)。例如:社交網(wǎng)絡(luò)、實(shí)時(shí)競(jìng)拍、股價(jià)查詢等應(yīng)用場(chǎng)景都要求客戶端可以及時(shí)獲得服務(wù)器側(cè)更新的數(shù)據(jù)。然而,關(guān)于實(shí)時(shí)同步的相關(guān)開源技術(shù)較少,如果要基于終端APP(Application,應(yīng)用程序)提供實(shí)時(shí)同步服務(wù),需要單獨(dú)開發(fā)一套動(dòng)態(tài)、可擴(kuò)展的實(shí)時(shí)同步系統(tǒng),但是成本較高。
現(xiàn)有的實(shí)時(shí)同步基本通過輪詢的方式實(shí)現(xiàn)。以實(shí)時(shí)競(jìng)拍為例,終端側(cè)的客戶端根據(jù)競(jìng)拍狀態(tài)的改變調(diào)用終端API(Application Programming Interface,應(yīng)用程序編程接口)輪詢服務(wù)器,從服務(wù)器獲取最新的競(jìng)拍數(shù)據(jù),以便同步更新終端側(cè)的用戶界面,并且,在此過程中,客戶端還需適時(shí)地獲取服務(wù)端的時(shí)間,將客戶端本地的時(shí)間同步為與服務(wù)器相同,進(jìn)而實(shí)現(xiàn)客戶端的計(jì)時(shí)系統(tǒng)與服務(wù)器的時(shí)間同步。
但是,輪詢?yōu)閱喂ねㄐ?,輪詢需要客戶端不斷地向服?wù)器發(fā)出HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)請(qǐng)求,服務(wù)器僅在更新數(shù)據(jù)之后向客戶端返回最新的數(shù)據(jù)。客戶端大量輪詢服務(wù)器,而服務(wù)器并不是總有數(shù)據(jù)更新,這樣就造成客戶端向服務(wù)器發(fā)送了大量的不必要的請(qǐng)求,造成浪費(fèi)流量的同時(shí)給服務(wù)器增加了壓力;而且客戶端和服務(wù)器分別進(jìn)行倒計(jì)時(shí),如果客戶端從服務(wù)器獲取時(shí)間的過程中,出現(xiàn)網(wǎng)絡(luò)信號(hào)質(zhì)量較差、數(shù)據(jù)傳輸擁堵、客戶端對(duì)時(shí)間的處理響應(yīng)速度慢等問題,將會(huì)使客戶端和服務(wù)器之間出現(xiàn)時(shí)間誤差,客戶端和服務(wù)器時(shí)間不同步,數(shù)據(jù)實(shí)時(shí)性較差。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明一種實(shí)時(shí)同步方法和裝置,用以解決現(xiàn)有同步方式會(huì)造成客戶端向服務(wù)器發(fā)送了大量的不必要的請(qǐng)求且實(shí)時(shí)性差的問題。
針對(duì)上述技術(shù)問題,本發(fā)明是通過以下技術(shù)方案來解決的:
本發(fā)明提供了一種實(shí)時(shí)同步方法,在客戶端側(cè)執(zhí)行,所述方法包括:通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接;基于所述長(zhǎng)連接,向所述服務(wù)器發(fā)送針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求;接收所述服務(wù)器根據(jù)所述訂閱請(qǐng)求返回的所述數(shù)據(jù)對(duì)象的更新信息以及隨所述更新信息一同返回的所述服務(wù)器的當(dāng)前時(shí)間信息,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
其中,所述方法還包括:如果距離上一次接收到所述服務(wù)器返回的更新信息的時(shí)間達(dá)到預(yù)設(shè)時(shí)長(zhǎng),則每隔預(yù)設(shè)時(shí)間段向所述服務(wù)器發(fā)送一次心跳包,以便保持所述長(zhǎng)連接有效。
其中,所述方法還包括:在向所述服務(wù)器發(fā)送心跳包之后,如果未接收到所述服務(wù)器針對(duì)所述心跳包返回的應(yīng)答包,則重新通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接。
本發(fā)明提供了一種實(shí)時(shí)同步方法,在服務(wù)器側(cè)執(zhí)行,所述方法包括:通過Websocket協(xié)議和客戶端建立長(zhǎng)連接;基于所述長(zhǎng)連接,接收所述客戶端針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求;根據(jù)所述訂閱請(qǐng)求,在更新所述數(shù)據(jù)對(duì)象對(duì)應(yīng)的信息之后,將所述數(shù)據(jù)對(duì)象的更新信息返回給所述客戶端,并將當(dāng)前時(shí)間信息隨所述更新信息一同返回給所述客戶端,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
其中,所述方法還包括:在接收到所述客戶端發(fā)送的心跳包之后,針對(duì)所述心跳包向所述客戶端返回應(yīng)答包。
本發(fā)明還提供了一種實(shí)時(shí)同步裝置,設(shè)置在客戶端側(cè),所述裝置包括:第一連接模塊,用于通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接;第一發(fā)送模塊,用于基于所述長(zhǎng)連接,向所述服務(wù)器發(fā)送針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求;第一接收模塊,用于接收所述服務(wù)器根據(jù)所述訂閱請(qǐng)求返回的所述數(shù)據(jù)對(duì)象的更新信息以及隨所述更新信息一同返回的所述服務(wù)器的當(dāng)前時(shí)間信息,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
其中,所述第一發(fā)送模塊,還用于:在距離上一次接收到所述服務(wù)器返回的更新信息的時(shí)間達(dá)到預(yù)設(shè)時(shí)長(zhǎng)的情況下,每隔預(yù)設(shè)時(shí)間段向所述服務(wù)器發(fā)送一次心跳包,以便保持所述長(zhǎng)連接有效。
其中,所述第一連接模塊還用于:在所述第一發(fā)送模塊向所述服務(wù)器發(fā)送心跳包之后,如果所述第一接收模塊未接收到所述服務(wù)器針對(duì)所述心跳包返回的應(yīng)答包,則重新通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接。
本發(fā)明還提供了一種實(shí)時(shí)同步裝置,設(shè)置在服務(wù)器側(cè),所述裝置包括:第二連接模塊,用于通過Websocket協(xié)議和客戶端建立長(zhǎng)連接;第二接收模塊,用于基于所述長(zhǎng)連接,接收所述客戶端針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求;第二發(fā)送模塊,用于根據(jù)所述訂閱請(qǐng)求,在更新所述數(shù)據(jù)對(duì)象對(duì)應(yīng)的信息之后,將所述數(shù)據(jù)對(duì)象的更新信息返回給所述客戶端,并將當(dāng)前時(shí)間信息隨所述更新信息一同返回給所述客戶端,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
其中,所述第二發(fā)送模塊,還用于在接收到所述客戶端發(fā)送的心跳包之后,針對(duì)所述心跳包向所述客戶端返回應(yīng)答包。
本發(fā)明有益效果如下:
本發(fā)明的客戶端和服務(wù)器基于Websocket協(xié)議建立長(zhǎng)連接,客戶端和服務(wù)器基于該長(zhǎng)連接可以進(jìn)行雙工通信,避免客戶端對(duì)服務(wù)器進(jìn)行無效輪詢。在長(zhǎng)連接建立之后,客戶端通過訂閱的方式從服務(wù)器獲得數(shù)據(jù)對(duì)象的更新信息以及服務(wù)器的當(dāng)前時(shí)間信息,獲得的更新信息和時(shí)間信息更具時(shí)效性,進(jìn)而可以實(shí)現(xiàn)客戶端和服務(wù)器之間的數(shù)據(jù)同步和時(shí)間同步。
附圖說明
圖1是根據(jù)本發(fā)明第一實(shí)施例的實(shí)時(shí)同步方法的流程圖;
圖2是根據(jù)本發(fā)明第二實(shí)施例的實(shí)時(shí)同步方法的流程圖;
圖3是根據(jù)本發(fā)明第三實(shí)施例的實(shí)時(shí)同步方法的示意圖;
圖4是根據(jù)本發(fā)明第四實(shí)施例的實(shí)時(shí)同步方法的流程圖;
圖5是根據(jù)本發(fā)明第五實(shí)施例的實(shí)時(shí)同步裝置的結(jié)構(gòu)圖;
圖6是根據(jù)本發(fā)明第六實(shí)施例的實(shí)時(shí)同步裝置的結(jié)構(gòu)圖。
具體實(shí)施方式
本發(fā)明基于Websocket協(xié)議,在客戶端和服務(wù)器之間建立長(zhǎng)連接;基于該長(zhǎng)連接,服務(wù)器向客戶端發(fā)送數(shù)據(jù)對(duì)象的更新信息,保證客戶端和服務(wù)器之間的數(shù)據(jù)同步;基于該長(zhǎng)連接服務(wù)器向客戶端發(fā)送服務(wù)器的當(dāng)前時(shí)間信息,包含客戶端和服務(wù)器之間的時(shí)間同步。
WebSocket是HTML5的一種協(xié)議。WebSocket可以實(shí)現(xiàn)客戶端與服務(wù)器之間的全雙工通信(full-duplex),使客戶端和服務(wù)器進(jìn)行實(shí)時(shí)通信。進(jìn)而通過本發(fā)明減少了客戶端對(duì)服務(wù)器的無效輪詢,避免了客戶端向服務(wù)器發(fā)送大量的不必要的請(qǐng)求,并且解決了客戶端和服務(wù)器之間實(shí)時(shí)性差的問題。
以下結(jié)合附圖以及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不限定本發(fā)明。
實(shí)施例一
本實(shí)施例提供一種在客戶端側(cè)執(zhí)行的實(shí)時(shí)同步方法。圖1是根據(jù)本發(fā)明第一實(shí)施例的實(shí)時(shí)同步方法的流程圖。本實(shí)施例的執(zhí)行主體為客戶端。該客戶端例如為瀏覽器客戶端。
步驟S110,基于Websocket協(xié)議和服務(wù)器之間建立長(zhǎng)連接。
長(zhǎng)連接是指通信雙方在一個(gè)連接上可以連續(xù)發(fā)送多個(gè)數(shù)據(jù)包。進(jìn)一步地,該長(zhǎng)連接為套接字Socket連接。
長(zhǎng)連接的建立過程為客戶端和服務(wù)器的握手過程??蛻舳讼蚍?wù)器發(fā)起握手請(qǐng)求,服務(wù)器對(duì)該握手請(qǐng)求進(jìn)行響應(yīng),客戶端和服務(wù)器之間的長(zhǎng)連接建立完成。進(jìn)一步地,該建立過程可以借助HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)請(qǐng)求來完成。
步驟S120,基于所述長(zhǎng)連接,向所述服務(wù)器發(fā)送針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求。
數(shù)據(jù)對(duì)象是指具有一組不同性質(zhì)或者屬性的事物。該事物可以是實(shí)體對(duì)象的抽象。例如:數(shù)據(jù)對(duì)象為一輛汽車,可以通過該汽車的屬性來描述該汽車。
訂閱請(qǐng)求用于請(qǐng)求服務(wù)器在數(shù)據(jù)對(duì)象的信息發(fā)生改變時(shí)返回該數(shù)據(jù)對(duì)象變化后的更新信息,以便使客戶端和服務(wù)器之間的數(shù)據(jù)是同步的。在訂閱請(qǐng)求中攜帶數(shù)據(jù)對(duì)象的信息,如數(shù)據(jù)對(duì)象的ID。
例如:用戶打開實(shí)時(shí)競(jìng)拍界面,查看正在競(jìng)拍中的車輛信息,如競(jìng)拍價(jià)格,這時(shí)可以向服務(wù)器發(fā)送訂閱請(qǐng)求,在競(jìng)拍價(jià)格變化之后,由服務(wù)器負(fù)責(zé)將該變化后的競(jìng)拍價(jià)格反饋給客戶端,使客戶端可以顯示最新的競(jìng)拍價(jià)格。
步驟S130,接收所述服務(wù)器根據(jù)所述訂閱請(qǐng)求返回的所述數(shù)據(jù)對(duì)象的更新信息以及隨所述更新信息一同返回的所述服務(wù)器的當(dāng)前時(shí)間信息,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
服務(wù)器的當(dāng)前時(shí)間信息可以是服務(wù)器的系統(tǒng)時(shí)間或者服務(wù)器的計(jì)時(shí)時(shí)間。
在接收到數(shù)據(jù)對(duì)象的更新信息之后,根據(jù)該更新信息,對(duì)客戶端側(cè)的該數(shù)據(jù)對(duì)象的當(dāng)前信息進(jìn)行更新并顯示,保證客戶端和服務(wù)器的數(shù)據(jù)一致性。進(jìn)一步地,在顯示數(shù)據(jù)對(duì)象的信息時(shí),可以采用模塊化顯示方式,即將顯示頁(yè)面劃分成多個(gè)顯示區(qū)域,每個(gè)區(qū)域始終用于顯示一類內(nèi)容。例如:第一顯示區(qū)域用于顯示時(shí)間的相關(guān)信息,第二顯示區(qū)域用于顯示數(shù)據(jù)對(duì)象的相關(guān)信息。
在接收到服務(wù)器的當(dāng)前時(shí)間信息后,根據(jù)服務(wù)器的當(dāng)前時(shí)間信息對(duì)客戶端的當(dāng)前時(shí)間信息進(jìn)行校準(zhǔn),使客戶端的當(dāng)前時(shí)間和服務(wù)器的當(dāng)前時(shí)間相同,保證客戶端和服務(wù)器的時(shí)間一致性??蛻舳说漠?dāng)前時(shí)間信息可以是客戶端側(cè)的系統(tǒng)時(shí)間或者客戶端的計(jì)時(shí)時(shí)間(定時(shí)時(shí)間)。
在長(zhǎng)連接建立之后,為了保持該長(zhǎng)連接有效,客戶端每隔預(yù)定時(shí)間向服務(wù)器發(fā)送心跳包,服務(wù)器在接收到心跳包之后向客戶端發(fā)送應(yīng)答包。客戶端如果在預(yù)定時(shí)間段內(nèi)沒有收到應(yīng)答包,則說明長(zhǎng)連接已經(jīng)斷開,需要進(jìn)行重連接,這時(shí)客戶端基于Websocket協(xié)議重新和服務(wù)器之間建立長(zhǎng)連接。進(jìn)一步地,如果距離上一次接收到所述服務(wù)器返回的更新信息的時(shí)間達(dá)到預(yù)設(shè)時(shí)長(zhǎng),則每隔預(yù)設(shè)時(shí)間段向所述服務(wù)器發(fā)送一次心跳包,以便保持所述長(zhǎng)連接有效。在向所述服務(wù)器發(fā)送心跳包之后,如果未接收到所述服務(wù)器針對(duì)所述心跳包返回的應(yīng)答包,則判定該長(zhǎng)連接斷開,重新通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接。
在本實(shí)施例中,客戶端和服務(wù)器基于長(zhǎng)連接可以進(jìn)行雙工通信,避免客戶端對(duì)服務(wù)器進(jìn)行無效輪詢。
在本實(shí)施例中,在長(zhǎng)連接建立之后,通過訂閱的方式從服務(wù)器獲得數(shù)據(jù)對(duì)象的更新信息以及服務(wù)器的當(dāng)前時(shí)間信息,獲得的更新信息和時(shí)間信息更具時(shí)效性,進(jìn)而可以實(shí)現(xiàn)客戶端和服務(wù)器之間的數(shù)據(jù)同步和時(shí)間同步。進(jìn)一步地,在本實(shí)施例中,服務(wù)器在向客戶端返回更新信息時(shí)將當(dāng)前時(shí)間信息一同返回,根據(jù)服務(wù)器的當(dāng)前時(shí)間信息對(duì)客戶端的當(dāng)前時(shí)間進(jìn)行校準(zhǔn),保證客戶端和服務(wù)器之間的時(shí)間同步。
實(shí)施例二
本實(shí)施例提供一種在服務(wù)器側(cè)執(zhí)行的實(shí)時(shí)同步方法。圖2是根據(jù)本發(fā)明第二實(shí)施例的實(shí)時(shí)同步方法的流程圖。本實(shí)施例的執(zhí)行主體為服務(wù)器。
步驟S210,通過Websocket協(xié)議和客戶端建立長(zhǎng)連接。
服務(wù)器基于Websocket協(xié)議與客戶端建立長(zhǎng)連接。服務(wù)器接收客戶端發(fā)送的握手請(qǐng)求,對(duì)該握手請(qǐng)求進(jìn)行響應(yīng),進(jìn)而建立長(zhǎng)連接。
步驟S220,基于所述長(zhǎng)連接,接收所述客戶端針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求。
步驟S230,根據(jù)所述訂閱請(qǐng)求,在更新所述數(shù)據(jù)對(duì)象對(duì)應(yīng)的信息之后,將所述數(shù)據(jù)對(duì)象的更新信息返回給所述客戶端,并將當(dāng)前時(shí)間信息隨所述更新信息一同返回給所述客戶端。
根據(jù)所述訂閱請(qǐng)求針對(duì)的數(shù)據(jù)對(duì)象,監(jiān)控該數(shù)據(jù)對(duì)象的信息是否發(fā)生改變,如果發(fā)生改變,則將改變后的信息發(fā)送給客戶端,即將該數(shù)據(jù)對(duì)象的更新信息返回給客戶端,以便客戶端和服務(wù)器兩側(cè)的數(shù)據(jù)同步。
為了使客戶端和服務(wù)器的時(shí)間同步,可以在向客戶端返回更新信息時(shí),將服務(wù)器的當(dāng)前時(shí)間信息一同返回給客戶端。
為了保持長(zhǎng)連接有效,在長(zhǎng)連接建立之后,會(huì)接收到客戶端發(fā)送的心跳包,在接收到客戶端發(fā)送的心跳包之后,針對(duì)該心跳包向客戶端返回應(yīng)答包。
在本實(shí)施例中,服務(wù)器接受客戶端對(duì)數(shù)據(jù)對(duì)象的更新信息的訂閱,進(jìn)而在數(shù)據(jù)對(duì)象的信息發(fā)生更新時(shí),主動(dòng)將更新信息發(fā)送給客戶端,并且將當(dāng)前時(shí)間信息一同發(fā)送給客戶端,使客戶端側(cè)的數(shù)據(jù)對(duì)象信息和時(shí)間信息和服務(wù)器保持同步。
實(shí)施例三
下面對(duì)本發(fā)明的實(shí)時(shí)同步方法進(jìn)行進(jìn)一步地的說明。
圖3是根據(jù)本發(fā)明第三實(shí)施例的實(shí)時(shí)同步方法的示意圖。
Login,表示打開客戶端。該客戶端例如是瀏覽器客戶端。進(jìn)一步地,在瀏覽器客戶端中打開所需的網(wǎng)頁(yè),顯示該網(wǎng)頁(yè)的界面。
Open,表示啟動(dòng)套接字Socket。
Connect,表示通過WebSocket協(xié)議建立客戶端與服務(wù)器的長(zhǎng)連接。
Subscribe,表示客戶端向服務(wù)器發(fā)送針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求,以便服務(wù)器根據(jù)該訂閱請(qǐng)求在該數(shù)據(jù)對(duì)象的信息發(fā)生改變(更新),能夠及時(shí)主動(dòng)地將該改變后的信息發(fā)送給客戶端。
Heartbeat,表示心跳監(jiān)測(cè)??蛻舳嗣扛纛A(yù)定時(shí)間段向服務(wù)器發(fā)送一次心跳包(ping),服務(wù)器在接收到該心跳包之后返回應(yīng)答包(pong)。
倒三角重連機(jī)制,用于通過計(jì)時(shí)器timer對(duì)長(zhǎng)連接的閑置時(shí)間進(jìn)行計(jì)時(shí)。閑置時(shí)間是指距離上一次接收到服務(wù)器返回的信息的時(shí)間長(zhǎng)度。如果閑置時(shí)間達(dá)到預(yù)設(shè)時(shí)長(zhǎng),則啟動(dòng)心跳監(jiān)測(cè),如果客戶端的網(wǎng)絡(luò)監(jiān)測(cè)模塊netjudger判定服務(wù)器未返回應(yīng)答包,則Reconnect重新連接服務(wù)器。
在客戶端側(cè),如果距離上一次接收到服務(wù)器返回的信息的時(shí)間到達(dá)預(yù)設(shè)時(shí)長(zhǎng)(如60s),則客戶端每隔預(yù)定時(shí)間段向服務(wù)器發(fā)送心跳包,服務(wù)器在接收到該心跳包之后返回應(yīng)答包,這樣可以判斷客戶端和服務(wù)器之間的長(zhǎng)連接是否異常,如果異常,則客戶端重新和服務(wù)器建立長(zhǎng)連接??蛻舳巳绻谝欢螘r(shí)間內(nèi)接收到心跳包對(duì)應(yīng)的應(yīng)答包,則長(zhǎng)連接正常,反之長(zhǎng)連接異常。上述信息可以是更新信息也可以是其他信息。長(zhǎng)連接異常例如是:網(wǎng)線被拔掉、網(wǎng)絡(luò)阻塞等網(wǎng)絡(luò)故障問題。
Close,表示監(jiān)測(cè)長(zhǎng)連接斷開的次數(shù),如果客戶端和服務(wù)器之間的長(zhǎng)連接斷開的次數(shù)超過次數(shù)閾值,則判斷基于該長(zhǎng)連接未收到服務(wù)器的應(yīng)答包的時(shí)間是否超過預(yù)設(shè)應(yīng)答時(shí)間閾值,如果是,則主動(dòng)斷開該長(zhǎng)連接,在需要從服務(wù)器獲得更新信息以及服務(wù)器的當(dāng)前時(shí)間信息時(shí),再由Reconnect重新和服務(wù)器建立長(zhǎng)連接。
如果數(shù)據(jù)對(duì)象的數(shù)量為多個(gè),則可以建立消息訂閱隊(duì)列Subscribe queue,將多個(gè)數(shù)據(jù)對(duì)象的信息存入該消息訂閱隊(duì)列,并順次為消息訂閱隊(duì)列中的每個(gè)數(shù)據(jù)對(duì)象向服務(wù)器訂閱更新消息。
實(shí)施例四
由于實(shí)時(shí)競(jìng)拍場(chǎng)景對(duì)數(shù)據(jù)同步和時(shí)間同步的要求較高,下面針對(duì)實(shí)時(shí)競(jìng)拍場(chǎng)景,對(duì)本發(fā)明的實(shí)時(shí)同步方法進(jìn)行進(jìn)一步的描述。本實(shí)施例在瀏覽器客戶端側(cè)執(zhí)行,數(shù)據(jù)對(duì)象為車輛。本實(shí)施例的執(zhí)行主體為客戶端。
圖4是根據(jù)本發(fā)明第四實(shí)施例的實(shí)時(shí)同步方法的流程示意圖。
步驟1,打開瀏覽器客戶端,進(jìn)入競(jìng)拍界面,并和服務(wù)器建立長(zhǎng)連接。
步驟2,從服務(wù)器側(cè)拉取所有車輛信息。
車輛信息包括:車輛品牌、車輛型號(hào)、過戶類型(公務(wù)車輛、普通車輛)、起拍價(jià)格等信息。
步驟3,對(duì)車輛信息進(jìn)行檢測(cè),識(shí)別需要競(jìng)拍的車輛以及競(jìng)拍順序。
步驟4,按照競(jìng)拍順序獲取車輛信息并顯示,同時(shí)向服務(wù)器訂閱該車輛信息的變化。
對(duì)車輛信息中的競(jìng)拍日期和競(jìng)拍時(shí)間進(jìn)行檢測(cè),識(shí)別當(dāng)日需要競(jìng)拍的車輛以及競(jìng)拍順序;在當(dāng)日需要競(jìng)拍的車輛中,根據(jù)競(jìng)拍時(shí)間對(duì)車輛信息進(jìn)行排序,從第一個(gè)需要競(jìng)拍的車輛開始,順序獲取車輛信息并在競(jìng)拍界面中進(jìn)行顯示。
可以將需要競(jìng)拍的多個(gè)車輛的車輛信息存儲(chǔ)在消息訂閱隊(duì)列中,每從消息訂閱隊(duì)列中獲取一個(gè)車輛信息,就向服務(wù)器訂閱該車輛信息的變化。
步驟5,接收服務(wù)器發(fā)送的該車輛信息對(duì)應(yīng)的競(jìng)拍狀態(tài)并顯示。
競(jìng)拍狀態(tài)包括等待中和競(jìng)拍中。等待中為競(jìng)拍中之前的競(jìng)拍狀態(tài)。
等待中是指該車輛信息對(duì)應(yīng)的車輛尚未開始競(jìng)拍。
競(jìng)拍中是指該車輛信息對(duì)應(yīng)的車輛已經(jīng)開始競(jìng)拍。
步驟6,判斷該競(jìng)拍狀態(tài)是否為競(jìng)拍中;如果是,則執(zhí)行步驟7;如果否,則執(zhí)行步驟5。
步驟7,啟動(dòng)定時(shí)器并顯示定時(shí)器的定時(shí)信息。
定時(shí)器為倒計(jì)時(shí)定時(shí)器。進(jìn)一步地,在客戶端內(nèi)核中通常提供計(jì)時(shí)功能,通過該計(jì)時(shí)功能創(chuàng)建當(dāng)前競(jìng)拍車輛的對(duì)應(yīng)的定時(shí)器。
定時(shí)信息用于提示用戶距離拍賣該車輛信息對(duì)應(yīng)的車輛結(jié)束的時(shí)間。例如:距離結(jié)束時(shí)間還有1分鐘50秒。
步驟8,接收服務(wù)器發(fā)送的該車輛信息的變化以及服務(wù)器的計(jì)時(shí)時(shí)間。
服務(wù)器的計(jì)時(shí)時(shí)間為距離拍賣該車輛信息對(duì)應(yīng)的車輛結(jié)束的時(shí)間。
車輛信息的變化包括:車輛競(jìng)拍價(jià)格的變化。
服務(wù)器在發(fā)送車輛信息的變化以及服務(wù)器的計(jì)時(shí)時(shí)間時(shí),可以使用樂觀鎖,為車輛信息的變化以及服務(wù)器的計(jì)時(shí)時(shí)間時(shí)添加版本號(hào),以保證在數(shù)據(jù)同步和時(shí)間同步的過程,客戶端使用正確的數(shù)據(jù)進(jìn)行數(shù)據(jù)更新。
步驟9,根據(jù)該車輛信息的變化對(duì)該車輛信息進(jìn)行更新并顯示更新后的車輛信息,并且根據(jù)服務(wù)器的計(jì)時(shí)時(shí)間對(duì)定時(shí)器的定時(shí)信息進(jìn)行校準(zhǔn)并顯示校準(zhǔn)后的定時(shí)信息。
客戶端和服務(wù)器在競(jìng)拍開始出價(jià)后,實(shí)時(shí)同步服務(wù)器的競(jìng)拍價(jià)格、計(jì)時(shí)時(shí)間等信息到客戶端,保證客戶端和服務(wù)器的數(shù)據(jù)同步和時(shí)間同步。避免客戶端定期輪詢服務(wù)器詢問車輛信息的變化和計(jì)時(shí)時(shí)間的問題,因此在本實(shí)施例中,客戶端能夠及時(shí)快速得到服務(wù)器端最新數(shù)據(jù)。
為了避免在競(jìng)拍中客戶端和服務(wù)器之間的長(zhǎng)連接異常造成的競(jìng)拍失敗的問題,客戶端可以選擇定時(shí)器定時(shí)到預(yù)定時(shí)刻時(shí),如定時(shí)器倒計(jì)時(shí)到15S和3S時(shí),客戶端和服務(wù)器建立短連接,從服務(wù)器獲取車輛信息的變化和當(dāng)前的計(jì)時(shí)時(shí)間,斷開該短連接并對(duì)客戶端側(cè)的車輛信息和計(jì)時(shí)時(shí)間進(jìn)行更新。
步驟10,定時(shí)器結(jié)束之后,從服務(wù)器獲取競(jìng)拍結(jié)果并顯示。
競(jìng)拍結(jié)果包括:最終競(jìng)拍價(jià)格和成交信息。
由于參與競(jìng)拍的客戶端數(shù)量可能較多,所以為了避免給服務(wù)器的處理造成壓力,可以在定時(shí)器結(jié)束后的預(yù)定時(shí)間(如2s)從服務(wù)器獲取競(jìng)拍結(jié)果并顯示。
步驟11,判斷需要競(jìng)拍的車輛是否都競(jìng)拍結(jié)束;如果是,則結(jié)束流程,如果否,則跳轉(zhuǎn)到步驟4。
在本實(shí)施例中,采用BidView方式顯示車輛信息、競(jìng)拍狀態(tài)、定時(shí)信息和競(jìng)拍結(jié)果,即采用模塊化顯示方式,將競(jìng)拍界面劃分成多個(gè)顯示區(qū)域,每個(gè)區(qū)域用于顯示一類內(nèi)容。這樣,不同車輛的車輛信息、競(jìng)拍狀態(tài)、定時(shí)信息和競(jìng)拍結(jié)果可以在競(jìng)拍界面的不同顯示區(qū)域分別進(jìn)行加載和渲染,在其中一個(gè)顯示區(qū)域?qū)?yīng)的信息需要更新時(shí),無需重新加載整個(gè)界面,僅加載發(fā)生變化的部分顯示區(qū)域即可,進(jìn)而實(shí)現(xiàn)了競(jìng)拍界面的復(fù)用性。
在本實(shí)施例中,如果服務(wù)器中的數(shù)據(jù)可以采用分布式緩存的方式進(jìn)行存儲(chǔ)。例如分布存儲(chǔ)在多個(gè)緩存服務(wù)器中,這樣可以滿足好了客戶端快速鏈接的需求。如果將數(shù)據(jù)分布存儲(chǔ)在多個(gè)緩存服務(wù)器中,則客戶端需要和數(shù)據(jù)對(duì)象的信息所在的緩存服務(wù)器建立長(zhǎng)連接,以便實(shí)時(shí)獲得最新的數(shù)據(jù)。
實(shí)施例五
本實(shí)施例提供一種設(shè)置在客戶端的實(shí)時(shí)同步裝置。圖5是根據(jù)本發(fā)明第五實(shí)施例的實(shí)時(shí)同步裝置的結(jié)構(gòu)圖。
該設(shè)置在客戶端側(cè)的實(shí)時(shí)同步裝置包括:
第一連接模塊510,用于通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接。
第一發(fā)送模塊520,用于基于所述長(zhǎng)連接,向所述服務(wù)器發(fā)送針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求。
第一接收模塊530,用于接收所述服務(wù)器根據(jù)所述訂閱請(qǐng)求返回的所述數(shù)據(jù)對(duì)象的更新信息以及隨所述更新信息一同返回的所述服務(wù)器的當(dāng)前時(shí)間信息,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
在一個(gè)實(shí)施例中,第一發(fā)送模塊520,還用于在距離上一次接收到所述服務(wù)器返回的更新信息的時(shí)間達(dá)到預(yù)設(shè)時(shí)長(zhǎng)的情況下,每隔預(yù)設(shè)時(shí)間段向所述服務(wù)器發(fā)送一次心跳包,以便保持所述長(zhǎng)連接有效。
在另一實(shí)施例中,第一連接模塊510還用于在所述第一發(fā)送模塊向所述服務(wù)器發(fā)送心跳包之后,如果第一接收模塊530未接收到所述服務(wù)器針對(duì)所述心跳包返回的應(yīng)答包,則重新通過Websocket協(xié)議和服務(wù)器建立長(zhǎng)連接。
本實(shí)施例所述的裝置的功能已經(jīng)在圖1~圖4所示的方法實(shí)施例中進(jìn)行了描述,故本實(shí)施例的描述中未詳盡之處,可以參見前述實(shí)施例中的相關(guān)說明,在此不做贅述。
實(shí)施例六
本實(shí)施例提供一種設(shè)置在服務(wù)器側(cè)的實(shí)時(shí)同步裝置的結(jié)構(gòu)圖。圖6是根據(jù)本發(fā)明第六實(shí)施例的實(shí)時(shí)同步裝置的結(jié)構(gòu)圖。
該設(shè)置在服務(wù)器側(cè)的實(shí)時(shí)同步裝置,包括:
第二連接模塊610,用于通過Websocket協(xié)議和客戶端建立長(zhǎng)連接。
第二接收模塊620,用于基于所述長(zhǎng)連接,接收所述客戶端針對(duì)數(shù)據(jù)對(duì)象的訂閱請(qǐng)求。
第二發(fā)送模塊630,用于根據(jù)所述訂閱請(qǐng)求,在更新所述數(shù)據(jù)對(duì)象對(duì)應(yīng)的信息之后,將所述數(shù)據(jù)對(duì)象的更新信息返回給所述客戶端,并將當(dāng)前時(shí)間信息隨所述更新信息一同返回給所述客戶端,以使所述客戶端和所述服務(wù)器數(shù)據(jù)同步且時(shí)間同步。
在一個(gè)實(shí)施例中,第二發(fā)送模塊630,還用于在接收到所述客戶端發(fā)送的心跳包之后,針對(duì)所述心跳包向所述客戶端返回應(yīng)答包。
本實(shí)施例所述的裝置的功能已經(jīng)在圖1~圖4所示的方法實(shí)施例中進(jìn)行了描述,故本實(shí)施例的描述中未詳盡之處,可以參見前述實(shí)施例中的相關(guān)說明,在此不做贅述。
盡管為示例目的,已經(jīng)公開了本發(fā)明的優(yōu)選實(shí)施例,本領(lǐng)域的技術(shù)人員將意識(shí)到各種改進(jìn)、增加和取代也是可能的,因此,本發(fā)明的范圍應(yīng)當(dāng)不限于上述實(shí)施例。