版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
C#.NET編程技術(shù)第12講.NET遠程通信1內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程2內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程3通信模型概述什么是通信?兩個或多個物理或邏輯實體之間的數(shù)據(jù)交互計算機通信的要素:信道通信地址通信協(xié)議4信道“信道”不是一個有明確意義的名詞在不同的應(yīng)用場景下,可能具有不同的含義物理的信道光纖信道,無線頻點,CDMA碼點邏輯的信道Ethernet,F(xiàn)DDI,ATM,X.25TCP,UDP,HTTP,IPC本講所說的信道,指將數(shù)據(jù)從通信一端傳遞到另一端的邏輯路徑,例如TCP虛電路5通信地址與通信協(xié)議通信地址不是一個孤立的概念,常常是與通信協(xié)議相配套的。在TCP/IP網(wǎng)絡(luò)的不同層次上有不同的編址方式和通信協(xié)議,例如:——數(shù)據(jù)鏈路層:MAC地址,Ethernet協(xié)議——網(wǎng)絡(luò)層:IP地址,IP協(xié)議——傳輸層:IP地址+端口,TCP/UDP協(xié)議——應(yīng)用層:域名/IP地址+端口,HTTP協(xié)議本講關(guān)注的是傳輸層和應(yīng)用層通信。6內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程7套接字通信在TCP/IP網(wǎng)絡(luò)上的傳統(tǒng)通信模型起源于UNIX操作系統(tǒng)以一個“套接字(socket)”作為通信的端點,數(shù)據(jù)在兩個socket之間傳遞套接字通信不關(guān)心應(yīng)用層數(shù)據(jù)的格式8套接字通信示例(TCP服務(wù)器端)//創(chuàng)建一個偵聽套接字SocketsListen=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//偵聽套接字綁定地址sListen.Bind(newIPEndPoint(IPAddress.Any,8960));//偵聽到來的連接sListen.Listen();//接受連接到一個新的套接字SocketsAccecpt=sListen.Accept();//使用新的套接字接收和發(fā)送數(shù)據(jù)sAccecpt.Send(…)9.NET類庫對套接字通信的封裝為了使用方便,.NET針對不同的協(xié)議,對套接字通信進行了封裝傳輸層協(xié)議封裝TcpListener/TcpClient/UdpClient用于執(zhí)行TCP連接通信和UDP無連接通信UDP是無連接的、基于數(shù)據(jù)包的協(xié)議,數(shù)據(jù)包所承載通信數(shù)據(jù)的格式需自行定義;TCP是基于流的協(xié)議,單次接收不一定能收到足夠的數(shù)據(jù)。因此必須自行制定協(xié)議,確保收到了足夠的數(shù)據(jù)。10.NET類庫對套接字通信的封裝(續(xù))應(yīng)用層協(xié)議封裝WebClientWebRequestWebResponse用于以URI標(biāo)定地址的通信,一般都是請求/響應(yīng)模式具體派生類HttpWebRequest/HttpWebResponse11使用套接字封裝類的示例//發(fā)起到:80的TCP連接,并收發(fā)數(shù)據(jù)TcpClienttcpClient=newTcpClient("",80);using(Streams=tcpClient.GetStream()){s.Read();s.Write();}//發(fā)起到的HTTP請求,并獲得響應(yīng)using(HttpWebRequesthttpReq=HttpWebRequest.Create("")asHttpWebRequest){HttpWebResponsehttpRes=httpReq.GetResponse();}12套接字及封裝通信類的特點優(yōu)點:一脈傳承自UNIX,是經(jīng)典的網(wǎng)絡(luò)通信編程模型,C/C++程序員容易入手使用簡單,含義明確不足:程序員需熟悉通信協(xié)議及TCP/IP協(xié)議棧如果使用其它通信,如IPC、MSMQ,程序員同樣需熟悉具體協(xié)議需自行維護通信數(shù)據(jù)格式,及通信的完整性這意味著:程序員必須消耗額外的精力用于學(xué)習(xí)通信協(xié)議的底層細(xì)節(jié),和設(shè)計可靠的數(shù)據(jù)傳輸流程。而這種學(xué)習(xí)和設(shè)計常常不是軟件項目所要求的業(yè)務(wù)工作,而只是一些潛在的背景知識和底層架構(gòu)13內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程14面向?qū)ο蟮耐ㄐ?NET是面向?qū)ο蟮恼Z言而使用socket的通信,傳遞的是無格式數(shù)據(jù)能否在通信中傳遞對象?通信中傳遞對象的好處:與面向?qū)ο缶幊田L(fēng)格保持一致,無需關(guān)注通信中的數(shù)據(jù)流格式及數(shù)據(jù)傳遞的完整性;與常規(guī)編程方式一樣使用對象,不關(guān)心底層如何通信的,從而集中全部精力在業(yè)務(wù)功能上。15從編程角度看通信的實質(zhì)從編程的角度看,什么是通信?所謂通信,就是函數(shù)調(diào)用。//偵聽到來的連接sListen.Listen();//接受連接到一個新的套接字SocketsAccept=sListen.Accept();//使用新的套接字接收和發(fā)送數(shù)據(jù)byte[]data={1,2,3,4};sAccept.Send(data);byte[]rcvData=newbyte[5];sAccept.Receive(rcvData);發(fā)送數(shù)據(jù),就是調(diào)用一個函數(shù)(Send)并把要發(fā)送的數(shù)據(jù)(data)作為形參傳入。接收數(shù)據(jù),就是調(diào)用一個函數(shù)(Receive)并把要存儲收到數(shù)據(jù)的緩沖區(qū)作為形參傳入。16基于socket通信的示意圖SocketSocket.Send通信對象:通信函數(shù):信道Socket.ReceiveSocket字節(jié)數(shù)據(jù)17從編程角度看通信的實質(zhì)(續(xù))在基于socket的通信中,被調(diào)用的函數(shù)都是固定類型(Socket/TcpClient/WebRequest等)的方法傳遞的數(shù)據(jù)則是無格式的連續(xù)字節(jié)數(shù)據(jù)的傳入和接收都是使用函數(shù)形參發(fā)送和接收使用不同的函數(shù)那么,是否可以……以任意類型的方法作為通信函數(shù)?傳遞的數(shù)據(jù)能否是有意義的對象?以函數(shù)返回值的方式返回數(shù)據(jù)?發(fā)送端、接收端的函數(shù),能否是同一個?18面向?qū)ο笸ㄐ诺氖疽鈭DMyObjectResonseSocket.ExecReq(Requestreq)通信對象:通信函數(shù):信道MyObjectResonseSocket.ExecReq(Requestreq)任意對象作為通信對象傳遞的數(shù)據(jù)是有意義的(一個Request類型對象)以函數(shù)返回值的方式返回數(shù)據(jù)(一個Response類型對象)MyObjectobj=newMyObject();Requestreq=newRequest(…);Responseres=obj.ExecReq(req);這樣的通信,怎樣編程?這與平常的編程沒有任何區(qū)別,根本看不出通信的存在!發(fā)送和接收函數(shù),是同一個(ExecReq)19面向?qū)ο笸ㄐ琶嫦驅(qū)ο笸ㄐ排c面向?qū)ο蟊镜鼐幊?,在代碼上完全一樣。二者區(qū)別在于:參數(shù)傳到了本地,還是傳到了遠程機器函數(shù)的執(zhí)行,是在本地還是在遠程機器面向?qū)ο笸ㄐ啪幊蹋嚎雌饋硐袷钦{(diào)用了個本地函數(shù),就得到了結(jié)果;實際上參數(shù)是傳遞到了遠程機器上,而函數(shù)也是在遠程機器上執(zhí)行的。20面向?qū)ο笸ㄐ诺膸讉€要點信道數(shù)據(jù)通過什么信道傳遞的(TCP/HTTP/IPC…)通信對象通信雙方使用的通信對象是什么在socket通信中,socket標(biāo)識通信端點;而在面向?qū)ο笸ㄐ胖?,端點是任何對象,我們叫做通信對象封裝格式面向?qū)ο笸ㄐ艂鬟f的是對象,而各類信道只能傳遞無格式的字節(jié)串或文本,那么如何將對象封裝成字節(jié)串或文本,且不丟失對象本身的信息21.NET3.5支持的主要通信模型.NETRemoting僅能使用在.NET平臺上“信道”可使用HTTP/TCP/IPC,也可以自定義可以用Binary/XML/SOAP封裝通信中的對象WebServices與平臺無關(guān)的通信模型,兼容性好“信道”只能使用HTTP只能用SOAP封裝通信中的對象WindowsCommunicationFoundation(WCF).NET3.0提供的統(tǒng)一通信模型,融合了.NETRemoting/WebServices/MSMQ等多種通信方式后兩種通信模型,我們在講完ASP.NET之后再講述22內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程23.NETRemoting一種面向?qū)ο笸ㄐ拍J叫诺溃篢CP/HTTP/IPC,可自行擴展定義通信對象:自定義引用類型封裝格式:TCP和IPC信道使用Binary,HTTP信道使用SOAP負(fù)責(zé)兩個應(yīng)用程序域之間的通信回顧:什么是應(yīng)用程序域?24.NETRemoting的幾個術(shù)語代理、消息、信道、格式化程序?qū)ο蠓馑头绞組BR(引用封送)和MBV(值封送)MBR激活類型WKO(知名對象)和CAO(客戶端激活對象)WKO類型狀態(tài)配置單例和單一調(diào)用25.NETRemoting通信示意圖客戶端服務(wù)器端調(diào)度程序格式化程序透明代理信道格式化程序真實代理遠程對象26.NETRemoting通信示意圖客戶端服務(wù)器端調(diào)度程序格式化程序透明代理信道格式化程序真實代理遠程對象“代理”的作用,是給客戶端提供通信對象的接口,使客戶端認(rèn)為自己好像在調(diào)用一個本地對象,而實際上通信對象的實體在服務(wù)器端?!按怼必?fù)責(zé)接收客戶端輸入的調(diào)用參數(shù),然后將這些參數(shù)封裝成“消息”并傳遞給服務(wù)器端。所謂“消息”,就是一個實現(xiàn)了IMessage接口的對象。27.NETRemoting通信示意圖客戶端服務(wù)器端調(diào)度程序格式化程序透明代理信道格式化程序真實代理遠程對象“格式化程序”負(fù)責(zé)將要傳遞給服務(wù)器端的調(diào)用參數(shù)進行變換,以適應(yīng)信道。例如對于TCP和IPC信道,將被變換成二進制格式(Binary)。這就是前述三要點中的“封裝格式”。28.NETRemoting通信示意圖客戶端服務(wù)器端調(diào)度程序格式化程序透明代理信道格式化程序真實代理遠程對象.NET2.0以后支持的“信道”有三種:TCP、IPC和HTTP。TCP與HTTP的區(qū)別(1)TCP是全雙工的通信信道;而HTTP本質(zhì)上是單工通信,客戶端發(fā)送請求,服務(wù)器回送響應(yīng)。(2)TCP的載荷是二進制數(shù)據(jù),HTTP的載荷是可打印文本字符。29對象封送方式一個對象(實質(zhì)上是對象實例),怎樣從通信一端跑到另一端?MBR:引用封送當(dāng)服務(wù)器端把MBR對象傳給客戶端時,客戶端所得到的只是對服務(wù)器端對象的一個引用,而對象實體仍在服務(wù)器端這意味著:客戶端對MBR對象任何方法/屬性的訪問,都會通過代理傳遞到服務(wù)器端執(zhí)行,而非本地執(zhí)行“通信對象”必須是MBR,否則無法完成我們期望的功能30MBR對象傳遞示意圖客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.SetData(stringstr);MBRObjmbr=obj.GetObj();MyObject對象實例看起來似乎創(chuàng)建了一個本地對象實例,實際上這個實例是在服務(wù)器端創(chuàng)建,而非本地??雌饋硭坪跽{(diào)用了本地對象的一個函數(shù),實際上此函數(shù)是在服務(wù)器端執(zhí)行的,參數(shù)通過信道傳遞了過去stringstrMBRObj對象實例對象引用看起來似乎從服務(wù)器獲得了一個MBRObj類型的對象實例,其實獲得的只是這個實例的引用,實例實體只有一份,在服務(wù)器上??蛻舳藢Α癿br”變量任何方法的調(diào)用,都跟上述的obj一樣,將參數(shù)通過信道傳遞到服務(wù)器上去,方法代碼在服務(wù)器上執(zhí)行。31對象封送方式(續(xù))MBV:值封送當(dāng)服務(wù)器端把MBV對象傳給客戶端時,客戶端所得到的是服務(wù)器端對象的一個完整副本這意味著:客戶端對所獲得的MBV對象任何方法/屬性的訪問,都是本地調(diào)用,不會影響到服務(wù)器上的對象使用“通信對象”的方法進行通信時,可使用MBV對象作為形參或返回值32MBV對象傳遞示意圖客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();MBVObjmbv=obj.GetObj();MyObject對象實例MBVObj對象實例MBVObj對象實例服務(wù)器上生成一個實例,并拷貝一份,通過信道傳遞給客戶端。“mbv”已經(jīng)是本地變量,客戶端對“mbv”變量任何方法的調(diào)用,都是在本地執(zhí)行,對服務(wù)器沒有影響。33對象封送方式(續(xù))什么樣的對象是MBR對象?派生自MarshalByRefObject的對象什么樣的對象是MBV對象?不派生自MarshalByRefObject,且可序列化的對象什么樣的對象可序列化?具有[Serizable]特性的對象,都是可序列化的,例如:[Serizable]publicclassMyObject{……}34MBR激活類型MBR對象的實體保存在服務(wù)器端那么這個對象什么時候?qū)嵗??先想一下本地對象是怎么實例化的?dāng)程序使用new關(guān)鍵字,或Activator.GetObject動態(tài)生成時,對象實例化MBR對象實例化的兩個思路:客戶端使用new關(guān)鍵字時,通過代理傳遞消息到服務(wù)器,對象實例化當(dāng)對象真正被用到時(例如:首次調(diào)用其方法或?qū)傩詴r),根據(jù)客戶端的消息,服務(wù)器端進行實例化如果選擇前者,則稱此MBR對象是“知名對象(WKO)”;選擇后者,則叫“客戶端激活對象(CAO)”35WKO激活示意圖客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();MyObject對象實例客戶端用new關(guān)鍵字時,服務(wù)器端并未實例化客戶端嘗試調(diào)用此實例的一個方法時,服務(wù)器端才對其實例化36CAO激活示意圖客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();MyObject對象實例客戶端用new關(guān)鍵字時,服務(wù)器端立即實例化37MBR激活類型(續(xù))WKO與CAO的區(qū)別CAO可以使用帶參數(shù)的構(gòu)造函數(shù)WKO必須使用無參數(shù)的構(gòu)造函數(shù)為什么?38WKO類型狀態(tài)配置MBR對象是在服務(wù)器端實例化的當(dāng)不同的客戶端使用同一個服務(wù)器上的MBR對象時,是實例化一次還是多次?也就是說:多個客戶端訪問服務(wù)器上MBR對象時,他們訪問的是同一個實例,還是各自不同的實例?SingleTon和SingleCallSingleTon:只有一個實例SingleCall:對應(yīng)于每個客戶端,分別生成不同的實例39Singleton示意圖(WKO)客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();MyObject對象實例客戶端調(diào)用遠程WKO對象方法時,服務(wù)器端實例化客戶端2信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();另一個客戶端調(diào)用此遠程WKO對象方法時,如果服務(wù)器端先前已經(jīng)實例化,則仍使用該實例,而不生成新的實例40SingleCall示意圖(WKO)客戶端服務(wù)器端信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();MyObject對象實例客戶端調(diào)用遠程WKO對象方法時,服務(wù)器端實例化客戶端2信道//MyObject是遠程對象類型MyObjectobj=newMyObject();obj.xxxx();另一個客戶端調(diào)用此遠程WKO對象方法時,又生成一個新的實例。MyObject對象實例241WKO-SingleCall與CAO的區(qū)別WKO-SingleCall在首次被調(diào)用時實例化,CAO在客戶端實例化時實例化WKO-SingleCall只能使用無參的構(gòu)造,CAO可以使用有參構(gòu)造WKO-SingleCall針對每個客戶端,只有一個實例(一對一);而CAO在客戶端可以構(gòu)造多個實例WKO-SingleCall是無狀態(tài)保持的,當(dāng)其方法被調(diào)用后,立即進入垃圾收集;CAO則有狀態(tài)保持42遠程對象的生存期管理遠程對象什么時候應(yīng)該被垃圾回收?MBV對象對于服務(wù)器、客戶端來說,MBV都是本地對象,因此不再被使用時即可垃圾回收MBR對象對象實體在服務(wù)器上,而非客戶端本地什么時候才能確定它“不再被使用”?43MBR對象的生存期管理WKO-SingleCall無狀態(tài)保持的,當(dāng)其方法被調(diào)用后,立即進入垃圾收集WKO-SingleTon所有客戶端都使用同一個實例服務(wù)器端無法確認(rèn)什么時候它才“不再被使用”CAO有狀態(tài)保持,因遠程使用,也無法判斷什么時候不再被使用(為什么?)對于WKO-SingleTon和CAO對象實例,服務(wù)器端采用“租約”的方式,確定何時進入垃圾回收44租約管理對于WKO-SingleTon和CAO,使用租約的方式管理對象實例的垃圾收集實例化時,給定一個生存期,例如40分鐘;每次其方法被調(diào)用時,生存期時間復(fù)位,即恢復(fù)到40分鐘;當(dāng)上一次調(diào)用后,生存期倒計時;如果到0仍無后續(xù)調(diào)用,則垃圾收集。再來調(diào)用怎么辦?重新生成一個實例。45內(nèi)容提要通信模型概述套接字通信編程面向?qū)ο蟮耐ㄐ?NETRemoting基本原理.NETRemoting通信編程46.NETRemoting編程.NETRemoting編程的步驟:客戶端/服務(wù)器端注冊一個或多個信道;客戶端/服務(wù)器端注冊一個或多個通信對象,即服務(wù)器上可被遠程訪問的MBR對象;客戶端實例化并使用此對象(實質(zhì)上是通過代理遠程調(diào)用)47第一步:注冊信道//服務(wù)器端staticvoidMain(string[]args){
//注冊一個信道
ChannelServices.RegisterChannel(new
IpcChannel("localhost:9090"),false);}//客戶端staticvoidMain(string[]args){ChannelServices.RegisterChannel(newIpcChannel(),false);}服務(wù)器端注冊一個IPC信道。也可以注冊成TCP/HTTP信道。注冊信道時需要指明服務(wù)地址和端口客戶端也注冊一個IPC信道。由于客戶端用于訪問服務(wù)器端,所以自身的地址和端口無需指明48第二步:注冊通信對象//服務(wù)器端staticvoidMain(string[]args){
//注冊一個信道
ChannelServices.RegisterChannel(new
IpcChannel("localhost:9090"),false);//注冊通信對象RemotingObjectRemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingObject),"rmObj",WellKnownObjectMode.Singleton);}這里將其注冊成了WKO,SingleTon。也可以注冊成CAO的。當(dāng)客戶端不使用new進行實例化時,不必在客戶端執(zhí)行注冊有關(guān)RemotingObject類型的定義,詳見示例代碼49第三步:客戶端實例化并使用對象//客戶端staticvoidMain(string[]args){ChannelServices.RegisterChannel(newIpcChannel(),false);IRemotingObjectrmObj=Activator.GetObject(typeof(IRemotingObject),"ipc://localhost:9090/rmObj")asIRemotingObject;Console.WriteLine(rmObj.GetContextInfo());MBRObjectmbrObj=rmObj.GetMBRObj();Console.WriteLine(mbrObj.GetContextInfo());}有關(guān)IRemotingObject、MBRObject類型的定義,詳見示例代碼字符串所指示的,就是在服務(wù)器端注冊的信道地址和服務(wù)名稱50.NETRemoting的一些關(guān)鍵類ChannelServices負(fù)責(zé)注冊信道、查找信道信息等RemotingConfiguration負(fù)責(zé)注冊通信對象,及判斷是否遠程對象等MarshalByRefObjectMBR對象基類給出租約訪問接口(ILease)51ChannelServicesChannelServices.RegisterChannel方法注冊一個信道ChannelServices.RegisteredChannels屬性獲得所有已注冊信道的列表ChannelServices.GetChannel方法根據(jù)信道的名字,獲取一個信道用什么表示“信道”?實現(xiàn)了IChannel和其它相關(guān)接口的類型,如TcpChannel/IpcChannel等52RemotingConfigurationRemotingConfiguration.RegisterWellKnownServiceType方法在服務(wù)器端注冊一個WKO對象RemotingConfiguration.RegisterWellKnownClientType方法在客戶端注冊一個WKO對象客戶端也可以不執(zhí)行這項注冊,而直接用Activator.GetObject實例化(如示例代碼);但注冊后可以使用new關(guān)鍵字實例化53RemotingConfiguration(續(xù))RemotingConfiguration.RegisterActivatedServiceType方法在服務(wù)器端注冊一個CAO對象RemotingConfiguration.RegisterActivatedClientType方法在客戶端注冊一個CAO對象54RemotingConfiguration(續(xù))以下函數(shù)用于獲取已注冊的服務(wù)器端或客戶端類型RemotingConfiguration.GetRegisteredActivatedClientTypes
RemotingConfiguration.GetRegisteredActivatedServiceTypesRemotingConfiguration.GetRegisteredWellKnownClientTypesRemotingConfiguration.GetRegisteredWellKnownServiceTypes以下函數(shù)用于判斷一個類型的遠程屬性RemotingConfiguration.IsActivationAllowedRemotingConfiguration.IsRemotelyActivatedClientTypeRemotingConfiguration.IsWellKnownClientType55MarshalByRefObject以下兩個方法用于WKO-SingleCall和CAO對象的租約管理MarshalByRefObject.GetLifeServiceMarshalByRefObject.InitializeLifeService有關(guān)租約管理的細(xì)節(jié)知識,請自行學(xué)習(xí)56.NETRemoting服務(wù)器端的宿主前述示例中,都是以一個控制臺進程作為宿主的。當(dāng)此進程退出,服務(wù)器自然關(guān)閉實際應(yīng)用中,理想的宿主是Windows服務(wù)程序這些程序不依賴用戶登錄,開機后即運行如果使用HTTP信道,則IIS也可以作為宿主此時,服務(wù)器的配置應(yīng)寫在Web.config文件里當(dāng)使用IIS作為宿主時,呈現(xiàn)出非常類似WebServices的特征57使用配置文件配置.NETRemoting前述示例,以編程(硬編碼)方式定義信道屬性、參數(shù)以及通信類型這樣做的不足在于:一旦需要調(diào)整這些參數(shù),則必須修改源碼重新編譯可以將信道和通信對象配置在配置文件中如果需要修改這些參數(shù),則修改配置文件即可58使用配置文件配置.NETRemoting服務(wù)器的示例(服務(wù)器端)<?xmlversion="1.0"encoding="utf-8"?><configuration><system.runtime.remoting><application><service>
<wellknownmode="Singleton"type="CSharpDemo.RemotingDemo.RemotingObject,RemotingServer"objectUri="rmObj"></wellknown></service><channels>
<channelref="ipc"portName="localhost:9090"></channel></channels></application></system.runtime.remoting></configuration>//服務(wù)器端staticvoidMain(st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小動物流行病知識競賽考試題庫300題(含答案)
- 2025年新型電力系統(tǒng)(配電自動化)職業(yè)技能競賽參考試題庫(含答案)
- 2025年安徽省職教高考《語文》核心考點必刷必練試題庫(含答案)
- 2025年桂林山水職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年昆明幼兒師范高等??茖W(xué)校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年新疆建設(shè)職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 中班冬季主題活動策劃方案五篇
- 全新合同式環(huán)保管家服務(wù)下載
- 食品銷售代理合同范本
- 商品房買賣合同預(yù)售
- 蘇教版四年級數(shù)學(xué)下冊第三單元第二課時《常見的數(shù)量關(guān)系》課件
- 浙江省臺州市2021-2022學(xué)年高一上學(xué)期期末質(zhì)量評估政治試題 含解析
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024年浙江省中考科學(xué)試卷
- 初三科目綜合模擬卷
- 2024年全國高考新課標(biāo)卷物理真題(含答案)
- 勞動合同薪酬與績效約定書
- 足療店營銷策劃方案
- 學(xué)校安全一崗雙責(zé)
- 交通工程公司乳化瀝青儲油罐拆除工程安全協(xié)議書
- YS/T 441.1-2014有色金屬平衡管理規(guī)范第1部分:銅選礦冶煉
評論
0/150
提交評論