一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng)的制作方法
【專利摘要】本發(fā)明涉及一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),包括:服務(wù)端,該服務(wù)端包括:消息服務(wù)客戶端創(chuàng)建模塊,用于創(chuàng)建給客戶端發(fā)送消息的對(duì)象;消息分發(fā)模塊,用于將消息服務(wù)客戶端創(chuàng)建模塊創(chuàng)建的對(duì)象放入客戶端列表中,并處理各客戶端消息的分發(fā);客戶端,該客戶端包括:連接處理模塊,用于建立與服務(wù)端的連接;消息監(jiān)聽模塊,用于服務(wù)端消息的監(jiān)聽;消息接收模塊,用于服務(wù)端消息的接收;消息發(fā)送模塊,用于發(fā)送消息給服務(wù)器。與現(xiàn)有技術(shù)相比,本發(fā)明通過服務(wù)端的消息輪詢發(fā)送給客戶端的機(jī)制,從而實(shí)現(xiàn)了客戶端和服務(wù)端的雙向通信。
【專利說明】一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種雙向通信系統(tǒng),尤其是涉及一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng)。
【背景技術(shù)】
[0002]thrift是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它是一種跨語言的服務(wù)部署框架,最初由Fackbook于2007年開發(fā),2008年進(jìn)入Apache開源項(xiàng)目,Thrift通過一個(gè)中間語言(IDL,接口定義語言)來定義RPC的接口和數(shù)據(jù)類型,然后通過一個(gè)編譯器生成不同語言的代碼(支持C++,java,Python,PHP, Ruby,C#,Cocoa等),并由生成的代碼負(fù)責(zé)RPC協(xié)議層和傳輸層的實(shí)現(xiàn)。
[0003]Thrift框架能夠?yàn)槲覀兒?jiǎn)化TCP通訊,可以使我們能夠快捷的簡(jiǎn)歷各種語言的客戶端和服務(wù)端,并實(shí)現(xiàn)客戶端對(duì)服務(wù)端的遠(yuǎn)程過程調(diào)用,簡(jiǎn)單的說,就是服務(wù)器通過thrift架構(gòu)對(duì)外開放一些接口,并自己實(shí)現(xiàn)這些接口,如操作文件,操作圖片,文件下載等等,然后客戶端通過thrift架構(gòu)生成的接口,去簡(jiǎn)單的調(diào)用它,我們不需要關(guān)心服務(wù)端實(shí)現(xiàn)的方式,我們只關(guān)注它對(duì)外提供的接口。
[0004]對(duì)于thrift的使用者來說,我們關(guān)心的是接口,或者說方法簽名,而不需要太過關(guān)心數(shù)據(jù),因?yàn)閿?shù)據(jù)本身在傳遞的過程中就應(yīng)該被保護(hù)起來,用面向?qū)ο蟮恼f法就是封裝起來,不對(duì)外公開,這可以大大保證數(shù)據(jù)的安全性,使用thrift架構(gòu),我們不需要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行破壞,在之前的10幾年,我們?cè)谶M(jìn)行數(shù)據(jù)通訊時(shí),最常見的作法就是使用類型標(biāo)識(shí)符來區(qū)別各個(gè)數(shù)據(jù)的作用,如I表示文件上業(yè)務(wù),2表示文件下載業(yè)務(wù),其實(shí)這樣做了之后我們的數(shù)據(jù)結(jié)構(gòu)是混亂的,而有了 thrift之后,我們的數(shù)據(jù)實(shí)現(xiàn)是獨(dú)立的,是職責(zé)分明的,當(dāng)然也是受保護(hù)的,即文件上傳與文件下載的數(shù)據(jù)是相互獨(dú)立的。
[0005]不過,Thrift采用的是C/S模型,不支持雙向通信,client只能遠(yuǎn)程調(diào)用server端的RPC接口,到client端則沒有RPC供server端調(diào)用,這意味著,client端能夠主動(dòng)與server端通信,但server端不能主動(dòng)與cI ient端通信而只能被動(dòng)的對(duì)cI ient端的請(qǐng)求做出應(yīng)答,這種RPC模式在某些應(yīng)用中存在缺陷,比如,有些應(yīng)用,大部分情況下,client端會(huì)主動(dòng)向server端發(fā)請(qǐng)求或者向server端發(fā)送數(shù)據(jù),而在少部分情況下,server端也需要主動(dòng)向client發(fā)送一些命令,告知進(jìn)行某些操作。
[0006]解決這個(gè)問題通常有兩種方法,一種是輪詢模式,即client周期性的問server端是否需要進(jìn)行某些操作,但是這種方法延遲大,且會(huì)浪費(fèi)大量資源,造成不必要的訪問開銷。另一種方式是雙client、server的方式,即通信雙方即是client,又是server,在通信雙方開啟兩個(gè)通信通道,開啟兩個(gè)端口來進(jìn)行通信,不過這個(gè)開發(fā)起來比較繁瑣,而且代碼看起來會(huì)比較晦澀。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的就是為了克服上述現(xiàn)有技術(shù)存在的缺陷而提供一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),通過修改thrift本身來實(shí)現(xiàn)雙向傳輸,避免輪詢操作和雙服務(wù)端機(jī)制,從而提高通過thrift框架實(shí)現(xiàn)雙向通信時(shí)的開發(fā)和運(yùn)行的效率。
[0008]本發(fā)明的目的可以通過以下技術(shù)方案來實(shí)現(xiàn):
[0009]一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,包括:
[0010]服務(wù)端,該服務(wù)端包括:
[0011 ] 消息服務(wù)客戶端創(chuàng)建模塊MessageServiceCl ient,用于創(chuàng)建給客戶端發(fā)送消息的對(duì)象;
[0012]消息分發(fā)模塊MessageDistributor,用于將消息服務(wù)客戶端創(chuàng)建模塊創(chuàng)建的對(duì)象放入客戶端列表中,并處理各客戶端消息的分發(fā);
[0013]客戶端,該客戶端包括:
[0014]連接處理模塊Connect1nStatusMonitor,用于建立與服務(wù)端的連接;
[0015]消息監(jiān)聽模塊MessageListener,用于服務(wù)端消息的監(jiān)聽;
[0016]消息接收模塊MessageReceiver,用于服務(wù)端消息的接收;
[0017]消息發(fā)送模塊MessageSender,用于發(fā)送消息給服務(wù)器。
[0018]對(duì)消息服務(wù)客戶端創(chuàng)建模塊創(chuàng)建的每一個(gè)對(duì)象,均采用同一個(gè)消息分發(fā)模塊進(jìn)行處理。
[0019]所述的消息分發(fā)模塊將創(chuàng)建的對(duì)象放入客戶端列表后,將業(yè)務(wù)需要發(fā)送給客戶端的消息加入到消息隊(duì)列中;服務(wù)端檢測(cè)到消息隊(duì)列中的消息時(shí),消息分發(fā)模塊輪詢客戶端列表,向?qū)?yīng)的客戶端發(fā)送消息,從而實(shí)現(xiàn)服務(wù)端到客戶端的傳輸。
[0020]所述的客戶端中還包括連接維護(hù)模塊Connect1nRequiredRunnable,用于維護(hù)服務(wù)端和客戶端的鏈接。
[0021]所述的客戶端中還包括連接狀態(tài)監(jiān)聽模塊Connect1nStatusListener,用于監(jiān)聽服務(wù)端到客戶端的連接狀態(tài)。
[0022]與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn):
[0023]1、啟動(dòng)服務(wù)端之后,除了啟動(dòng)主服務(wù)進(jìn)程之外,服務(wù)端啟動(dòng)一個(gè)線程監(jiān)聽消息隊(duì)列,一旦有消息發(fā)送過來,則輪詢客戶端發(fā)送消息給客戶端列表中的每個(gè)客戶端。
[0024]2、開啟客戶端,建立客戶端與服務(wù)端的連接,并將客戶端本身加入到服務(wù)器端的客戶端列表中。另外,在客戶端建立一個(gè)線程監(jiān)聽服務(wù)端發(fā)送過來的消息,然后進(jìn)行處理。
[0025]3、通過服務(wù)端的消息輪詢發(fā)送給客戶端的機(jī)制,從而實(shí)現(xiàn)了客戶端和服務(wù)端的雙向通信。
【專利附圖】
【附圖說明】
[0026]圖1為服務(wù)端將客戶端注冊(cè)流程圖;
[0027]圖2為服務(wù)端消息分發(fā)流程圖:
[0028]圖3為客戶端登陸服務(wù)端流程圖;
[0029]圖4為客戶端接收消息流程圖。
【具體實(shí)施方式】
[0030]下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說明。
[0031]在本發(fā)明中,主要針對(duì)使用thrift通信框架,需要客戶端和服務(wù)端進(jìn)行雙向通信的場(chǎng)景。
[0032]1、主服務(wù)進(jìn)程中,有業(yè)務(wù)需要發(fā)消息給客戶端,則將消息加入消息隊(duì)列,監(jiān)聽消息隊(duì)列的線程會(huì)檢測(cè)到消息,輪詢客戶端列表將消息發(fā)送給客戶端。主服務(wù)進(jìn)程主要新增以下幾個(gè)類來處理這些操作:
[0033]MessageDistributor:處理消息分發(fā)。
[0034]MessageServiceClient:發(fā)送給客戶端的消息服務(wù)的創(chuàng)建操作。
[0035]服務(wù)端啟動(dòng)的流程如下:
[0036]I)在啟動(dòng)服務(wù)的時(shí)候,需要新建消息分發(fā)的線程,調(diào)用MessageDistributor線程,進(jìn)行處理發(fā)送給客戶端的操作。
[0037]2)需要重載process里面的get_process操作,使得每個(gè)客戶端進(jìn)行連接的時(shí)候,新建一個(gè)MessageServiceClient進(jìn)行客戶端新建和注冊(cè)。
[0038]2、每開啟一個(gè)客戶端,服務(wù)端會(huì)將此客戶端加入客戶端列表中。每個(gè)客戶端也會(huì)有一個(gè)線程對(duì)服務(wù)端過來的消息進(jìn)行處理??蛻舳酥饕窃谠瓉淼幕A(chǔ)上新增了一下幾個(gè)類:
[0039]Connect1nStatusListener:監(jiān)聽服務(wù)端到客戶端的連接狀態(tài)
[0040]Connect1nStatusMonitor:連接狀態(tài)的處理類
[0041]MessageListener:服務(wù)端的消息監(jiān)聽
[0042]MessageReceiver:服務(wù)端的消息接收
[0043]MessageSende:發(fā)送消息給服務(wù)端
[0044]新建一個(gè)客戶端的時(shí)候,需要做一下幾個(gè)事情:
[0045]I)啟動(dòng)一個(gè)獨(dú)立的線程MessageReceiver來進(jìn)行消息的發(fā)送。
[0046]2)啟動(dòng)一個(gè)獨(dú)立的線程MessageSender進(jìn)行消息接收。
[0047]3)打開連接管理器進(jìn)行連接的監(jiān)聽。
[0048]4)發(fā)送消息給服務(wù)端進(jìn)行客戶端到服務(wù)端的注冊(cè)。
[0049]服務(wù)端的處理流程如圖1和圖2所示。
[0050]兩個(gè)流程,一個(gè)是主服務(wù)進(jìn)程將客戶端加入客戶端列表中,一個(gè)是發(fā)送消息的流程。
[0051]客戶端的處理流程如圖3和圖4所示。
[0052]實(shí)施的過程中,需要在thrift原來的框架上,啟動(dòng)幾個(gè)線程來處理消息監(jiān)聽,客戶端輪詢等一系列的操作來完成此設(shè)計(jì)。
【權(quán)利要求】
1.一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,包括: 服務(wù)端,該服務(wù)端包括: 消息服務(wù)客戶端創(chuàng)建模塊,用于創(chuàng)建給客戶端發(fā)送消息的對(duì)象; 消息分發(fā)模塊,用于將消息服務(wù)客戶端創(chuàng)建模塊創(chuàng)建的對(duì)象放入客戶端列表中,并處理各客戶端消息的分發(fā); 客戶端,該客戶端包括: 連接處理模塊,用于建立與服務(wù)端的連接; 消息監(jiān)聽模塊,用于服務(wù)端消息的監(jiān)聽; 消息接收模塊,用于服務(wù)端消息的接收; 消息發(fā)送模塊,用于發(fā)送消息給服務(wù)器。
2.根據(jù)權(quán)利要求1所述的一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,對(duì)消息服務(wù)客戶端創(chuàng)建模塊創(chuàng)建的每一個(gè)對(duì)象,均采用同一個(gè)消息分發(fā)模塊進(jìn)行處理。
3.根據(jù)權(quán)利要求1所述的一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,所述的消息分發(fā)模塊將創(chuàng)建的對(duì)象放入客戶端列表后,將業(yè)務(wù)需要發(fā)送給客戶端的消息加入到消息隊(duì)列中;服務(wù)端檢測(cè)到消息隊(duì)列中的消息時(shí),消息分發(fā)模塊輪詢客戶端列表,向?qū)?yīng)的客戶端發(fā)送消息,從而實(shí)現(xiàn)服務(wù)端到客戶端的傳輸。
4.根據(jù)權(quán)利要求1所述的一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,所述的客戶端中還包括連接維護(hù)模塊,用于維護(hù)服務(wù)端和客戶端的鏈接。
5.根據(jù)權(quán)利要求1所述的一種基于遠(yuǎn)程過程調(diào)用的雙向通信系統(tǒng),其特征在于,所述的客戶端中還包括連接狀態(tài)監(jiān)聽模塊,用于監(jiān)聽服務(wù)端到客戶端的連接狀態(tài)。
【文檔編號(hào)】H04L29/06GK104486330SQ201410765542
【公開日】2015年4月1日 申請(qǐng)日期:2014年12月11日 優(yōu)先權(quán)日:2014年12月11日
【發(fā)明者】伍星宇 申請(qǐng)人:上海愛數(shù)軟件有限公司