參考wiki-IPC可以發現,實現的方式有非常多種。
而在不同的程式語言基礎下,
各家提供的實作方式也都不太一樣。
Windows C#提供了一個蠻簡易的類別可以使用,
叫做IPCChannel,
沒錯!!就是這麼的直覺= = ,
其實他是直接組合了將兩個類別,
IpcClientChannel 和 IpcServerChannel 組合在一起。
參考MSDN: IPCChannel
以下是將程式碼簡化到最簡~
做出最簡易的程式碼。
首先是必備的遠端操控物件 RemoteObject
//務必繼承MarshalByRefObject class RemoteObject : MarshalByRefObject { private int callCount = 0; //提供遠端呼叫操控使用的Method public int GetCount() { //這段程式碼會印在Server上 Console.WriteLine( "GetCount has been called." ); callCount++; //回傳結果至Client return ( callCount ); } }
接著是IPCCommunicator
public class IPCCommunicator { private const String _serverChannel = "localhost:9090"; private const String _remoteObjUri = "RemoteObject.rem"; public void Server() { CreatIPCServerBy( _serverChannel ); // Wait for the user prompt. Console.WriteLine( "Press ENTER to exit the server." ); Console.ReadLine(); Console.WriteLine( "The server is exiting." ); } private void CreatIPCServerBy(String channelName) { // 新增一個IPCChannel Instance用來裝載IPC連線的相關資訊。 // Create the server channel. IpcChannel serverChannel = new IpcChannel( channelName ); // 將該Instance註冊為Server。 // Register the server channel. ChannelServices.RegisterChannel( serverChannel ); // 必須要註冊一個用來遠端操控的物件型別,Type就是RemoteObject 。 // _remoteObjUri代表Uri的位置,加上原本Server的portName組成了Url=ipc://localhost:9090/RemoteObject.rem // 代表供外界操控連結的指定位置。 // 採用Singleton代表所有聯繫同一個Url的操作物件都是操作同一個實體。 // Expose an object for remote calls. RemotingConfiguration.RegisterWellKnownServiceType( typeof( RemoteObject ), _remoteObjUri, WellKnownObjectMode.Singleton ); } public void Client() { //取得IPC Server的操控物件 var service = GetRemoteObjBy( "ipc://" + _serverChannel + "/" + _remoteObjUri ); Console.WriteLine( "The client is invoking the remote object." ); Console.WriteLine( "The remote object has been called {0} times.", service.GetCount() ); } private RemoteObject GetRemoteObjBy( String ObjUrl ) { // 藉由Url取得已知操作物件。 // Register as client for remote object. WellKnownClientTypeEntry remoteType = new WellKnownClientTypeEntry( typeof( RemoteObject ), ObjUrl ); // 註冊該型別,使得所有Instance都能指向遠端操作的物件 RemotingConfiguration.RegisterWellKnownClientType( remoteType ); //回傳新的Instance,此時操作的就是Server上面的物件。 return new RemoteObject(); } }
以下為主程式:
class Program { static void Main( string[] args ) { var ipcCommuncator = new IPCCommunicator(); _Retry: Console.WriteLine("Plz Choice Ur Want to "); switch (Console.ReadLine()) { case "Server": ipcCommuncator.Server(); Console.WriteLine( "type any key to Stop Server" ); Console.Read(); break; case "Client": ipcCommuncator.Client(); Console.WriteLine( "type any key to Stop Client" ); Console.Read(); break; default: goto _Retry; } } }
沒有留言:
張貼留言