本發(fā)明涉及計(jì)算機(jī)通信技術(shù)領(lǐng)域,尤其涉及一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)及方法。
背景技術(shù):
:
WCF(Windows Communication Foundation)是微軟公司的Windows通訊開發(fā)平臺(tái),它集成了一系列用于數(shù)據(jù)通信的應(yīng)用。net.tcp協(xié)議是WCF平臺(tái)實(shí)現(xiàn)的通信協(xié)議之一,相對(duì)于WCF中的其它協(xié)議,net.tcp協(xié)議的優(yōu)點(diǎn)有速度快,相同信息傳輸數(shù)據(jù)量小,可實(shí)現(xiàn)雙工通信等,因此net.tcp協(xié)議在基于.net架構(gòu)的網(wǎng)絡(luò)通信中廣泛使用。但是由于net.tcp協(xié)議是微軟自有的協(xié)議,net.tcp協(xié)議僅支持.net平臺(tái)間的數(shù)據(jù)通信,不能與其它不支持.net平臺(tái)的系統(tǒng)通信(如Android系統(tǒng),IOS系統(tǒng)等)。近年來(lái),移動(dòng)應(yīng)用平臺(tái)不斷涌現(xiàn),原有眾多軟件系統(tǒng)都存在客戶端代碼向移動(dòng)應(yīng)用平臺(tái)擴(kuò)展的需求。這時(shí)為了在移動(dòng)應(yīng)用平臺(tái)實(shí)現(xiàn)原有功能,原先基于net.tcp協(xié)議通信的代碼全部都要重新改寫、測(cè)試。由于軟件工程項(xiàng)目維護(hù)周期長(zhǎng),代碼量大,原有開發(fā)人員變動(dòng)等原因,重構(gòu)工作量非常的龐大、繁雜,甚至在費(fèi)用和人員投入上是不可接受的。
技術(shù)實(shí)現(xiàn)要素:
:
針對(duì)現(xiàn)有技術(shù)的缺陷,本發(fā)明提供一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)及方法,在客戶端和WCF服務(wù)端之間添加一個(gè)轉(zhuǎn)發(fā)數(shù)據(jù)的適配器中間件,不需要更改服務(wù)端代碼就可以使.net平臺(tái)異構(gòu)的客戶端與使用net.tcp協(xié)議的服務(wù)端通信,大大增強(qiáng)了軟件系統(tǒng)的可用性和可維護(hù)性,提高了系統(tǒng)開發(fā)效率。
一方面,本發(fā)明提供一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng),包括客戶端和WCF服務(wù)端之間的一個(gè)用于轉(zhuǎn)發(fā)數(shù)據(jù)的適配器中間件系統(tǒng),該中間件系統(tǒng)包括WCF服務(wù)的客戶端引用模塊、消息緩存模塊、自定義消息模塊、服務(wù)端數(shù)據(jù)適配器模塊和客戶端數(shù)據(jù)適配器模塊;
WCF服務(wù)的客戶端引用模塊由VS(Microsoft Visual Studio)的代碼生成器自動(dòng)生成,根據(jù)服務(wù)的個(gè)數(shù)設(shè)有多個(gè)引用,每個(gè)引用對(duì)應(yīng)一個(gè)WCF服務(wù),用于與WCF服務(wù)端通信;
消息緩存模塊用于將接收的消息存儲(chǔ),以便適配器逐條處理消息;消息緩存模塊的類圖如下,消息緩存類包括兩個(gè)屬性變量:發(fā)往WCF服務(wù)消息的緩存和發(fā)往客戶端消息的緩存,兩個(gè)屬性變量均為先入先出的隊(duì)列類型;
自定義消息模塊用于定義客戶端和客戶端數(shù)據(jù)適配器模塊之間的數(shù)據(jù)傳輸格式,自定義消息包括父類消息和子類消息,其中子類消息包括錯(cuò)誤消息、方法調(diào)用消息、方法返回值消息和命令消息,子類消息共有的父類消息為抽象類;錯(cuò)誤消息用于發(fā)送異常,屬性值為錯(cuò)誤消息;方法調(diào)用消息用于發(fā)送方法的定義,以便遠(yuǎn)程調(diào)用方法,屬性值包括方法名稱、參數(shù)類型、參數(shù)值和用戶狀態(tài);方法返回值消息用于存儲(chǔ)方法調(diào)用的結(jié)果,屬性值包括方法名稱、返回值類型、返回值和用戶狀態(tài);命令消息用于存放遠(yuǎn)程控制中間件的命令,屬性值包括命令類型和命令參數(shù);
服務(wù)端數(shù)據(jù)適配器模塊用于與WCF服務(wù)端通信,包括從消息緩存模塊中讀取消息并根據(jù)消息調(diào)用WCF接口,將WCF接口調(diào)用的返回值或需要調(diào)用的客戶端方法放入消息緩存模塊,通信方式采用net.tcp協(xié)議;
服務(wù)端數(shù)據(jù)適配器模塊類圖如下,父類為一個(gè)抽象的代理類,定義了具體實(shí)現(xiàn)類公用的方法和必須實(shí)現(xiàn)的抽象方法,定義的屬性包括具體實(shí)現(xiàn)類要實(shí)現(xiàn)的數(shù)據(jù)鏈路對(duì)象(即具體的WCF服務(wù)引用對(duì)象)、具體實(shí)現(xiàn)類類型、WCF方法調(diào)用的緩存字典和處理發(fā)送到WCF服務(wù)的消息的線程集合,定義的方法包括啟動(dòng)WCF服務(wù)的消息的線程的方法、將消息發(fā)送到客戶端緩存的方法,調(diào)用WCF服務(wù)引用的方法;具體實(shí)現(xiàn)類根據(jù)不同的WCF服務(wù)有不同的實(shí)現(xiàn)方法,實(shí)現(xiàn)方法與WCF服務(wù)端定義的接口方法對(duì)應(yīng);
客戶端數(shù)據(jù)適配器模塊用于與客戶端通信,包括從消息緩存模塊中讀取消息并根據(jù)消息調(diào)用客戶端方法,將客戶端方法的返回值或需要調(diào)用的服務(wù)端方法放入消息緩存模塊,通訊方式采用socket通信;
客戶端數(shù)據(jù)適配器模塊包括兩個(gè)類,適配器管理類和適配器類;適配器管理類用于為每個(gè)WCF服務(wù)分配一個(gè)監(jiān)聽端口,監(jiān)聽是否有客戶端希望連接WCF服務(wù);當(dāng)有客戶端希望連接WCF服務(wù)時(shí),創(chuàng)建一個(gè)適配器類,由適配器類的實(shí)例對(duì)象負(fù)責(zé)與客戶端通信;適配器管理類包括一個(gè)監(jiān)聽器集合和一個(gè)適配器集合;監(jiān)聽器集合用于存放所有正在監(jiān)聽是否有客戶端連接的監(jiān)聽器;適配器集合用于存放所有正在與客戶端通信的適配器類的對(duì)象,同時(shí)還監(jiān)聽是否有客戶端連接;適配器類用于將WCF傳來(lái)的消息發(fā)送給客戶端,并將客服端發(fā)送來(lái)的消息放入WCF的消息緩存。
另一方面,本發(fā)明還提供一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的方法,通過(guò)上述的WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)實(shí)現(xiàn),包括如下步驟:
步驟1、中間件進(jìn)行初始化,具體方法如下:
步驟1.1、創(chuàng)建適配器管理類對(duì)象;
步驟1.2、適配器管理類對(duì)象根據(jù)引用的WCF服務(wù)個(gè)數(shù),創(chuàng)建相應(yīng)個(gè)數(shù)的線程,每個(gè)線程調(diào)用適配器管理類的監(jiān)聽方法監(jiān)聽是否有客戶端請(qǐng)求連接中間件;
步驟1.3、若客戶端程序請(qǐng)求與中間件建立鏈接,中間件適配器管理類對(duì)象監(jiān)聽到請(qǐng)求,則初始化一個(gè)與客戶端程序?qū)?yīng)的適配器類對(duì)象,并再次進(jìn)入監(jiān)聽狀態(tài),等待下一個(gè)客戶端連接;
步驟1.4、適配器類的對(duì)象與客戶端建立socket鏈接,并創(chuàng)建對(duì)應(yīng)的消息緩存對(duì)象;
步驟2、客戶端調(diào)用服務(wù)端的操作,具體方法如下:
步驟2.1、客戶端程序調(diào)用負(fù)責(zé)通信的函數(shù),將需要調(diào)用的函數(shù)方法封裝為方法調(diào)用消息類對(duì)象;
步驟2.2、通信函數(shù)向中間件系統(tǒng)的客戶端數(shù)據(jù)適配器模塊發(fā)送函數(shù)調(diào)用的請(qǐng)求消息;
步驟2.3、客戶端數(shù)據(jù)適配器模塊接收請(qǐng)求消息,將消息放入消息緩存模塊中,并通知服務(wù)端數(shù)據(jù)適配器模塊處理;
步驟2.4、服務(wù)端數(shù)據(jù)適配器模塊接收到通知,啟動(dòng)新線程從消息緩存模塊中讀取出命令消息,判斷為函數(shù)調(diào)用請(qǐng)求消息,則使用反射技術(shù)調(diào)用具體實(shí)現(xiàn)類要實(shí)現(xiàn)的數(shù)據(jù)鏈路對(duì)象中對(duì)應(yīng)的WCF操作;
步驟2.5、如果有返回值,服務(wù)端數(shù)據(jù)適配器模塊將返回值封裝為返回值消息對(duì)象,放入消息緩存模塊中,并通知客戶端數(shù)據(jù)適配器模塊調(diào)用,執(zhí)行步驟2.6;如果沒(méi)有返回值,調(diào)用處理流程結(jié)束;
步驟2.6、客戶端數(shù)據(jù)適配器模塊取出返回值消息,將該返回值消息序列化后,通過(guò)socket發(fā)送到客戶端;
步驟2.7、客戶端將接收到的返回值消息反序列化,獲得返回值;
步驟3、服務(wù)端調(diào)用客戶端的操作,具體方法如下:
步驟3.1、服務(wù)端程序通過(guò)中間件的WCF服務(wù)的客戶端引用模塊調(diào)用服務(wù)端數(shù)據(jù)適配器模塊;
步驟3.2、服務(wù)端數(shù)據(jù)適配器模塊將函數(shù)調(diào)用請(qǐng)求消息封裝,并放入消息緩存模塊中,通知客戶端數(shù)據(jù)適配器模塊;
步驟3.3、客戶端數(shù)據(jù)適配器模塊從消息緩存模塊中取出函數(shù)調(diào)用請(qǐng)求消息,序列化后將該函數(shù)調(diào)用請(qǐng)求消息發(fā)送給對(duì)應(yīng)的客戶端通信接口;
步驟3.4、客戶端通信接口判斷消息為函數(shù)調(diào)用請(qǐng)求消息,將該函數(shù)調(diào)用請(qǐng)求消息反序列化后,調(diào)用對(duì)應(yīng)的函數(shù)。
由上述技術(shù)方案可知,本發(fā)明的有益效果在于:本發(fā)明提供的一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)及方法,在客戶端和WCF服務(wù)端之間添加一個(gè)轉(zhuǎn)發(fā)數(shù)據(jù)的適配器中間件,不支持.net平臺(tái)的客戶端和WCF平臺(tái)分別與中間件建立連接,并且通信數(shù)據(jù)都通過(guò)中間件轉(zhuǎn)發(fā),當(dāng)有數(shù)據(jù)傳輸時(shí),先將數(shù)據(jù)發(fā)送到適配器組件上,然后由適配器組件負(fù)責(zé)將數(shù)據(jù)發(fā)送到WCF服務(wù)器或客戶端。該中間件系統(tǒng)及跨平臺(tái)通信的方法符合軟件設(shè)計(jì)的“開閉原則”,不需要“入侵”原有服務(wù)端代碼,即不需要更改原有WCF平臺(tái)服務(wù)端代碼,就能擴(kuò)展WCF平臺(tái)的net.tcp協(xié)議,使.net平臺(tái)異構(gòu)的客戶端與使用net.tcp協(xié)議的服務(wù)端通信,極大的提高了net.tcp協(xié)議的適用性,大大增強(qiáng)了軟件系統(tǒng)的可用性和可維護(hù)性,加快了代碼的開發(fā)速度,提高了系統(tǒng)開發(fā)效率。
附圖說(shuō)明:
圖1為本發(fā)明實(shí)施例提供的中間件系統(tǒng)結(jié)構(gòu)及其與客戶端和服務(wù)端的連接示意圖;
圖2為本發(fā)明實(shí)施例提供的消息緩存類圖:
圖3為本發(fā)明實(shí)施例提供的自定義消息類圖;
圖4為本發(fā)明實(shí)施例提供的服務(wù)端數(shù)據(jù)適配器類圖;
圖5為本發(fā)明實(shí)施例提供的客戶端數(shù)據(jù)適配器類圖;
圖6為本發(fā)明實(shí)施例提供的客戶端調(diào)用服務(wù)端的操作流程圖:
圖7為本發(fā)明實(shí)施例提供的服務(wù)端調(diào)用客戶端的操作流程圖。
具體實(shí)施方式:
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說(shuō)明本發(fā)明,但不用來(lái)限制本發(fā)明的范圍。
一種WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng),如圖1所示,為客戶端和WCF服務(wù)端之間的一個(gè)用于轉(zhuǎn)發(fā)數(shù)據(jù)的適配器中間件系統(tǒng),該中間件系統(tǒng)包括WCF服務(wù)的客戶端引用模塊、消息緩存模塊、自定義消息模塊、服務(wù)端數(shù)據(jù)適配器模塊和客戶端數(shù)據(jù)適配器模塊。
WCF服務(wù)的客戶端引用模塊由Microsoft visual studio的代碼生成器自動(dòng)生成,根據(jù)服務(wù)的個(gè)數(shù)可有多個(gè)引用,每個(gè)引用對(duì)應(yīng)一個(gè)WCF服務(wù),負(fù)責(zé)與WCF服務(wù)端通信。本實(shí)施例中的引用類名為ScadaServiceClient和ScadaServiceCallback,ScadaServiceClient具有int getRealTimeData(String)方法,用于獲取監(jiān)控設(shè)備實(shí)時(shí)數(shù)據(jù),ScadaServiceCallback具有void alarm(String[])方法,用于推送設(shè)備報(bào)警信息。客戶端代碼是移動(dòng)客戶端(Android端)用于socket通信的代碼,是int getRealTimeData(String)方法和void alarm(String[])方法,與服務(wù)端接口方法名一致。getRealTimeData(String)用于向中間件發(fā)送消息,以請(qǐng)求調(diào)用中間件getRealTimeData方法,中間件alarm方法獲得推送數(shù)據(jù),通過(guò)socket連接請(qǐng)求調(diào)用客戶端alarm方法。
消息緩存模塊用于將接收的消息存儲(chǔ),以便適配器逐條處理消息。消息緩存模塊的類圖如圖2所示,消息緩存類名為AdapterCache,包括兩個(gè)屬性變量,均為先入先出的隊(duì)列類型,其中,ToWCFPackageQueue屬性是存放發(fā)往WCF服務(wù)消息的緩存,ToClientMessageQueue屬性是存放發(fā)往客戶端消息的緩存。
自定義消息模塊用于服務(wù)端數(shù)據(jù)適配器模塊和客戶端數(shù)據(jù)適配器模塊之間的數(shù)據(jù)傳輸,如圖3所示,自定義消息包括錯(cuò)誤消息(ErrorMsg)、方法調(diào)用消息(MethodInvokingMsg)、方法返回值消息(MethodReturnValueMsg)和命令消息(OrderPackageMsg)四個(gè)子類消息,它們共有的父類消息為Message抽象類。四種子類消息包含的屬性具體為:錯(cuò)誤消息用于發(fā)送異常,屬性值為錯(cuò)誤消息(Msg);方法調(diào)用消息用于發(fā)送方法的定義,以便遠(yuǎn)程調(diào)用方法,屬性值包括方法名稱(MethodName)、參數(shù)類型(ParamTypes)、參數(shù)值(ParamValues)和用戶狀態(tài)(UserState);方法返回值消息存儲(chǔ)的是方法調(diào)用的結(jié)果,屬性值包括方法名稱(MethodName)、返回值類型(Types)、返回值(Value)和用戶狀態(tài)(UserState);命令消息存放的是用于遠(yuǎn)程控制中間件的命令(如客戶端和服務(wù)器退出、清除緩存等),屬性值包括命令類型(OrderType)和命令參數(shù)(OrderParams)。
服務(wù)端數(shù)據(jù)適配器模塊用于與WCF服務(wù)端通信,包括從消息緩存模塊中讀取消息并根據(jù)消息調(diào)用WCF接口,將WCF接口調(diào)用的返回值或需要調(diào)用的客戶端方法放入消息緩存模塊,通信方式采用net.tcp協(xié)議。服務(wù)端數(shù)據(jù)適配器模塊的類圖如圖4所示:父類為一個(gè)抽象的代理類AbstractWCFProxy,定義了具體實(shí)現(xiàn)類要實(shí)現(xiàn)的數(shù)據(jù)鏈路對(duì)象m_proxyClient(即具體的WCF服務(wù)引用對(duì)象)、具體實(shí)現(xiàn)類類型m_proxyClientType、WCF方法調(diào)用的緩存字典m_wcfServicMethodDictionary、處理發(fā)送到WCF服務(wù)的消息的線程集合m_toWcfPackageHandleThread等屬性,主要方法有啟動(dòng)WCF服務(wù)的消息的線程的Start方法、將消息發(fā)送到客戶端緩存的SendPackageToClientCache(Message msg)方法和調(diào)用WCF服務(wù)引用的SendToWCF(Message msg)方法。具體實(shí)現(xiàn)類根據(jù)不同的WCF服務(wù)有不同的實(shí)現(xiàn)方法,實(shí)現(xiàn)方法與WCF定義的方法對(duì)應(yīng)。
客戶端數(shù)據(jù)適配器模塊用于與客戶端通信,包括從消息緩存模塊中讀取消息并根據(jù)消息調(diào)用客戶端方法,將客戶端方法的返回值或需要調(diào)用的服務(wù)端方法放入消息緩存模塊,通訊方式采用socket通信??蛻舳藬?shù)據(jù)適配器模塊包括兩個(gè)類,適配器管理類AdapterServer和適配器類Adapter。適配器管理類為每個(gè)WCF服務(wù)分配一個(gè)監(jiān)聽端口,監(jiān)聽是否有客戶端希望連接WCF服務(wù),當(dāng)有客戶端希望連接WCF服務(wù)時(shí),創(chuàng)建一個(gè)適配器類,由適配器類的實(shí)例對(duì)象負(fù)責(zé)與客戶端通信。如圖5所示,適配器管理類包括一個(gè)監(jiān)聽器集合s_tcpListenerSet和一個(gè)適配器集合s_adapterSet;屬性監(jiān)聽器集合s_tcpListenerSet負(fù)責(zé)存放所有正在監(jiān)聽的監(jiān)聽器,屬性適配器集合s_adapterSet用于存放所有與客戶端連接的適配器類的對(duì)象,同時(shí)還監(jiān)聽是否有客戶端連接。適配器類的方法主要有兩個(gè),SendPackageToNetwork(Message package)將WCF傳來(lái)的消息發(fā)送給客戶端,SendPackageToWCFCache(Message package)將客服端發(fā)送來(lái)的消息放入WCF的消息緩存。
中間件服務(wù)啟動(dòng)時(shí),根據(jù)WCF服務(wù)的個(gè)數(shù),創(chuàng)建并啟動(dòng)socket監(jiān)聽線程。并將監(jiān)聽線程保存到監(jiān)聽線程列表中。每一個(gè)客戶端連接中間件時(shí),中間件都會(huì)給客戶端分配相應(yīng)的消息緩存、客戶端數(shù)據(jù)適配器模塊、服務(wù)端數(shù)據(jù)適配器模塊等資源,并負(fù)責(zé)打開WCF服務(wù)鏈接。
由于中間件與客戶端通信采用的是Socket通信,各個(gè)操作系統(tǒng)均支持Socket通信,因此本實(shí)施例對(duì)于客戶端為WindowsPhone、IOS、Linux等操作系統(tǒng)都適用。本實(shí)施例中,用Android手機(jī)通過(guò)中間件與WCF服務(wù)通信,WCF服務(wù)為一個(gè)設(shè)備監(jiān)控服務(wù),客戶端調(diào)用服務(wù)器端操作以獲取當(dāng)前的設(shè)備數(shù)據(jù)(溫度、液位等數(shù)據(jù)),服務(wù)端調(diào)用客戶端操作用于數(shù)據(jù)超限報(bào)警(液位過(guò)低等)。
采用上述的WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)進(jìn)行Android手機(jī)與WCF服務(wù)跨平臺(tái)通信的方法,包括如下步驟:
步驟1、中間件系統(tǒng)進(jìn)行初始化,具體方法如下:
步驟1.1、創(chuàng)建適配器管理類AdapterServer的對(duì)象;
步驟1.2、適配器管理類對(duì)象根據(jù)引用的實(shí)時(shí)監(jiān)控WCF服務(wù),創(chuàng)建一個(gè)線程,調(diào)用適配器管理類的監(jiān)聽方法監(jiān)聽是否有客戶端請(qǐng)求連接中間件,通過(guò)中間件連接實(shí)時(shí)監(jiān)控WCF服務(wù);
步驟1.3、若客戶端程序請(qǐng)求與中間件建立鏈接,中間件適配器管理類對(duì)象監(jiān)聽到請(qǐng)求,則初始化一個(gè)與客戶端程序?qū)?yīng)的適配器類Adapter的對(duì)象,并再次進(jìn)入監(jiān)聽狀態(tài),等待下一個(gè)客戶端連接;
步驟1.4、適配器類的對(duì)象與客戶端建立socket鏈接,并創(chuàng)建對(duì)應(yīng)的消息緩存AdapterCache的對(duì)象。
步驟2、客戶端調(diào)用服務(wù)端獲取溫度數(shù)據(jù)的操作,如圖6所示,具體方法如下:
步驟2.1、客戶端程序調(diào)用負(fù)責(zé)通信的函數(shù),將需要調(diào)用的函數(shù)方法封裝為方法調(diào)用消息類的對(duì)象;方法調(diào)用消息類的對(duì)象屬性的方法名為int getRealTimeData,int表示方法的返回值為整型,getRealTimeData表示方法名稱,該名稱與WCF接口的方法名稱一致,參數(shù)類型為一個(gè)元素的數(shù)組[String],表示方法參數(shù)為1個(gè),類型是字符串類型,參數(shù)值為一個(gè)元素的數(shù)組[“temperature”],表示方法的第1個(gè)參數(shù)值為字符串類型的值“temperature”,用戶狀態(tài)沒(méi)有,設(shè)置為空值;
步驟2.2、通信函數(shù)向中間件系統(tǒng)的客戶端數(shù)據(jù)適配器模塊發(fā)送函數(shù)調(diào)用的請(qǐng)求消息;
步驟2.3、客戶端數(shù)據(jù)適配器模塊通過(guò)已經(jīng)鏈接的socket對(duì)象接收請(qǐng)求消息,將客戶端發(fā)送來(lái)的消息放入消息緩存模塊中,并通知服務(wù)端數(shù)據(jù)適配器模塊處理;
步驟2.4、服務(wù)端數(shù)據(jù)適配器模塊接收到通知,啟動(dòng)新線程從消息緩存模塊中讀取出命令消息,通過(guò)消息的消息類型屬性判斷為函數(shù)調(diào)用請(qǐng)求消息,讀取函數(shù)調(diào)用請(qǐng)求消息的函數(shù)名稱,參數(shù)類型,參數(shù)值,使用反射技術(shù)調(diào)用通信鏈路對(duì)象中對(duì)應(yīng)的WCF服務(wù)的客戶端引用模塊操作接口,并將查找到的操作接口反射信息放入方法緩存,下次調(diào)用可直接從方法緩存中查找需要調(diào)用方法,節(jié)省運(yùn)行時(shí)間;這里讀取的消息是命令消息,則中間件執(zhí)行請(qǐng)求的命令(目前只有請(qǐng)求斷開連接命令),錯(cuò)誤消息通過(guò)WCF定義的錯(cuò)誤接收函數(shù)接收,返回值消息會(huì)被忽略掉;
步驟2.5、服務(wù)器將溫度值作為返回值,返回給WCF服務(wù)的客戶端引用模塊,服務(wù)端數(shù)據(jù)適配器模塊將返回值封裝為返回值消息對(duì)象,對(duì)象屬性的方法名為getRealTimeData,該名稱與調(diào)用WCF接口的方法調(diào)用消息名稱一致,返回值類型為一個(gè)元素的數(shù)組[Double],返回值為一個(gè)元素的數(shù)組[30],表示返回值為1個(gè),類型是浮點(diǎn)數(shù)類型,溫度值為30,用戶狀態(tài)沒(méi)有,設(shè)置為空值;使用代理類中的發(fā)送消息至客戶端緩存功能,將返回值消息對(duì)象放入消息緩存模塊中,并通知客戶端數(shù)據(jù)適配器模塊調(diào)用,執(zhí)行步驟2.6;如果沒(méi)有返回值,處理流程結(jié)束;
步驟2.6、客戶端數(shù)據(jù)適配器模塊發(fā)現(xiàn)有返回值消息,則取出返回值消息,將該返回值消息序列化后,通過(guò)socket發(fā)送到客戶端;
步驟2.7、客戶端將接收到的返回值消息反序列化,根據(jù)方法名、參數(shù)類型、參數(shù)值獲得溫度返回值,操作結(jié)束。
步驟3、服務(wù)端調(diào)用客戶端對(duì)液位過(guò)低進(jìn)行報(bào)警的操作,如圖7所示,具體方法如下:
步驟3.1、服務(wù)端程序通過(guò)中間件系統(tǒng)的WCF服務(wù)的客戶端引用模塊調(diào)用服務(wù)端數(shù)據(jù)適配器模塊,發(fā)送報(bào)警消息,消息格式為[“l(fā)evel”,”low”],為包括兩個(gè)元素的數(shù)組,第一個(gè)元素表示報(bào)警為液位報(bào)警,第二個(gè)元素表示報(bào)警信息為液位過(guò)低;
步驟3.2、服務(wù)端數(shù)據(jù)適配器模塊將函數(shù)調(diào)用的請(qǐng)求消息封裝為方法調(diào)用消息,方法名為“void alarm”,表示方法名為alarm,方法返回值為void,參數(shù)類型為:String[],參數(shù)值為[“l(fā)evel”,”low”],表示有一個(gè)參數(shù),參數(shù)類型為字符串?dāng)?shù)組,參數(shù)值為[“l(fā)evel”,”low”]。方法名、參數(shù)類型、參數(shù)值需要與客戶端要調(diào)用的方法一致。調(diào)用WCF適配器抽象代理類的發(fā)送消息至客戶端緩存功能,將消息放入消息緩存模塊中,并通知客戶端數(shù)據(jù)適配器模塊有緩存數(shù)據(jù);
步驟3.3、客戶端數(shù)據(jù)適配器模塊從消息緩存模塊中取出函數(shù)調(diào)用請(qǐng)求消息,序列化后通過(guò)Socket鏈接將該函數(shù)調(diào)用請(qǐng)求消息發(fā)送給對(duì)應(yīng)的客戶端通信接口;
步驟3.4、客戶端通信接口判斷消息為函數(shù)調(diào)用請(qǐng)求消息,將該函數(shù)調(diào)用請(qǐng)求消息反序列化后,使用反射技術(shù),調(diào)用方法聲明為void alarm(String[])類型的方法。
一般情況下,WCF服務(wù)端調(diào)用客戶端接口沒(méi)有返回值,否則有可能造成操作的死鎖。本實(shí)施例中,void alarm(String[])方法執(zhí)行報(bào)警操作,由于返回值為void,即沒(méi)有返回值,操作結(jié)束。
本實(shí)施例的WCF框架net.tcp協(xié)議跨平臺(tái)通信的系統(tǒng)即方法符合軟件設(shè)計(jì)的“開閉原則”,在不改動(dòng)原有WCF平臺(tái)服務(wù)端代碼的情況下,擴(kuò)展了WCF平臺(tái)的net.tcp協(xié)議,使之與不能安裝.net Framework框架的操作系統(tǒng)手機(jī)客戶端進(jìn)行通信,極大的提高了net.tcp協(xié)議的適用性,加快了代碼的開發(fā)速度,增強(qiáng)了項(xiàng)目實(shí)施和維護(hù)的可行性。
最后應(yīng)說(shuō)明的是:以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明權(quán)利要求所限定的范圍。