让.NET Remoting更快些-IPCChannel的实现

让.NET Remoting更快些-IPCChannel的实现

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);
    }

}

接下来我们编写服务端代码:

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;
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);

转载于:https://www.cnblogs.com/wzd24/archive/2007/05/22/755010.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值