zoukankan      html  css  js  c++  java
  • <转载>让.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);

    本文出处:http://blog.csdn.net/wzd24/archive/2007/10/12/1821382.aspx

  • 相关阅读:
    微信支付 h5
    微信支付 h5
    Android stadio butternife工具
    Android stadio butternife工具
    Android stadio 自定义debug release keystore
    Android stadio 自定义debug release keystore
    Android 微信支付步骤
    Android 微信支付步骤
    t
    t
  • 原文地址:https://www.cnblogs.com/ChangTan/p/2050447.html
Copyright © 2011-2022 走看看