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

原创 2007年10月12日 10:46:00

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

进程间的通讯——IPC通道

内部进程通讯,是指在同一台计算机当中的不同进程之间进行通讯。 对于两个进程之间的通讯方式有很多种,比如文件共享,Socket通讯,管道等,这里主要讲的是通过IPC Channel的方式 主要用到的命名...
  • nizihabi
  • nizihabi
  • 2015年07月28日 14:06
  • 1877

IPCChannel C#

  • 2011年03月10日 10:23
  • 13KB
  • 下载

利用IPC通道进行进程间通信(C#)

  有一个解决方案,其中包括一个Windows服务和一个Windows应用程序,两者之间需要进行通信。查了下,可以使用多种方法,如Web service(适用于不同系统及跨平台情况)、.NET Rem...
  • mmpire
  • mmpire
  • 2008年05月07日 11:48
  • 8199

IPC之 - C#用 IPC通道 进程间通信

有一个解决方案,其中包括一个Windows服务和一个Windows应用程序,两者之间需要进行通信。查了下,可以使用多种方法,如Web service(适用于不同系统及跨平台情况)、.NET Remot...
  • zjfei
  • zjfei
  • 2010年03月01日 22:21
  • 3076

IPC之 - 使用微软消息队列实现C#进程间通信

 微软消息队列(MSMQ)是一种给队列发送消息以便稍后进行处理的方法。消息由一个“Producer”(生产者)应用程序发送出去,再由一个“Consumer”(消费者)应用程序返回。 这两个应用程序可以...
  • zjfei
  • zjfei
  • 2010年02月25日 17:38
  • 1044

进程间的通讯——IPC通道

内部进程通讯,是指在同一台计算机当中的不同进程之间进行通讯。 对于两个进程之间的通讯方式有很多种,比如文件共享,Socket通讯,管道等,这里主要讲的是通过IPC Channel的方式 主要用到的命名...
  • nizihabi
  • nizihabi
  • 2015年07月28日 14:06
  • 1877

.Net中Remoting通信机制

Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可...
  • CoderJYF
  • CoderJYF
  • 2016年12月06日 17:25
  • 1411

.NET Remoting 最简单示例

学习技术知识一个好的方法是先动手,再深入, 给出一个最简单的Remoting程序示例(C#)如下: Step1:创建类库(DLL)工程RemotingObjects,类Person代码如下: us...
  • kissqw
  • kissqw
  • 2014年01月21日 15:29
  • 20234

IPC机制之三:IPC方式(Bundle、文件共享、Messenger)

1.跨进程通信的方式1.通过Intent中附加extras来传递信息。 2.通过共享文件的方式来共享数据。 3.通过Binder方式来跨进程通信。 4.ContentProvider本身就是支持...
  • huivs12
  • huivs12
  • 2015年10月22日 14:07
  • 1182

.Net Remoting服务端与客户端调用示例

.Net Remoting的使用场景,我们常用的就是使用接口分离程序集的方式,这个小示例就是采用这种方式。 公共程序接口IDemoClass: public interface IDemoCla...
  • qq_18145031
  • qq_18145031
  • 2016年10月15日 19:52
  • 918
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让.NET Remoting更快些-IPCChannel的实现
举报原因:
原因补充:

(最多只允许输入30个字)