IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息。在同一计算机上的应用程序域之间进行通信时,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本机应用之间通信。所以,在客户端和服务端在同一台机器时,我们可以通过注册IPCChannel来提高Remoting的性能。但如果客户端和服务端不在同一台机器时,我们不能注册IPCChannel。
下面让我们来看看如何使用IPCChannel:
首先我们定义一个RemotingObject类:
using
System;
// 远程对象
public class RemoteObject : MarshalByRefObject
{
private int callCount = 0 ;
public int GetCount()
{
Console.WriteLine( " GetCount has been called. " );
callCount ++ ;
return (callCount);
}
}
// 远程对象
public class RemoteObject : MarshalByRefObject
{
private int callCount = 0 ;
public int GetCount()
{
Console.WriteLine( " GetCount has been called. " );
callCount ++ ;
return (callCount);
}
}
接下来我们编写服务端代码:
using
System;
using System.Runtime.Remoting.Channels.Ipc;
using System.Security.Permissions;
public class Server
{
[SecurityPermission(SecurityAction.Demand)]
public static void Main( string [] args)
{
// 创建一个IPC信道
IpcChannel serverChannel = new IpcChannel( " TestChannel " );
// 注册这个IPC信道.
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(serverChannel);
// 打印这个信道的名称.
Console.WriteLine( " The name of the channel is {0}. " ,
serverChannel.ChannelName);
// 打印这个信道的优先级.
Console.WriteLine( " The priority of the channel is {0}. " ,
serverChannel.ChannelPriority);
// 打印这个信道的URI数组.
System.Runtime.Remoting.Channels.ChannelDataStore channelData = (System.Runtime.Remoting.Channels.ChannelDataStore) serverChannel.ChannelData;
foreach ( string uri in channelData.ChannelUris)
{
Console.WriteLine( " The channel URI is {0}. " , uri);
}
// 向信道暴露一个远程对象.
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType( typeof (RemoteObject), " RemoteObject.rem " , System.Runtime.Remoting.WellKnownObjectMode.Singleton);
Console.WriteLine( " Press ENTER to exit the server. " );
Console.ReadLine();
Console.WriteLine( " The server is exiting. " );
}
}
using System.Runtime.Remoting.Channels.Ipc;
using System.Security.Permissions;
public class Server
{
[SecurityPermission(SecurityAction.Demand)]
public static void Main( string [] args)
{
// 创建一个IPC信道
IpcChannel serverChannel = new IpcChannel( " TestChannel " );
// 注册这个IPC信道.
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(serverChannel);
// 打印这个信道的名称.
Console.WriteLine( " The name of the channel is {0}. " ,
serverChannel.ChannelName);
// 打印这个信道的优先级.
Console.WriteLine( " The priority of the channel is {0}. " ,
serverChannel.ChannelPriority);
// 打印这个信道的URI数组.
System.Runtime.Remoting.Channels.ChannelDataStore channelData = (System.Runtime.Remoting.Channels.ChannelDataStore) serverChannel.ChannelData;
foreach ( string uri in channelData.ChannelUris)
{
Console.WriteLine( " The channel URI is {0}. " , uri);
}
// 向信道暴露一个远程对象.
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType( typeof (RemoteObject), " RemoteObject.rem " , System.Runtime.Remoting.WellKnownObjectMode.Singleton);
Console.WriteLine( " Press ENTER to exit the server. " );
Console.ReadLine();
Console.WriteLine( " The server is exiting. " );
}
}
客户端代码:
using
System;
using System.Runtime.Remoting.Channels.Ipc;
using System.Security.Permissions;
public class Client
{
[SecurityPermission(SecurityAction.Demand)]
public static void Main( string [] args)
{
// 创建一个IPC信道。
IpcChannel channel = new IpcChannel();
// 注册这个信道。
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(channel);
// 注册一个远程对象的客户端代理.
System.Runtime.Remoting.WellKnownClientTypeEntry remoteType = new System.Runtime.Remoting.WellKnownClientTypeEntry( typeof (RemoteObject), " ipc://TestChannel/RemoteObject.rem " );
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(remoteType);
RemoteObject service = new RemoteObject();
Console.WriteLine( " The client is invoking the remote object. " );
Console.WriteLine( " The remote object has been called {0} times. " ,
service.GetCount());
}
}
using System.Runtime.Remoting.Channels.Ipc;
using System.Security.Permissions;
public class Client
{
[SecurityPermission(SecurityAction.Demand)]
public static void Main( string [] args)
{
// 创建一个IPC信道。
IpcChannel channel = new IpcChannel();
// 注册这个信道。
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(channel);
// 注册一个远程对象的客户端代理.
System.Runtime.Remoting.WellKnownClientTypeEntry remoteType = new System.Runtime.Remoting.WellKnownClientTypeEntry( typeof (RemoteObject), " ipc://TestChannel/RemoteObject.rem " );
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(remoteType);
RemoteObject service = new RemoteObject();
Console.WriteLine( " The client is invoking the remote object. " );
Console.WriteLine( " The remote object has been called {0} times. " ,
service.GetCount());
}
}
主要代码就算完成了。但,还有一个问题,那就是如果服务端和客户端在不同的Windows帐户运行的时候,会有验证权限的问题。对于这个问题,我们只要把服务端的信道注册代码改一下就好了:
Hashtable ht
=
new
Hashtable();
ht[ " portName " ] = " TestChannel " ;
ht[ " name " ] = " ipc " ;
ht[ " authorizedGroup " ] = " Everyone " ;
serverChannel = new IpcChannel(ht, null , provider);
ht[ " portName " ] = " TestChannel " ;
ht[ " name " ] = " ipc " ;
ht[ " authorizedGroup " ] = " Everyone " ;
serverChannel = new IpcChannel(ht, null , provider);
本文出处:http://blog.csdn.net/wzd24/archive/2007/10/12/1821382.aspx