JAVA與.NET的相互調(diào)用——TCPIP相互調(diào)用基本架構(gòu)_第1頁(yè)
JAVA與.NET的相互調(diào)用——TCPIP相互調(diào)用基本架構(gòu)_第2頁(yè)
JAVA與.NET的相互調(diào)用——TCPIP相互調(diào)用基本架構(gòu)_第3頁(yè)
JAVA與.NET的相互調(diào)用——TCPIP相互調(diào)用基本架構(gòu)_第4頁(yè)
JAVA與.NET的相互調(diào)用——TCPIP相互調(diào)用基本架構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、java與.net 的相互調(diào)用tcp/ip相互調(diào)用基本架構(gòu)tcp/ip套接字的概念tcp/ip (傳輸控制協(xié)議 / 網(wǎng)際協(xié)議)是網(wǎng)絡(luò)互連的通信協(xié)議,通過(guò)它可以實(shí)現(xiàn)各種異構(gòu)網(wǎng)絡(luò)或異種機(jī)之間的互聯(lián)通信。tcp/ip 是 transmission control protocol/internet protocol的簡(jiǎn)寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是internet最基本的協(xié)議、internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡(jiǎn)單地說(shuō),就是由網(wǎng)絡(luò)層的ip 協(xié)議和傳輸層的tcp 協(xié)議組成的。tcp/ip 定義了電子設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸

2、的標(biāo)準(zhǔn)。tcp/ip 是一個(gè)四層的分層體系結(jié)構(gòu)。高層為傳輸控制協(xié)議,它負(fù)責(zé)聚集信息或把文件拆分成更小的包。低層是網(wǎng)際協(xié)議,它處理每個(gè)包的地址部分,使這些包正確的到達(dá)目的地。tcp/ip已成為當(dāng)今計(jì)算機(jī)網(wǎng)絡(luò)最成熟、應(yīng)用最廣的互聯(lián)協(xié)議。internet采用的就是tcp/ip 協(xié)議,網(wǎng)絡(luò)上各種各樣的計(jì)算機(jī)上只要安裝了tcp/ip 協(xié)議,它們之間就能相互通信。tcp/ip套接字通訊的開(kāi)發(fā)在眾多的開(kāi)發(fā)語(yǔ)言中,絕大部分的開(kāi)發(fā)語(yǔ)言都支持tcp/ip協(xié)議通訊,開(kāi)發(fā)過(guò)程也十分相像,先設(shè)置好 socket , 然后由客戶端發(fā)送請(qǐng)求信息, 服務(wù)器連接客戶端接收到請(qǐng)求后再返還信息。而在 .net系統(tǒng)當(dāng)中則稍有不同,系

3、統(tǒng)把socket對(duì)象包裝在 tcpclient對(duì)象內(nèi),對(duì) socket對(duì)象的生命周期進(jìn)行管理。在開(kāi)發(fā)過(guò)程當(dāng)中, 服務(wù)器與客戶端的開(kāi)發(fā)語(yǔ)言有所不同的情況經(jīng)常發(fā)生,服務(wù)器是在 jdk1.6的環(huán)境下進(jìn)行開(kāi)發(fā)的,客戶卻要求使用.net 開(kāi)發(fā)客戶端,這往往會(huì)令開(kāi)發(fā)人員感到困惑!下面在下使用 java 為服務(wù)器, .net 為客戶端為例子,為大家介紹一下如何使用tcp/ip 協(xié)議進(jìn)行java .net之間的相互調(diào)用。像tcp/ip 實(shí)現(xiàn)聊天室這樣的例子很多,開(kāi)發(fā)起來(lái)也比較簡(jiǎn)單,因?yàn)橥ㄓ嶋p方都是使用string來(lái)傳送信息。而在真正建立erp、oa、crm 等系統(tǒng)的時(shí)候,通訊雙方都必須先建立一套統(tǒng)一的通訊契約

4、,才能實(shí)現(xiàn)tcp/ip通訊,下面將為大家介紹一個(gè)比較典型的企業(yè)信息通訊實(shí)例。信息傳送方式因?yàn)?net 與 java 各有不同的特性,雙方不可能直接通過(guò)的序列化對(duì)象來(lái)傳輸信息,常用的信息交換方式有以下三種:1. 最笨拙也是最復(fù)雜的一種傳息方式,就是直接使用“ 頭文件說(shuō)明 + 字段屬性 ” 的方式。這是一個(gè)既原始又麻煩的通訊方式,因?yàn)槊總€(gè)契約都要以二進(jìn)制的方式發(fā)送一個(gè)請(qǐng)求,就算是同一類契約,隨著參數(shù)的不同,每個(gè)請(qǐng)求的長(zhǎng)度也會(huì)發(fā)生改變。這樣的傳息方式雖然是麻煩,但在不同開(kāi)發(fā)語(yǔ)言相互調(diào)用的時(shí)候卻經(jīng)常會(huì)看到,這可能是因?yàn)殚_(kāi)發(fā)人員對(duì)兩種開(kāi)發(fā)語(yǔ)言未能完全熟悉,所以倒置使用這最原始最簡(jiǎn)單的開(kāi)發(fā)方式。2. 使用

5、 xml 的信息傳送方式, 這是最常見(jiàn), 使用最廣的信息傳遞方式。在絕大多數(shù)的開(kāi)發(fā)平臺(tái)都會(huì)支持 xml , 所以 xml 在 web 網(wǎng)絡(luò)傳訊過(guò)程中最為常見(jiàn)。 但 xml 最大的一個(gè)缺點(diǎn)就是過(guò)于堪輿,耗費(fèi)大量的傳輸流量。3. 對(duì)于 xml 的缺點(diǎn), json 應(yīng)運(yùn)而生而且發(fā)展迅速,json 本是源于 javascript的,多數(shù)只用于 b/s 的頁(yè)面開(kāi)發(fā), 但隨著技術(shù)的發(fā)展和多個(gè)開(kāi)發(fā)語(yǔ)言的支持,現(xiàn)今到處都可以看json 的身影。因?yàn)?json 既提供一套跨平臺(tái)的通訊方式,也免去xml 復(fù)雜特性,受到各類型開(kāi)發(fā)人員的歡迎。服務(wù)器端開(kāi)發(fā)通訊契約首先建立一套服務(wù)器與客戶端同時(shí)接受通訊契約, cont

6、ract 的 name特性是契約的名稱,服務(wù)器會(huì)通過(guò)此名稱在contracts.xml文件中找到該契約,然后根據(jù)output的 package屬性, class屬性, method屬性找到該契約的包名稱,類名,調(diào)用的方法等屬性。 /name為契約名,服務(wù)器與客戶端必須同時(shí)遵守此契約獲取 age 等于此值的 people對(duì)象集 /說(shuō)明此契約內(nèi)容manager /接收到 getpersonbyage請(qǐng)求時(shí)所調(diào)用的包名稱personmanager /接收到 getpersonbyage請(qǐng)求時(shí)所調(diào)用的類名稱getlistbyage /接收到 getpersonbyage請(qǐng)求時(shí)所調(diào)用的處理方法名稱獲取

7、id 等于此值的 people對(duì)象 manager personmanagergetlistbyid以 json 方式實(shí)現(xiàn)信息傳送盡管目前在 c/s 的開(kāi)發(fā)當(dāng)中大部分還是使用序列化對(duì)象和分節(jié)字段的方式進(jìn)行雙方通訊,但在這個(gè)實(shí)例當(dāng)中,在下想以json 通訊方式為例子來(lái)實(shí)現(xiàn)。首先,客戶端會(huì)使用額定格式的json 向服務(wù)器發(fā)送請(qǐng)求 : “contractname” :“getpeoplebyage”, “params ”: 23 contractname代表著契約名稱,系統(tǒng)會(huì)根據(jù)此名稱在contracts.xml文件中找到 name 等于 getpeoplebyage的 contract項(xiàng)。 然后在

8、對(duì)應(yīng) output的子項(xiàng) package,class,method中查找到對(duì)應(yīng)的包,類型和方法。params是客戶端傳輸過(guò)來(lái)的參數(shù),服務(wù)器端會(huì)調(diào)用對(duì)象的方法輸入?yún)?shù)23 后,得到計(jì)算結(jié)果,最后把結(jié)果返還到客戶端。在這里有兩點(diǎn)是值得注意的,第一點(diǎn)是 json 中的契約格式是固定的, 服務(wù)器與客戶端都必須遵守此契約,在 contractname中輸入是必須對(duì)應(yīng)的契約名稱,而在params中輸入的必輸是一個(gè)參數(shù)的集合,哪怕里面只包含有一個(gè)參數(shù)。第二點(diǎn)是在contracts.xml文件, output里面的package,class,method是服務(wù)器端自定義的,它只是綁定了服務(wù)器端實(shí)現(xiàn)getper

9、sonbyage契約的方法,而這些方法并不是固定,服務(wù)器可以根據(jù)系統(tǒng)的需要而修改。這個(gè)做法有點(diǎn)像struts里面的 struts.xml文件, 其意義就是在于使服務(wù)器的處理方法與客戶端發(fā)送的請(qǐng)求實(shí)現(xiàn)分離。基本結(jié)構(gòu)系統(tǒng)的基本結(jié)構(gòu)如圖,客戶端會(huì)以json 方式 “contractname” :“getpeoplebyage” ,“ params ”:23發(fā)送請(qǐng)求到服務(wù)器,服務(wù)器會(huì)利用“ 數(shù)據(jù)轉(zhuǎn)換層 ” 把接收到的請(qǐng)求轉(zhuǎn)換成contract對(duì)象。然后邏輯轉(zhuǎn)換層會(huì)根據(jù)該contract對(duì)象調(diào)用對(duì)應(yīng)的方法,最后把計(jì)算結(jié)果以json 方式返回到客戶端。注意在服務(wù)器與客戶端信息交換的過(guò)程中,都是使用json

10、 格式。json 數(shù)據(jù)轉(zhuǎn)換在服務(wù)器端, 當(dāng)接到到客戶端請(qǐng)求后, transfer類負(fù)責(zé)把接收到的json 數(shù)據(jù)轉(zhuǎn)換成 contract對(duì)象。在 transfer里面使用 org.json工具包作為 json 的轉(zhuǎn)化工具, org.json工具包可于以下網(wǎng)址下載 /java/index.html。而 implement類包含 getresult(contract contract )方法,其作就是根據(jù)contract對(duì)象package ,class ,method等屬性,調(diào)用 “ 邏輯轉(zhuǎn)換層 ” 的對(duì)應(yīng)方法,最后把計(jì)算結(jié)果返還給inputcontrol。服務(wù)器

11、端接收請(qǐng)求后就會(huì)直接調(diào)用inputcontrol對(duì)輸入的數(shù)據(jù)進(jìn)行處理。/contract實(shí)體類,包含契約的package,class,method,params等多個(gè)屬性package model; import org.json.jsonarray; publicclass contract private string package1; private string class1; private string method; private jsonarray params ; publicvoid setpackage1(string package1) this.package1

12、= package1; public string getpackage1() return package1; publicvoid setclass1(string class1) this.class1 = class1; public string getclass1() return class1; publicvoid setmethod(string method) this.method = method; public string getmethod() return method; publicvoid setparams(jsonarray params ) this.

13、 params = params ; public jsonarray getparams() returnparams ; / 把輸入的 string字符串轉(zhuǎn)化為contract對(duì)象/ 在這里使用 org.json工具包作為 json的轉(zhuǎn)化工具,org.json工具包可于以下網(wǎng)址下載 /java/index.html package common; import java.io.file; import java.io.ioexception; import javax.xml.parsers.documentbuilder; import javax.x

14、ml.parsers.documentbuilderfactory; import javax.xml.parsers.parserconfigurationexception; import model.contract; import org.json.*; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.nodelist; import org.xml.sax.saxexception; publicclass transfer private transfer() privatest

15、atic string contractname=null; privatestatic contract contract=new contract(); privatestatic jsonobject jsonobject=null; publicstatic contract getcontract(string data) throws exception, jsonexception, parserconfigurationexception, saxexception, ioexception jsonobject=new jsonobject(data); /把字符串轉(zhuǎn)化為 j

16、sonoject對(duì)象 getcontractname(); / 獲取契約名稱 getproperty(); / 獲取契約的 package,class,method屬性 getparams(); /獲取契約的參數(shù)集return contract; /* * 獲取契約對(duì)應(yīng)的包名稱,類名稱,方法名稱 */privatestaticvoid getproperty() throws exception file file = new file(contracts.xml); documentbuilderfactory factory = documentbuilderfactory.newinst

17、ance(); documentbuilder builder = factory.newdocumentbuilder(); document doc = builder.parse(file); nodelist nodelist = doc.getelementsbytagname(contract); element contractelement=null; for ( int i = 0; i nodelist.getlength(); i+) if (nodelist.item(i).getattributes().item(0).getnodevalue().equals(co

18、ntractname) contractelement=(element)nodelist.item(i); break ; if (contractelement!=null) element outputelement=(element)contractelement.getelementsbytagname(output).item(0); contract.setpackage1(outputelement.getelementsbytagname( package).item(0).gettextcontent(); /獲取包名稱 contract.setclass1(outpute

19、lement.getelementsbytagname( class).item(0).gettextcontent(); /獲取類名稱 contract.setmethod(outputelement.getelementsbytagname( method).item(0).gettextcontent(); /獲取方法名 elsethrownew exception( 未能找到對(duì)象的契約 ); /* * 獲取契約名稱 */privatestaticvoid getcontractname() throws jsonexception contractname=jsonobject.get

20、string(contractname); /* * 獲取輸入?yún)?shù) */privatestaticvoid getparams() throws jsonexception contract.setparams(jsonobject.getjsonarray(params); / 調(diào)用 contract對(duì)象里面包中的類的某個(gè)方法,獲取計(jì)算結(jié)果package common; import java.lang.reflect.method; import java.util.hashmap; import java.util.map; import org.json.jsonarray; impo

21、rt model.*; publicclass implement private contract contract; private string fullname; privatestatic map objects=new hashmap(); / 保存對(duì)象實(shí)體privatestatic map classes=new hashmap(); / 保存類名/* * 先獲取對(duì)應(yīng)的對(duì)象,再用反射模式調(diào)用對(duì)象的方法,獲取計(jì)算結(jié)果 */public object getresult(contract contract) this.contract=contract; this.fullname=

22、contract.getpackage1()+.+contract.getclass1(); try object manager=getobject(); class theclass=classes.get (fullname); method method=theclass.getdeclaredmethod(contract.getmethod(),jsonarray.class); return method.invoke(manager, contract.getparams(); catch (exception e) / todo auto-generated catch bl

23、ock e.printstacktrace(); returnnull; /* * 多次使用反射創(chuàng)建獲取對(duì)象會(huì)損耗一定性能,所以此處使用單體模式獲取對(duì)應(yīng)的對(duì)象 */private object getobject() throws instantiationexception, illegalaccessexception, classnotfoundexception if(!objects.containskey(fullname) class theclass = class.forname(fullname); classes.put(fullname,theclass); objec

24、t manager=theclass.newinstance(); objects.put(fullname, manager); return objects.get (fullname); / 直接把接收到的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成string,然后通過(guò) transfer把 string轉(zhuǎn)化為 contract對(duì)象,最后通過(guò)implement獲取運(yùn)算結(jié)果package common; import java.io.datainputstream; import model.contract; publicclass inputcontrol private datainputstream inpu

25、tstream; public inputcontrol(datainputstream inputstream) this.inputstream=inputstream; /* * 直接把接收到的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成string,然后通過(guò) transfer把 string轉(zhuǎn)化為 contract對(duì)象,最后通過(guò)implement對(duì)象獲取運(yùn)算結(jié)果 */public object getresult() byte bytemessage=new byte 1024 ; /在此處只獲取測(cè)試數(shù)據(jù), 在真正運(yùn)行時(shí)應(yīng)使用分批緩存的方式try int n=inputstream.read(bytemessag

26、e); string message=new string(bytemessage,ascii); contract contract=transfer.getcontract(message); implement implement=new implement(); object result=implement.getresult(contract); return result; catch(exception ex) ex.printstacktrace(); returnnull; 最后,系統(tǒng)通過(guò)outputcontrol類把計(jì)算結(jié)果返還給客戶端。/ 把計(jì)算結(jié)果返回到客戶端pack

27、age common; import java.io.dataoutputstream; publicclass outputcontrol private dataoutputstream outputstream; public outputcontrol(dataoutputstream outputstream) this.outputstream=outputstream; publicvoid output(object data) try outputstream.writebytes(data.tostring(); outputstream.flush(); catch(ex

28、ception ex) ex.printstacktrace(); / 運(yùn)行系統(tǒng)進(jìn)行測(cè)試package common; import java.io.*; import .*; publicclass program privatestatic serversocket serversocket; publicstaticvoid main(string args) throws classnotfoundexception / todo auto-generated method stub socket socket; try serversocket=new serversocket(51

29、00 ); / 激活 5100 端口while( true) /循環(huán)捕捉請(qǐng)求 socket=serversocket.accept(); dataoutputstream outstream=new dataoutputstream(socket.getoutputstream(); /獲取 dataoutputstream輸出流 datainputstream inputstream=new datainputstream(socket.getinputstream(); / 獲取 datainputstream輸入流 /調(diào)用 inputcontrol對(duì)象獲取運(yùn)算結(jié)果 inputcontro

30、l inputcontrol=new inputcontrol(inputstream); object result=inputcontrol.getresult(); /調(diào)用 outputcontrol對(duì)象輸入運(yùn)算結(jié)果 outputcontrol outputcontrol=new outputcontrol(outstream); outputcontrol.output(result); catch (exception e) / todo auto-generated catch block e.printstacktrace(); 邏輯轉(zhuǎn)換層現(xiàn)在先開(kāi)發(fā)一個(gè)例子作為參考,在完成客戶端

31、開(kāi)發(fā)的時(shí)候就可以進(jìn)行測(cè)試。這個(gè)例子是先在manager包里面設(shè)置好一個(gè)類personmanager,personmanager類中包含一個(gè)名為getlistbyage的方法。在 contracts.xml文件設(shè)置一個(gè)名為getpersonbyage的契約,客戶端就可以通過(guò)這個(gè)契約在遠(yuǎn)程調(diào)用此方法獲取計(jì)算結(jié)果。/ 設(shè)置 person對(duì)象package model; publicclass person privateint id; private string name; privateint age; publicvoid setid(int id) this.id = id; publici

32、nt getid() return id; publicvoid setname(string name) = name; public string getname() return name; publicvoid setage(int age) this.age = age; publicint getage() return age; / 開(kāi)發(fā) personmanager package manager; import java.util.arraylist; import java.util.list; import org.json.jsonarray; imp

33、ort org.json.jsonexception; import model.*; publicclass personmanager /* * 測(cè)試數(shù)據(jù) */private list getlist() list personlist=new arraylist(); person person1=new person(); person1.setid(0); person1.setage(23); person1.setname(mike); personlist.add(person1); person person2=new person(); person2.setid(1);

34、person2.setage(29); person2.setname(leslie); personlist.add(person2); person person3=new person(); person3.setid(2); person3.setage(21); person3.setname(jack); personlist.add(person3); person person4=new person(); person4.setid(3); person4.setage(23); person4.setname(rose); personlist.add(person4);

35、return personlist; /* * 獲取年齡等于 age 參數(shù)的 person ,因?yàn)閿?shù)據(jù)將返還給客戶端,所以這時(shí)把輸出數(shù)據(jù)轉(zhuǎn)化為 jsonarray */public jsonarray getlistbyage(jsonarray jsonlist) throws jsonexception int age=jsonlist.getint(0); / 因?yàn)檩斎雲(yún)?shù)為一個(gè)集合params ,所以即使只包括一個(gè)參數(shù),也是通過(guò)要jsonlist的第一個(gè)參數(shù)來(lái)獲取的。 list personlist=getlist(); list resultlist=new arraylist();

36、 for( int n= 0;npersonlist.size();n+) if(personlist.get (n).getage()=age) resultlist.add(personlist.get (n); jsonarray jsonarray=new jsonarray(resultlist); return jsonarray; 然后在 contracts.xml設(shè)置綁定: /契約名稱獲取 age 等于此值的 people對(duì)象集 /文字說(shuō)明manager /綁定包personmanager /綁定類getlistbyage /綁定處理方法綁定以后, 在完成客戶端開(kāi)發(fā)的時(shí)候就可以

37、進(jìn)行測(cè)試。使用這開(kāi)發(fā)模式的好處在于利用json 作用數(shù)據(jù)傳輸?shù)臉蛄海鉀Q不同開(kāi)發(fā)平臺(tái)之間數(shù)據(jù)難以同步的問(wèn)題。使用json 比 xml 更容易操作,可以減少傳輸流量,而且受到各開(kāi)發(fā)語(yǔ)言的支持。使用contracts.xml在服務(wù)器綁定處理方式,使服務(wù)器的處理方法與客戶端發(fā)送的請(qǐng)求實(shí)現(xiàn)分離。下面開(kāi)始介紹一下客戶端的開(kāi)發(fā)。客戶端開(kāi)發(fā)客戶端的開(kāi)發(fā)的開(kāi)發(fā)相對(duì)簡(jiǎn)單,因?yàn)槠跫s是使用“contractname” :“getpeoplebyage” ,“ params ”:23 json 方式進(jìn)行傳送,所以先開(kāi)發(fā)一個(gè)messageentity實(shí)體類來(lái)承載契約。namespace model datacontra

38、ct publicclass messageentity /契約名稱 datamember publicstring contractname get ; set ; /注意參數(shù)使用集合的方式來(lái)傳送 datamember public ilist params get ; set ; 然后開(kāi)發(fā)一個(gè)messagemanager信息管理器來(lái)管理契約的傳送過(guò)程,因?yàn)?framework4.0里面,未能對(duì) json 數(shù)據(jù)中集合的轉(zhuǎn)換提供一個(gè)簡(jiǎn)單函數(shù),所以在messagemanager里面使用了一個(gè) newtonsoft.json工具包,該工具包里面對(duì)json 的操作有著強(qiáng)大支持,可以在http:/ s

39、ystem; using system.collections.generic; using system.linq; using system.text; using system.net.sockets; using system.runtime.serialization.json; using system.io; using system.threading; using model; using newtonsoft.json; namespace common publicclass messagemanager privatestatic tcpclient _tcpclien

40、t; /設(shè)置 tcpclient對(duì)象publicstatic tcpclient tcpclient set _tcpclient = value; /此處只使用靜態(tài)方法實(shí)現(xiàn)數(shù)據(jù)傳送,發(fā)送請(qǐng)求后使用thread.sleep等待運(yùn)算結(jié)果,這樣存在一定風(fēng)險(xiǎn),也會(huì)降低效率 /在大型的開(kāi)發(fā)當(dāng)中應(yīng)該進(jìn)一步改善,把信息發(fā)送與信息接收分開(kāi)處理publicstaticobject getmessage(messageentity message, type type) networkstream networkstream = _tcpclient.getstream(); /利用 datacontractj

41、sonserializer將 messageentity對(duì)象實(shí)現(xiàn)序列化,發(fā)送到服務(wù)器 datacontractjsonserializer jsonserializer = new datacontractjsonserializer(typeof(messageentity); lock (networkstream) jsonserializer.writeobject(networkstream, message); networkstream.flush(); thread.sleep(500 ); /獲取回傳信息,這里設(shè)置接收值1024 個(gè)字節(jié) /在實(shí)際的開(kāi)發(fā)當(dāng)中應(yīng)該使用分批緩存的方

42、式實(shí)現(xiàn)數(shù)據(jù)接收byte messagebyte = new byte 1024 ; int n = 0; lock (networkstream) n = networkstream.read(messagebyte, 0, 1024 ); if (n = 0) returnnull; /根據(jù)輸入的 type對(duì)象,把二進(jìn)制信息轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象string jsonmessage = encoding.ascii.getstring(messagebyte); /利用 netonsoft.json工具集將獲取的json 數(shù)據(jù)轉(zhuǎn)化對(duì)象object returnvalue = javascriptc

43、onvert.deserializeobject(jsonmessage, type); return returnvalue; 下面開(kāi)發(fā)一個(gè)getpersonbyage 契約作為例子:using system; using system.collections.generic; using system.text; using model; using common; namespace dal publicclass persondal /建立 messageentity對(duì)象,注意輸入額定契約名稱及數(shù)據(jù)參數(shù),獲取查詢結(jié)果/person的年齡 /獲取年齡等于此值的person對(duì)象集 publ

44、ic ilist getpersonbyage(int age) /先建立一個(gè) messageentity對(duì)象,設(shè)定其contractname及參數(shù)集合 /注意 contractname的值必須與服務(wù)器端contracts.xml文件中 contract 項(xiàng)的 name 特性相對(duì)應(yīng) messageentity messageentity = new messageentity(); messageentity.contractname = getpersonbyage; messageentity.params = new list age ; /調(diào)用 messagemanager的 getmessage方法獲取計(jì)算結(jié)果 ilist personlist = (list)messagemanager.getmessage(messageentity, typeof(list); return personlist; persondal類中的 getpersonbyage

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論