让.NET 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值