全部評論(1條)
-
- 123就啊731 2016-08-06 07:28:05
- 內(nèi)部進(jìn)程間通信(IPC)指運(yùn)行在同一臺計算機(jī)中的不同進(jìn)程之間進(jìn)行通信。由于IPC的調(diào)用無需通過網(wǎng)絡(luò),相對于網(wǎng)絡(luò)通信來說它更可靠也更高速。有很多種不同類型的IPC調(diào)用,但是在windows系統(tǒng)中大部分IPC調(diào)用都通過命名管道來實現(xiàn)。 在.NET中,F(xiàn)CL(框架類庫)并不直接支持命名管道。假如開發(fā)人員需要在現(xiàn)存系統(tǒng)中使用命名管道來通信,可以進(jìn)入到COM層再寫一個包裝類來訪問命名管道。但是如果與別的進(jìn)程進(jìn)行通信的進(jìn)程是在.NET 框架2.0的基礎(chǔ)上創(chuàng)建的話,我們可以采用IPC通道來進(jìn)行通信。 IPC通道是建立在Windows IPC 系統(tǒng)上層的遠(yuǎn)程通道。假如你熟悉編寫遠(yuǎn)程通信應(yīng)用程序的話,新的IPC通道對于你來說就很容易了。IPC通道和其他遠(yuǎn)程通道(如:HTTP和TCP通道)都非常相似,只是在有些功能函數(shù)上有差異。Z顯著的差異在于IPC通道只有當(dāng)通信雙方的進(jìn)程都在同一機(jī)器內(nèi)才起作用,這確實存在局限性但優(yōu)勢是更可靠和有更高速的性能。 如何使用新的IPC通道 要使用新的IPC通道,你先得看看你的體系結(jié)構(gòu)是否能保證通信成功。這個結(jié)構(gòu)至少應(yīng)該有以下層次/配件: ◆共享對象?指IPC服務(wù)端和IPC客戶端都能訪問到的對象。這個對象應(yīng)該是一個獨(dú)立的工程或者配件,并且不應(yīng)該只有客戶端或服務(wù)端一方才能引用。在例子中,這一層由SharedObject工程來實現(xiàn)。 ◆IPC客戶端?這一層/配件用來調(diào)用服務(wù)端提供的服務(wù)和功能。IPC客戶端需要能訪問到共享對象。在例子中,這一層由Client工程來實現(xiàn)。 ◆IPC服務(wù)端?這一層/配件用來建立IPC服務(wù)通道,并提供客戶端程序可以使用的功能。在例子中,這一層由Server工程來實現(xiàn)。 同樣,你應(yīng)該確保你的客戶端和服務(wù)端工程都能引用System.Runtime.Remoting, 包括里面的channels類,用以下代碼實現(xiàn)這些引用: using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; 共享對象層 在例子中,SharedObjects工程包含二個對象:ServerData和ServerMethods。其中ServerData用于存儲目前Server的信息,它不需要在客戶端和服務(wù)端來回列集(marshaled)和反列集(unmarshaled)處理。ServerMethods這個對象我們應(yīng)該著重關(guān)注,因為它是一個被列集處理(marshaled)過的對象。ServerMethods對象的代碼如下列表A。 列表A: public class ServerMethods : MarshalByRefObject { public string Status { get { return ServerData.Status; } } public DateTime StartTime { get { return ServerData.StartTime; } } public string IsProcessing { get { return ServerData.IsProcessing; } } } 我們可以注意到這個類是由MarshalByRefObject類繼承來的,從而ServerMethods類能突破應(yīng)用程序的界線。如果不繼承這個類的話,ServerMethods對象就不能跨域,那它就只能簡單的在被調(diào)用的域內(nèi)實例化了。點(diǎn)擊這里可看到更多的有關(guān)MarshalByRefObject的信息。 服務(wù)端層 在例子中,服務(wù)端層是由Server工程來實現(xiàn)。里面有一個windows窗體,它用來創(chuàng)建要加載的通道。內(nèi)部的From1_Load事件的代碼如下列表B。 列表B: //Instantiate our server channel. channel = newIpcServerChannel("ServerChannel"); //Register the server channel. ChannelServices.RegisterChannel(channel, true); //Register this service type. RemotingConfiguration.RegisterWellKnownServiceType( typeof(ServerMethods), "ServerMethods", WellKnownObjectMode.Singleton); //Set the server's status to Good. ServerData.Status = "Good"; //Set the server's start time to now. ServerData.StartTime = DateTime.Now; 這段代碼實例化一個IpcServerChannel類并命名為“ServerChannel”,再用ChannelService類來注冊通道和注冊服務(wù),接著設(shè)置ServerData類的一些屬性。 RegisterWellKnownServiceType調(diào)用非常重要,因為它告訴遠(yuǎn)端庫它所能提供的對象和這些對象的URI。在上面代碼的調(diào)用中,我們提供了一個ServerMethods對象。這個對象完整的URI近似于下面的地址,實際上這也是客戶端用來連接服務(wù)端的URI: ipc://ServerChannel/ServerMethods URI的格式是:ipc://[channel_name]/[method_name]. “ServerChannel”的通道名用以下代碼來定義: //Instantiate our server channel.channel = newIpcServerChannel("ServerChannel"); #p# 客戶端層 在例子中,客戶端層是由Client工程來實現(xiàn)的,近似于Server工程,你能在客戶端工程中找到一個獨(dú)立的windows窗體,創(chuàng)建客戶端通道并為IPC注冊了一些類型。內(nèi)部的Form1_Load事件的代碼如下列表C。 列表C: //Create an IPC client channel. IpcClientChannel channel = newIpcClientChannel(); //Register the channel with ChannelServices. ChannelServices.RegisterChannel(channel, true); //Register the client type. RemotingConfiguration.RegisterWellKnownClientType( typeof(ServerMethods), "ipc://ServerChannel/ServerMethods"); //Instantiate a new ServerMethods object. This is // being instantiated in the current AppDomain, but // since the ServerMethods object inherits from // MarshalByRefObject, a proxy is created and calls // on the ServerMethods object are passed to the // server. server = newServerMethods(); 這段客戶端的代碼非常類似于服務(wù)端,除了客戶端實例化IpcClientChannel而服務(wù)端實例化IpcServerChannel以外,還有就是用客戶端用RegisterWellKnownClientType替代服務(wù)端里的RegisterWellKnownServiceType。 RegisterWellKnownClientType的作用就是告訴遠(yuǎn)端基礎(chǔ)設(shè)施客戶端想要遠(yuǎn)程訪問的類型(類)和通過什么URI來訪問。 在我們這里的客戶端例子中,我們通過URI ipc://ServerChannel/ServerMethods來遠(yuǎn)程訪問ServerMethods類。請注意這里的URI和你在Server工程中建立的URI是一樣的。 一旦通道和類型建立后,你就可以實例化這些類,其方式和你實例化其他C#類是完全一樣的。 server = newServerMethods(); 當(dāng)以上聲明執(zhí)行后,遠(yuǎn)端基礎(chǔ)設(shè)施會連接上服務(wù)端,創(chuàng)建一個新的對象并通過遠(yuǎn)程調(diào)用這個對象作為服務(wù)端到客戶端的代理。btnCallServer_Click方法示范了這個過程,代碼如下列表D。 列表D: txtServerData.Clear(); txtServerData.Text = "Status: "+server.Status+" "; txtServerData.Text += "Start: "+server.StartTime.ToString()+" "; txtServerData.Text += "Is Processing: "+server.IsProcessing+" "; 每一個對“server”(實際上是代理)對象的調(diào)用都傳到了IPC服務(wù)端,服務(wù)端再通過“Server”對象將數(shù)據(jù)返回給客戶端。服務(wù)端可以在它的程序域中修改數(shù)據(jù),并允許客戶端從客戶端的程序域中查看它的數(shù)據(jù)。 ServerMethods.IsProcessing屬性就是一個好的例子。這個屬性的值每2秒就在IPC服務(wù)端更新一次,從“Yes”到“No”,或者反過來。因為這個值客戶端是可以訪問到的,所以即使它不能改變這個值但也能看到值的變化。 運(yùn)行例子 運(yùn)行例子,先在Visual Studio 2005中打開InterprocessCommunication solution文件,然后點(diǎn)右鍵重建方案,方案重建后,打開Client和Server的創(chuàng)建目錄。你先得雙擊“Server.exe”來執(zhí)行服務(wù)端,然后雙擊“Client.exe”執(zhí)行客戶端。 客戶端啟動后,點(diǎn)“Call Server”按鈕,你能在按鈕下得文本框里看到以下的結(jié)果: Status: Good Start: 11/16/2006 3:17:19 PM Is Processing: Yes 等大約一秒再點(diǎn)擊“Call Server”按鈕,點(diǎn)擊后一會兒你就會看見“Is Processing”狀態(tài)變?yōu)椤癗o”。你也可以點(diǎn)擊服務(wù)端程序的“Set Status to Bad”按鈕,然后再點(diǎn)擊客戶端的“Call Server”按鈕,你就可以看見“Status”變?yōu)椤癇ad”。 結(jié)束語 如你所見,IPC通道非常適用于從一個應(yīng)用程序中監(jiān)控另外一個應(yīng)用程序的情況。特別是可用于那種沒有提供用戶接口但又要提供windows服務(wù)的服務(wù)端程序。
-
贊(11)
回復(fù)(0)
熱門問答
- 如何使用IPC通道和.NET框架2.0實現(xiàn)進(jìn)程間通信
2016-08-05 11:25:56
450
1
- 如何使用IPC通道和.NET2.0實現(xiàn)進(jìn)程間通信
2013-10-16 09:27:42
337
1
- ipc的進(jìn)程間通信
2018-11-19 09:29:57
282
0
- 進(jìn)程間兩種通信方式
2018-11-24 03:58:37
297
0
- net share ipc$ /del
- 我在我的機(jī)器上這樣做 別人還能通過遠(yuǎn)程桌面來管理我的機(jī)器么?
2010-03-23 00:45:34
247
1
- 如何實現(xiàn)IPC漏洞攻擊?
2013-07-19 02:50:42
283
3
- 路由配置VLAN間通信
- 如圖,下面PC每臺都屬于不同VLAN,二層交換機(jī)上配置了多個VLAN,問題在路由器上只有單臂路由這個辦法才能讓VLAN間互通(我知道可以在二層交換機(jī)之上加個三層交換機(jī),在三層上做匯聚)... 如圖,下面PC每臺都屬于不同VLAN,二層交換機(jī)上配置了多個VLAN,問題在路由器上只有單臂路由這個辦法才能讓VLAN間互通(我知道可以在二層交換機(jī)之上加個三層交換機(jī),在三層上做匯聚) 展開
2018-07-26 02:28:58
404
1
- 兩臺PC機(jī)如何實現(xiàn)串行通信
- 越詳細(xì)越好,Z好把雙機(jī)串行通信系統(tǒng)設(shè)計的內(nèi)容也搞上來!如果好的話還有加分!是用匯編或是C編程,對PC機(jī)串行口控制進(jìn)行串行通信傳輸信息和文件。... 越詳細(xì)越好,Z好把雙機(jī)串行通信系統(tǒng)設(shè)計的內(nèi)容也搞上來!如果好的話還有加分! 是用匯編或是C編程,對PC機(jī)串行口控制進(jìn)行串行通信傳輸信息和文件。 展開
2007-07-02 21:12:06
443
2
- 電腦高手請進(jìn) net share IPC$ /delete 后..
- 系統(tǒng)提示: 發(fā)生系統(tǒng)錯誤5. 拒絕訪問. ?要怎么解決這個問題啊 共享目錄IPC$ 拒絕訪問怎樣才可以訪問啊 急 急 急 急 急
2006-05-14 13:00:53
360
2
- PLC和單片機(jī)的通信怎么實現(xiàn)
- 我用的臺達(dá)的PLC,需要和溫度巡檢儀之間通信,PLC讀取溫度,溫度巡檢儀是單片機(jī)開發(fā)的,485接口,Z好越簡單越好,我初學(xué)不懂,請教大家怎么實現(xiàn),需要程序的話,大家能給我發(fā)個嗎
2017-09-26 03:01:29
769
2
- 如何使用Junit測試使用Spring框架的代碼
2018-11-12 10:46:18
457
0
- 數(shù)據(jù)采集卡與一體化觸摸屏如何實現(xiàn)通信
2014-04-01 19:35:51
481
1
- 一臺計算機(jī)上兩個串口如何實現(xiàn)通信?
2018-03-13 13:48:56
469
1
- 一臺計算機(jī)上兩個串口如何實現(xiàn)通信
2013-04-23 05:14:16
590
3
- cmd命令里net share顯示遠(yuǎn)程IPC什么意思?
2014-04-02 12:07:06
422
1
- 流式通道間的電壓會不會相互影響
2017-07-30 14:08:07
334
1
- 如何通過a/d轉(zhuǎn)換器實現(xiàn)多通道數(shù)據(jù)采集
2018-11-15 20:59:50
330
0
- 如何實現(xiàn)DCS系統(tǒng)與變頻器間的通訊
2016-06-30 13:39:28
316
1
- 如何終止ikuacc.exe和ikucnc.exe 這兩個流氓進(jìn)程!
- ikuacc.exe和ikucnc.exe 這兩個流氓進(jìn)程總是趁我打開優(yōu)酷的時候自動啟動,非但不起加速作用,反而在我關(guān)閉優(yōu)酷之后還繼續(xù)在進(jìn)程那里運(yùn)行。我以前安裝過I酷加速,不過后來不知道怎么不見加速了,Z近才發(fā)現(xiàn)它一直躲在背后偷偷運(yùn)行,而且弄得關(guān)機(jī)都關(guān)不了,一定... ikuacc.exe和ikucnc.exe 這兩個流氓進(jìn)程總是趁我打開優(yōu)酷的時候自動啟動,非但不起加速作用,反而在我關(guān)閉優(yōu)酷之后還繼續(xù)在進(jìn)程那里運(yùn)行。我以前安裝過I酷加速,不過后來不知道怎么不見加速了,Z近才發(fā)現(xiàn)它一直躲在背后偷偷運(yùn)行,而且弄得關(guān)機(jī)都關(guān)不了,一定要手動決定立即結(jié)束任務(wù),才能關(guān)機(jī)。真是無賴的流氓進(jìn)程。 展開
2011-03-20 23:33:35
594
6
- 觸摸屏如何同時跟兩個控制器實現(xiàn)串口通信
2012-12-15 19:52:18
526
1
4月突出貢獻(xiàn)榜
推薦主頁
最新話題





參與評論
登錄后參與評論