在.NET 直接支持的Remoting技术有IPChannel,TCPChannel,HTTPChannel。
在跨广域网的应用里,推荐使用WCF技术,基于HTTPCHANNEL,而在进程中通讯中,反而IPCChannel更见优秀,但是不能跨局域网。
IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息。在同一计算机上的应用程序域之间进行通信时,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本机应用之间通信。所以,在客户端和服务端在同一台机器时,我们可以通过注册IPCChannel来提高Remoting的性能。但如果客户端和服务端不在同一台机器时,我们不能注册IPCChannel。
简单的应用程序应该中,基于.NET应用程序作用域为基础的IPCChannel,速度非常的快,然而在WEB应用应用中,我认为TCPCHANNEL反而表现会更改好,最好试试,不可以教条。
当然还有基于WINDOWS API 的管道技术。在C#里面对应的就是IPC模式,他的底层就是管道。需要自己实现命名管道的实现。
以下是来自互联网,了解其缺陷:
http://www.cnblogs.com/mydomain/archive/2011/01/10/1931914.html
21、WINDOWS API 进程间通信,管道(PIPE)
管道是一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计采用数据流I/0的方式来访问。由一个进程读、另一个进程写,类似于一个管道两端,因此这种进程间的通信方式称作“管道”。
管道分为匿名管道和命名管道。
匿名管道只能在父子进程间进行通信,不能在网络间通信,而且数据传输是单向的,只能一端写,另一端读。
命令管道可以在任意进程间通信,通信是双向的,任意一端都可读可写,但是在同一时间只能有一端读、一端写。
一、注意点
1、常用API
Pipes[2]
在[3,4]中也对这一部分进行了介绍。
2、示例
1)服务器端
创建管道 >> 监听 >> 读写 >> 关闭
CreateNamedPipe
ConnectNamedPipe
ReadFile/WriteFile
DisconnectNamedPipe
示例代码
2)客户端
打开命令管道,获得句柄 >> 写入数据 >> 等待回复
WaitNamedPipe
SetNamedPipeHandleState
示例代码
3、I/O简介
I/O模式不仅在进程间通信时使用,任何具有数据流形式的输入输出(包括文件输入输出、内核通信、网络输入输出等)都涉及I/O模式。
异步( Asynchronous)和同步(Synchronous) I/O是两种基本的I/O模式。
同步I/O
所谓同步I/O是指在调用ReadFile、WriteFile等函数进行输入输出操作时,系统完成了输入输出ReadFile、WriteFile才返回。在操作系统进行I/O操作的过程上,用户态线程不能执行,因此在同步I/O时,如果需要在I/O时进行其他操作就只能再开启线程。
异步I/O
异步I/O是在调用ReadFile、WriteFile等函数后,函数立即返回,线程可以进行其他操作。剩下的I/O操作在系统内核中自动完成。那么在系统内核完成输入输出后,程序如何知道I/O是否已完成?
一种方法,称作完成函数(Completion Routines),如果使用ReadFileEx、WriteFileEx等进行I/O,可以指定完成函数,所谓完成函数是指内核在完成I/O后,内核会回调这个函数。当完成函数被调用时,就指明内核已经完成了I/O,程序可以在这个函数中进行一个I/O完成后需要的操作(例如释放内存)。
================================================================
可见需要封装WINDOWS API。这个某位国际上的高手封装的C#类库。
http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx
在一般的应用上,没有要求话,我建议采用IpcChannel就行了。扩展容易比较原生,可以直接升级扩展成HttpChannel,方案我认为最好。
速度比较:
ipcChanel>tcpChannel>HttpChannel
穿透能力:
HttpChannel>tcpChannel>IpcChannel。
自己权衡即可。
关于IPC信道本质上是微软针对管道的二次封装。
在.NET里面,将IPC最终使用
private const string prefix = @"\\.\pipe\";
替换修改为新的名称重新采用WIN 32进行发送。
暂时就是直到这些,以后再研究研究可能不对,需要积累。