專利名稱:基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及進(jìn)程間通信技術(shù)領(lǐng)域,更具體的說(shuō),是涉及一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法。
背景技術(shù):
進(jìn)程通信的概念最初來(lái)源于單機(jī)系統(tǒng)。由于每個(gè)進(jìn)程都在自己的地址范圍內(nèi)運(yùn)行,為保證兩個(gè)相互通信的進(jìn)程之間既互不干擾又協(xié)調(diào)一致工作,操作系統(tǒng)為進(jìn)程通信提供了相應(yīng)設(shè)施,如UNIX BSD中的管道(pipe)、命名管道(namedpipe)和軟中斷信號(hào)(signal),UNIX system V的消息(message)、共享存儲(chǔ)區(qū)(shared memory)和信號(hào)量(semaphore)等,但都僅限于用在本機(jī)進(jìn)程之間通信。網(wǎng)間進(jìn)程通信要解決的是不同主機(jī)進(jìn)程間的相互通信問(wèn)題(可把同機(jī)進(jìn)程通信看作是其中的特例)。為此,首先要解決的是網(wǎng)間進(jìn)程標(biāo)識(shí)問(wèn)題。同一主機(jī)上,不同進(jìn)程可用進(jìn)程號(hào)(process ID)唯一標(biāo)識(shí)。但在網(wǎng)絡(luò)環(huán)境下,各主機(jī)獨(dú)立分配的進(jìn)程號(hào)不能唯一標(biāo)識(shí)該進(jìn)程。例如,主機(jī)A賦于某進(jìn)程號(hào)5,在B機(jī)中也可以存在5號(hào)進(jìn)程,因此,“5號(hào)進(jìn)程”這句話就沒(méi)有意義了。
其次,操作系統(tǒng)支持的網(wǎng)絡(luò)協(xié)議眾多,不同協(xié)議的工作方式不同,地址格式也不同。因此,網(wǎng)間進(jìn)程通信還要解決多重協(xié)議的識(shí)別問(wèn)題。
為了解決上述問(wèn)題,TCP/IP協(xié)議引入了下列幾個(gè)概念。
端口網(wǎng)絡(luò)中可以被命名和尋址的通信端口,是操作系統(tǒng)可分配的一種資源。按照OSI七層協(xié)議的描述,傳輸層與網(wǎng)絡(luò)層在功能上的最大區(qū)別是傳輸層提供進(jìn)程通信能力。從這個(gè)意義上講,網(wǎng)絡(luò)通信的最終地址就不僅僅是主機(jī)地址了,還包括可以描述進(jìn)程的某種標(biāo)識(shí)符。為此,TCP/IP協(xié)議提出了協(xié)議端口(protocol port,簡(jiǎn)稱端口)的概念,用于標(biāo)識(shí)通信的進(jìn)程。
端口是一種抽象的軟件結(jié)構(gòu)(包括一些數(shù)據(jù)結(jié)構(gòu)和I/O緩沖區(qū))。應(yīng)用程序(即進(jìn)程)通過(guò)系統(tǒng)調(diào)用與某端口建立連接(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)進(jìn)程所接收,相應(yīng)進(jìn)程發(fā)給傳輸層的數(shù)據(jù)都通過(guò)該端口輸出。在TCP/IP協(xié)議的實(shí)現(xiàn)中,端口操作類似于一般的I/O操作,進(jìn)程獲取一個(gè)端口,相當(dāng)于獲取本地唯一的I/O文件,可以用一般的讀寫(xiě)原語(yǔ)訪問(wèn)之。
類似于文件描述符,每個(gè)端口都擁有一個(gè)叫端口號(hào)(port number)的整數(shù)型標(biāo)識(shí)符,用于區(qū)別不同端口。由于TCP/IP傳輸層的兩個(gè)協(xié)議TCP和UDP是完全獨(dú)立的兩個(gè)軟件模塊,因此各自的端口號(hào)也相互獨(dú)立,如TCP有一個(gè)255號(hào)端口,UDP也可以有一個(gè)255號(hào)端口,二者并不沖突。
端口號(hào)的分配是一個(gè)重要問(wèn)題。有兩種基本分配方式第一種叫全局分配,這是一種集中控制方式,由一個(gè)公認(rèn)的中央機(jī)構(gòu)根據(jù)用戶需要進(jìn)行統(tǒng)一分配,并將結(jié)果公布于眾。第二種是本地分配,又稱動(dòng)態(tài)連接,即進(jìn)程需要訪問(wèn)傳輸層服務(wù)時(shí),向本地操作系統(tǒng)提出申請(qǐng),操作系統(tǒng)返回一個(gè)本地唯一的端口號(hào),進(jìn)程再通過(guò)合適的系統(tǒng)調(diào)用將自己與該端口號(hào)聯(lián)系起來(lái)(綁扎)。TCP/IP端口號(hào)的分配中綜合了上述兩種方式。TCP/IP將端口號(hào)分為兩部分,少量的作為保留端口,以全局方式分配給服務(wù)進(jìn)程。因此,每一個(gè)標(biāo)準(zhǔn)服務(wù)器都擁有一個(gè)全局公認(rèn)的端口(即周知口,well-known port),即使在不同機(jī)器上,其端口號(hào)也相同。剩余的為自由端口,以本地方式進(jìn)行分配。TCP和UDP均規(guī)定,小于256的端口號(hào)才能作保留端口。
地址網(wǎng)絡(luò)通信中通信的兩個(gè)進(jìn)程分別在不同的機(jī)器上。在互連網(wǎng)絡(luò)中,兩臺(tái)機(jī)器可能位于不同的網(wǎng)絡(luò),這些網(wǎng)絡(luò)通過(guò)網(wǎng)絡(luò)互連設(shè)備(網(wǎng)關(guān),網(wǎng)橋,路由器等)連接。
連接兩個(gè)進(jìn)程間的通信鏈路稱為連接。連接在內(nèi)部表現(xiàn)為一些緩沖區(qū)和一組協(xié)議機(jī)制,在外部表現(xiàn)出比無(wú)連接高的可靠性。
發(fā)明內(nèi)容
本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)中的不足,提供一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法。
為了解決上述技術(shù)問(wèn)題,本發(fā)明是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的。
一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,包括以下步驟(1)通信服務(wù)進(jìn)程的實(shí)現(xiàn)通信服務(wù)進(jìn)程是利用Java提供的多線程機(jī)制,維護(hù)三個(gè)核心數(shù)據(jù)結(jié)構(gòu)通信結(jié)構(gòu)表、進(jìn)程組索引表和發(fā)送線程實(shí)例表;通信服務(wù)進(jìn)程包括六個(gè)模塊進(jìn)程注冊(cè)模塊、消息接收模塊、消息分發(fā)模塊、控制模塊、通信結(jié)構(gòu)類和消息發(fā)送模塊;(2)進(jìn)程內(nèi)通信服務(wù)進(jìn)程實(shí)現(xiàn)進(jìn)程內(nèi)通信服務(wù)進(jìn)程向通信進(jìn)程的上層應(yīng)用提供一個(gè)異步的消息觸發(fā)通信界面,進(jìn)程內(nèi)通信服務(wù)進(jìn)程由進(jìn)程內(nèi)通信服務(wù)模塊實(shí)現(xiàn),它包括發(fā)送模塊、接收模塊、消息觸發(fā)模塊和消息處理模塊;(3)消息的設(shè)計(jì)消息由消息頭和消息體組成,消息頭包括消息的類型和進(jìn)程的尋址信息,消息體包含用戶數(shù)據(jù);(4)通信過(guò)程①進(jìn)程內(nèi)通信服務(wù)進(jìn)程發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以消息對(duì)象封裝的消息發(fā)往網(wǎng)關(guān);②通信服務(wù)進(jìn)程注冊(cè)模塊由端口監(jiān)聽(tīng)線程和訪問(wèn)控制線程構(gòu)成,端口監(jiān)聽(tīng)線程監(jiān)聽(tīng)來(lái)自于通信進(jìn)程的連接請(qǐng)求,每收到一個(gè)連接請(qǐng)求,啟動(dòng)一個(gè)訪問(wèn)控制線程,檢查連接的合法性如果口令正確,在通信結(jié)構(gòu)類中增加該連接對(duì)應(yīng)的套接字,以及相應(yīng)的對(duì)象輸入和對(duì)象輸出,并為該連接新建消息發(fā)送線程實(shí)例,將其寫(xiě)入消息分發(fā)模塊維護(hù)的數(shù)據(jù)結(jié)構(gòu)中,如果口令不正確,關(guān)閉該連接;③通信服務(wù)進(jìn)程消息接收模塊采用非阻塞方式輪詢通信結(jié)構(gòu)表中所有的套接字,記錄下有消息到達(dá)的套接字,依次從其中讀取消息,每得到一條消息,通過(guò)消息分發(fā)器選擇消息發(fā)送模塊中合適的發(fā)送線程實(shí)例進(jìn)行發(fā)送;④通信服務(wù)進(jìn)程消息分發(fā)模塊根據(jù)消息的組標(biāo)識(shí)查找目的進(jìn)程所在進(jìn)程組的發(fā)送線程實(shí)例表,在發(fā)送線程實(shí)例表中根據(jù)目的進(jìn)程的組內(nèi)標(biāo)識(shí)查找該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù),將消息傳給樹(shù)上所有的葉子節(jié)點(diǎn)一一發(fā)送線程實(shí)例,由它們負(fù)責(zé)將消息發(fā)送到目的進(jìn)程,發(fā)送線程實(shí)例樹(shù)維護(hù)向同一個(gè)通信進(jìn)程發(fā)送消息的所有的發(fā)送線程實(shí)例;⑤通信服務(wù)進(jìn)程控制模塊保證資源的及時(shí)釋放,檢查發(fā)送線程實(shí)例樹(shù)中發(fā)送線程的狀態(tài),如果已經(jīng)死掉,釋放指向該線程的句柄,關(guān)閉并刪除相應(yīng)的通信結(jié)構(gòu);⑥通信服務(wù)進(jìn)程消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程,包括多個(gè)發(fā)送線程實(shí)例,發(fā)送線程維護(hù)一個(gè)私有的消息隊(duì)列,用于保存等待發(fā)送的消息,消息隊(duì)列為空時(shí)線程處于阻塞狀態(tài),有消息需要發(fā)送時(shí),消息分發(fā)模塊會(huì)把消息寫(xiě)入消息隊(duì)列并喚醒該線程;⑦進(jìn)程內(nèi)通信服務(wù)進(jìn)程接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息,在線程內(nèi)部維護(hù)一個(gè)待處理消息隊(duì)列和消息處理線程池,采用阻塞的通信方式,阻塞監(jiān)聽(tīng)與網(wǎng)關(guān)通信的連接,每當(dāng)有消息到達(dá)時(shí)被喚醒,對(duì)消息進(jìn)行處理;⑧進(jìn)程內(nèi)通信服務(wù)模塊收到一個(gè)消息后,在消息處理線程中首先判斷消息的類型是數(shù)據(jù)報(bào)消息還是應(yīng)答消息,如果是數(shù)據(jù)報(bào)消息,根據(jù)消息源的組標(biāo)識(shí),調(diào)用消息處理接口實(shí)現(xiàn)樹(shù)中的相應(yīng)的處理方法進(jìn)行處理,如果是應(yīng)答消息,根據(jù)消息序號(hào)在消息配對(duì)隊(duì)列中查找配對(duì)對(duì)象,調(diào)用該對(duì)象提供的對(duì)應(yīng)答消息的處理方法,消息處理接口的實(shí)現(xiàn)和配對(duì)對(duì)象中的應(yīng)答消息處理方法都由上層應(yīng)用實(shí)現(xiàn);⑨進(jìn)程內(nèi)通信服務(wù)進(jìn)程消息接收模塊每收到一條消息,激活消息處理線程池中的一個(gè)空余線程完成消息的處理。
作為一種改進(jìn),所述的進(jìn)程注冊(cè)模塊控制通信進(jìn)程的連入,保證通信服務(wù)進(jìn)程的安全性;所述的消息接收模塊接收通信進(jìn)程發(fā)來(lái)的消息;所述的消息分發(fā)模塊維護(hù)進(jìn)程組索引表和組內(nèi)進(jìn)程索引表,實(shí)現(xiàn)目標(biāo)進(jìn)程的尋址和發(fā)送線程實(shí)例的維護(hù);所述的控制模塊保證資源的及時(shí)釋放;所述的通信結(jié)構(gòu)類維護(hù)通信結(jié)構(gòu)表,實(shí)現(xiàn)對(duì)通信結(jié)構(gòu)表的增、刪、改方法;所述的消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程。
作為一種改進(jìn),所述的通信結(jié)構(gòu)表記錄連入網(wǎng)關(guān)的所有套接字以及建立在其上的對(duì)象輸入和對(duì)象輸出,所述的進(jìn)程組索引表是以目標(biāo)進(jìn)程組標(biāo)識(shí)為關(guān)鍵字,以指向發(fā)送線程實(shí)例表的句柄為值的哈希表,所述的發(fā)送線程實(shí)例表是以目標(biāo)進(jìn)程的組內(nèi)標(biāo)識(shí)為關(guān)鍵宇,指向該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù)的句柄為值的哈希表。
作為一種改進(jìn),所述的發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以消息對(duì)象封裝的消息發(fā)往網(wǎng)關(guān);所述的接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息;所述的消息觸發(fā)模塊維護(hù)消息處理接口的實(shí)現(xiàn),將其組織成樹(shù)狀結(jié)構(gòu)——消息接口實(shí)現(xiàn)樹(shù);所述的消息處理模塊由消息處理線程構(gòu)成,該模塊完成對(duì)消息的處理。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是
本發(fā)明采用了集中式的通信方式,并且在與上層應(yīng)用的交互中引入了消息觸發(fā)機(jī)制,對(duì)收到的消息由通信系統(tǒng)負(fù)責(zé)調(diào)用回調(diào)函數(shù)進(jìn)行處理。同時(shí),將消息封裝成對(duì)象,利用Java的序列化機(jī)制直接傳送對(duì)象,簡(jiǎn)化上層應(yīng)用對(duì)消息的封裝與解析。進(jìn)程只和服務(wù)程序通信,進(jìn)程間以服務(wù)程序作為中介交換信息。進(jìn)程了解服務(wù)程序的位置,服務(wù)程序保留所有進(jìn)程的信息。本發(fā)明中的方法適用于各種進(jìn)程分布模型,不受遷移的影響。
圖1是本發(fā)明的原理框圖;圖2是通信服務(wù)進(jìn)程的結(jié)構(gòu)示意圖;圖3是進(jìn)程內(nèi)通信服務(wù)模塊的結(jié)構(gòu)示意圖。
具體實(shí)施例方式
結(jié)合附圖,下面對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。
一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,其具體實(shí)施方法如下(1)通信服務(wù)進(jìn)程的實(shí)現(xiàn)通信服務(wù)進(jìn)程是通信的中轉(zhuǎn)站,設(shè)計(jì)上采用了“慢收”“快發(fā)”的策略,并充分利用Java提供的多線程機(jī)制,是一個(gè)包含多個(gè)線程的進(jìn)程,維護(hù)三個(gè)核心數(shù)據(jù)結(jié)構(gòu)通信結(jié)構(gòu)表、進(jìn)程組索引表和發(fā)送線程實(shí)例表;通信結(jié)構(gòu)表記錄連入網(wǎng)關(guān)的所有套接字以及建立在其上的對(duì)象輸入(ObjectInput)和對(duì)象輸出(Object Out),進(jìn)程組索引表是以目標(biāo)進(jìn)程組標(biāo)識(shí)為關(guān)鍵字,以指向發(fā)送線程實(shí)例表的句柄為值的哈希表,發(fā)送線程實(shí)例表是以目標(biāo)進(jìn)程的組內(nèi)標(biāo)識(shí)為關(guān)鍵宇,指向該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù)的句柄為值的哈希表;通信服務(wù)進(jìn)程由六個(gè)模塊構(gòu)成·進(jìn)程注冊(cè)模塊控制通信進(jìn)程的連入,保證通信服務(wù)進(jìn)程的安全性;·消息接收模塊接收通信進(jìn)程發(fā)來(lái)的消息;·消息分發(fā)模塊是通信服務(wù)進(jìn)程的核心部件,維護(hù)進(jìn)程組索引表和組內(nèi)進(jìn)程索引表,實(shí)現(xiàn)目標(biāo)進(jìn)程的尋址和發(fā)送線程實(shí)例的維護(hù);·控制模塊保證資源的及時(shí)釋放;·通信結(jié)構(gòu)類維護(hù)通信結(jié)構(gòu)表,實(shí)現(xiàn)對(duì)通信結(jié)構(gòu)表的增、刪、改方法;
·消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程;(2)進(jìn)程內(nèi)通信服務(wù)進(jìn)程實(shí)現(xiàn)進(jìn)程內(nèi)通信服務(wù)進(jìn)程向通信進(jìn)程的上層應(yīng)用提供一個(gè)異步的消息觸發(fā)通信界面,進(jìn)程內(nèi)通信服務(wù)進(jìn)程由進(jìn)程內(nèi)通信服務(wù)模塊實(shí)現(xiàn),它包括發(fā)送模塊、接收模塊、消息觸發(fā)模塊和消息處理模塊;·發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以Message對(duì)象(消息對(duì)象)封裝的消息發(fā)往網(wǎng)關(guān);·接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息;·消息觸發(fā)模塊維護(hù)消息處理接口的實(shí)現(xiàn),將其組織成樹(shù)狀結(jié)構(gòu)——消息接口實(shí)現(xiàn)樹(shù);·消息處理模塊由消息處理線程構(gòu)成,該模塊完成對(duì)消息的處理;(3)消息的設(shè)計(jì)消息采用對(duì)象方式實(shí)現(xiàn),主要支持3種類型的消息數(shù)據(jù)報(bào)消息、請(qǐng)求消息和應(yīng)答消息,消息由消息頭和消息體組成,消息頭包括消息的類型和進(jìn)程的尋址信息,消息體包含用戶數(shù)據(jù);(4)通信過(guò)程①進(jìn)程內(nèi)通信服務(wù)進(jìn)程發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以Message對(duì)象(消息對(duì)象)封裝的消息發(fā)往網(wǎng)關(guān);②通信服務(wù)進(jìn)程注冊(cè)模塊由端口監(jiān)聽(tīng)線程和訪問(wèn)控制線程構(gòu)成,端口監(jiān)聽(tīng)線程在通信服務(wù)進(jìn)程啟動(dòng)時(shí)啟動(dòng),監(jiān)聽(tīng)來(lái)自于通信進(jìn)程的連接請(qǐng)求,每收到一個(gè)連接請(qǐng)求,啟動(dòng)一個(gè)訪問(wèn)控制線程,檢查連接的合法性要求連入的通信進(jìn)程在發(fā)送連接請(qǐng)求后的規(guī)定時(shí)間內(nèi)發(fā)送注冊(cè)消息,注冊(cè)消息中包含該進(jìn)程的標(biāo)識(shí)和注冊(cè)口令,如果口令正確,在通信結(jié)構(gòu)類中增加該連接對(duì)應(yīng)的套接字,以及相應(yīng)的對(duì)象輸入和對(duì)象輸出,并為該連接新建消息發(fā)送線程實(shí)例,將其寫(xiě)入消息分發(fā)模塊維護(hù)的數(shù)據(jù)結(jié)構(gòu)中,如果口令不正確,關(guān)閉該連接;③通信服務(wù)進(jìn)程消息接收模塊在通信服務(wù)進(jìn)程初始化的時(shí)候啟動(dòng),通信服務(wù)進(jìn)程關(guān)閉時(shí)停止,在通信服務(wù)進(jìn)程的生存期始終處于可調(diào)度狀態(tài),消息接收模塊采用非阻塞方式輪詢通信結(jié)構(gòu)表中所有的套接字,記錄下有消息到達(dá)的套接字,依次從其中讀取消息,每得到一條消息,通過(guò)消息分發(fā)器選擇消息發(fā)送模塊中合適的發(fā)送線程實(shí)例進(jìn)行發(fā)送;
④每當(dāng)有消息到達(dá),通信服務(wù)進(jìn)程消息分發(fā)模塊根據(jù)消息的組標(biāo)識(shí)查找目的進(jìn)程所在進(jìn)程組的發(fā)送線程實(shí)例表,在發(fā)送線程實(shí)例表中根據(jù)目的進(jìn)程的組內(nèi)標(biāo)識(shí)查找該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù),將消息傳給樹(shù)上所有的葉子節(jié)點(diǎn)——發(fā)送線程實(shí)例,由它們負(fù)責(zé)將消息發(fā)送到目的進(jìn)程,發(fā)送線程實(shí)例樹(shù)維護(hù)向同一個(gè)通信進(jìn)程發(fā)送消息的所有的發(fā)送線程實(shí)例;⑤由于通信網(wǎng)關(guān)同時(shí)要和多個(gè)通信進(jìn)程保持聯(lián)接,內(nèi)部有多個(gè)通信線程,線程的狀態(tài)都在動(dòng)態(tài)的變化中,通信服務(wù)進(jìn)程控制模塊保證資源的及時(shí)釋放,它是一個(gè)后臺(tái)線程,定時(shí)啟動(dòng),檢查發(fā)送線程實(shí)例樹(shù)中發(fā)送線程的狀態(tài),如果已經(jīng)死掉,釋放指向該線程的句柄,關(guān)閉并刪除相應(yīng)的通信結(jié)構(gòu);⑥通信服務(wù)進(jìn)程消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程,包括多個(gè)發(fā)送線程實(shí)例(每個(gè)通信連接對(duì)應(yīng)一個(gè)發(fā)送線程實(shí)例),發(fā)送線程維護(hù)一個(gè)私有的消息隊(duì)列,用于保存等待發(fā)送的消息,消息隊(duì)列為空時(shí)線程處于阻塞狀態(tài),有消息需要發(fā)送時(shí),消息分發(fā)模塊會(huì)把消息寫(xiě)入消息隊(duì)列并喚醒該線程;⑦進(jìn)程內(nèi)通信服務(wù)進(jìn)程接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息,在線程內(nèi)部維護(hù)一個(gè)待處理消息隊(duì)列和消息處理線程池,采用阻塞的通信方式,阻塞監(jiān)聽(tīng)與網(wǎng)關(guān)通信的連接,每當(dāng)有消息到達(dá)時(shí)被喚醒,對(duì)消息進(jìn)行處理;⑧進(jìn)程內(nèi)通信服務(wù)模塊收到一個(gè)消息后,在消息處理線程中首先判斷消息的類型是數(shù)據(jù)報(bào)消息還是應(yīng)答消息,如果是數(shù)據(jù)報(bào)消息,根據(jù)消息源的組標(biāo)識(shí),調(diào)用消息處理接口實(shí)現(xiàn)樹(shù)中的相應(yīng)的處理方法進(jìn)行處理,如果是應(yīng)答消息,根據(jù)消息序號(hào)在消息配對(duì)隊(duì)列中查找配對(duì)對(duì)象,調(diào)用該對(duì)象提供的對(duì)應(yīng)答消息的處理方法,消息處理接口的實(shí)現(xiàn)和配對(duì)對(duì)象中的應(yīng)答消息處理方法都由上層應(yīng)用實(shí)現(xiàn);⑨進(jìn)程內(nèi)通信服務(wù)進(jìn)程消息接收模塊每收到一條消息,激活消息處理線程池中的一個(gè)空余線程完成消息的處理。
通過(guò)以上步驟實(shí)現(xiàn)進(jìn)程間的異步通信。
最后,還需要注意的是,以上列舉的僅是本發(fā)明的具體實(shí)施例。顯然,本發(fā)明不限于以上實(shí)施例,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本實(shí)用新型公開(kāi)的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,其特征在于,包括以下步驟(1)通信服務(wù)進(jìn)程的實(shí)現(xiàn)通信服務(wù)進(jìn)程是利用Java提供的多線程機(jī)制,維護(hù)三個(gè)核心數(shù)據(jù)結(jié)構(gòu)通信結(jié)構(gòu)表、進(jìn)程組索引表和發(fā)送線程實(shí)例表;通信服務(wù)進(jìn)程包括六個(gè)模塊進(jìn)程注冊(cè)模塊、消息接收模塊、消息分發(fā)模塊、控制模塊、通信結(jié)構(gòu)類和消息發(fā)送模塊;(2)進(jìn)程內(nèi)通信服務(wù)進(jìn)程實(shí)現(xiàn)進(jìn)程內(nèi)通信服務(wù)進(jìn)程向通信進(jìn)程的上層應(yīng)用提供一個(gè)異步的消息觸發(fā)通信界面,進(jìn)程內(nèi)通信服務(wù)進(jìn)程由進(jìn)程內(nèi)通信服務(wù)模塊實(shí)現(xiàn),它包括發(fā)送模塊、接收模塊、消息觸發(fā)模塊和消息處理模塊;(3)消息的設(shè)計(jì)消息由消息頭和消息體組成,消息頭包括消息的類型和進(jìn)程的尋址信息,消息體包含用戶數(shù)據(jù);(4)通信過(guò)程①進(jìn)程內(nèi)通信服務(wù)進(jìn)程發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以消息對(duì)象封裝的消息發(fā)往網(wǎng)關(guān);②通信服務(wù)進(jìn)程注冊(cè)模塊由端口監(jiān)聽(tīng)線程和訪問(wèn)控制線程構(gòu)成,端口監(jiān)聽(tīng)線程監(jiān)聽(tīng)來(lái)自于通信進(jìn)程的連接請(qǐng)求,每收到一個(gè)連接請(qǐng)求,啟動(dòng)一個(gè)訪問(wèn)控制線程,檢查連接的合法性如果口令正確,在通信結(jié)構(gòu)類中增加該連接對(duì)應(yīng)的套接字,以及相應(yīng)的對(duì)象輸入和對(duì)象輸出,并為該連接新建消息發(fā)送線程實(shí)例,將其寫(xiě)入消息分發(fā)模塊維護(hù)的數(shù)據(jù)結(jié)構(gòu)中,如果口令不正確,關(guān)閉該連接;③通信服務(wù)進(jìn)程消息接收模塊采用非阻塞方式輪詢通信結(jié)構(gòu)表中所有的套接字,記錄下有消息到達(dá)的套接字,依次從其中讀取消息,每得到一條消息,通過(guò)消息分發(fā)器選擇消息發(fā)送模塊中合適的發(fā)送線程實(shí)例進(jìn)行發(fā)送;④通信服務(wù)進(jìn)程消息分發(fā)模塊根據(jù)消息的組標(biāo)識(shí)查找目的進(jìn)程所在進(jìn)程組的發(fā)送線程實(shí)例表,在發(fā)送線程實(shí)例表中根據(jù)目的進(jìn)程的組內(nèi)標(biāo)識(shí)查找該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù),將消息傳給樹(shù)上所有的葉子節(jié)點(diǎn)一一發(fā)送線程實(shí)例,由它們負(fù)責(zé)將消息發(fā)送到目的進(jìn)程,發(fā)送線程實(shí)例樹(shù)維護(hù)向同一個(gè)通信進(jìn)程發(fā)送消息的所有的發(fā)送線程實(shí)例;⑤通信服務(wù)進(jìn)程控制模塊保證資源的及時(shí)釋放,檢查發(fā)送線程實(shí)例樹(shù)中發(fā)送線程的狀態(tài),如果已經(jīng)死掉,釋放指向該線程的句柄,關(guān)閉并刪除相應(yīng)的通信結(jié)構(gòu);⑥通信服務(wù)進(jìn)程消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程,包括多個(gè)發(fā)送線程實(shí)例,發(fā)送線程維護(hù)一個(gè)私有的消息隊(duì)列,用于保存等待發(fā)送的消息,消息隊(duì)列為空時(shí)線程處于阻塞狀態(tài),有消息需要發(fā)送時(shí),消息分發(fā)模塊會(huì)把消息寫(xiě)入消息隊(duì)列并喚醒該線程;⑦進(jìn)程內(nèi)通信服務(wù)進(jìn)程接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息,在線程內(nèi)部維護(hù)一個(gè)待處理消息隊(duì)列和消息處理線程池,采用阻塞的通信方式,阻塞監(jiān)聽(tīng)與網(wǎng)關(guān)通信的連接,每當(dāng)有消息到達(dá)時(shí)被喚醒,對(duì)消息進(jìn)行處理;⑧進(jìn)程內(nèi)通信服務(wù)模塊收到一個(gè)消息后,在消息處理線程中首先判斷消息的類型是數(shù)據(jù)報(bào)消息還是應(yīng)答消息,如果是數(shù)據(jù)報(bào)消息,根據(jù)消息源的組標(biāo)識(shí),調(diào)用消息處理接口實(shí)現(xiàn)樹(shù)中的相應(yīng)的處理方法進(jìn)行處理,如果是應(yīng)答消息,根據(jù)消息序號(hào)在消息配對(duì)隊(duì)列中查找配對(duì)對(duì)象,調(diào)用該對(duì)象提供的對(duì)應(yīng)答消息的處理方法,消息處理接口的實(shí)現(xiàn)和配對(duì)對(duì)象中的應(yīng)答消息處理方法都由上層應(yīng)用實(shí)現(xiàn);⑨進(jìn)程內(nèi)通信服務(wù)進(jìn)程消息接收模塊每收到一條消息,激活消息處理線程池中的一個(gè)空余線程完成消息的處理。
2.根據(jù)權(quán)利要求1中步驟(1)所述的基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,其特征在于,所述的進(jìn)程注冊(cè)模塊控制通信進(jìn)程的連入,保證通信服務(wù)進(jìn)程的安全性;所述的消息接收模塊接收通信進(jìn)程發(fā)來(lái)的消息;所述的消息分發(fā)模塊維護(hù)進(jìn)程組索引表和組內(nèi)進(jìn)程索引表,實(shí)現(xiàn)目標(biāo)進(jìn)程的尋址和發(fā)送線程實(shí)例的維護(hù);所述的控制模塊保證資源的及時(shí)釋放;所述的通信結(jié)構(gòu)類維護(hù)通信結(jié)構(gòu)表,實(shí)現(xiàn)對(duì)通信結(jié)構(gòu)表的增、刪、改方法;所述的消息發(fā)送模塊負(fù)責(zé)將消息發(fā)往目的進(jìn)程。
3.根據(jù)權(quán)利要求1所述的基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,其特征在于,所述的通信結(jié)構(gòu)表記錄連入網(wǎng)關(guān)的所有套接字以及建立在其上的對(duì)象輸入和對(duì)象輸出,所述的進(jìn)程組索引表是以目標(biāo)進(jìn)程組標(biāo)識(shí)為關(guān)鍵字,以指向發(fā)送線程實(shí)例表的句柄為值的哈希表,所述的發(fā)送線程實(shí)例表是以目標(biāo)進(jìn)程的組內(nèi)標(biāo)識(shí)為關(guān)鍵宇,指向該進(jìn)程對(duì)應(yīng)的發(fā)送線程實(shí)例樹(shù)的句柄為值的哈希表。
4.根據(jù)權(quán)利要求1所述的基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法,其特征在于,所述的發(fā)送模塊利用Java提供的對(duì)象序列化機(jī)制,直接將以消息對(duì)象封裝的消息發(fā)往網(wǎng)關(guān);所述的接收模塊接收從網(wǎng)關(guān)發(fā)來(lái)的消息;所述的消息觸發(fā)模塊維護(hù)消息處理接口的實(shí)現(xiàn),將其組織成樹(shù)狀結(jié)構(gòu)——消息接口實(shí)現(xiàn)樹(shù);所述的消息處理模塊由消息處理線程構(gòu)成,該模塊完成對(duì)消息的處理。
全文摘要
本發(fā)明涉及進(jìn)程間通信技術(shù)領(lǐng)域,旨在提供一種基于Java的進(jìn)程間異步通信的實(shí)現(xiàn)方法。該方法包括以下步驟(1)通信服務(wù)進(jìn)程的實(shí)現(xiàn);(2)進(jìn)程內(nèi)通信服務(wù)進(jìn)程實(shí)現(xiàn);(3)消息的設(shè)計(jì);(4)通信過(guò)程的實(shí)現(xiàn)。本發(fā)明采用了集中式的通信方式,并且在與上層應(yīng)用的交互中引入了消息觸發(fā)機(jī)制,對(duì)收到的消息由通信系統(tǒng)負(fù)責(zé)調(diào)用回調(diào)函數(shù)進(jìn)行處理。同時(shí),將消息封裝成對(duì)象,利用Java的序列化機(jī)制直接傳送對(duì)象,簡(jiǎn)化上層應(yīng)用對(duì)消息的封裝與解析;進(jìn)程只和服務(wù)程序通信,進(jìn)程間以服務(wù)程序作為中介交換信息;進(jìn)程了解服務(wù)程序的位置,服務(wù)程序保留所有進(jìn)程的信息。本發(fā)明中的方法適用于各種進(jìn)程分布模型,不受遷移的影響。
文檔編號(hào)H04L29/06GK1975680SQ20061015479
公開(kāi)日2007年6月6日 申請(qǐng)日期2006年11月27日 優(yōu)先權(quán)日2006年11月27日
發(fā)明者胡威, 陳天洲, 謝斌, 楊揚(yáng) 申請(qǐng)人:浙江大學(xué)