(2)TcpChannel。在将远程对象驻留在 操作系统服务或其他可执行文件中时,此通道使用 TCP 套接字在客户端和服务器之间发送消息。同样需要提供主机名字和端口号.不提供任何内置的安全功能。
(4)自定义通道 。自定义的传输通道可以使用任何基本的传输协议UDP\SMTP\IPX\消息排队等机制进行通信.用户可以根据需要自定义方式协议,因此.Net Remoting相对其他机制更加的灵活。不提供任何内置的安全功能。
(4)代理Proxy,客户端访问的不能直接访问远程对象,它是通过代理来访问代理上的方法.代理对象又分为透明代理和真实代理,区别是,在透明代理上,客户通过Invoke调用的是远程对象上真实代理的方法.然后把消息再传递给通道.
2{
3 //创建远程对象.继承MarshalByRefObject,可以使用在remoting应用中,支持对象的跨域边界访问
4 public class MyRemoteObject : MarshalByRefObject//访问远程对象需要通过代理
5 {
6 //简单的例子,实现加法功能的方法AddForTcpTest,这个远程对象可以实现封装业务逻辑或者数据访问等操作。
7 //
8 public int AddForTcpTest(int a, int b)
9 {
10 return a + b;
11 }
12 //实现减法功能的方法MinusForHttpTest,测试HTTP通道。
13 public int MinusForHttpTest(int a, int b)
14 {
15 return a - b;
16 }
17 //实现乘法功能的方法MultipleForIpcTest,测试Ipc通道
18 public int MultipleForIpcTest(int a, int b)
19 {
20 return a * b;
21 }
22 }
23
24}
///创建Tcp通道,使用端口10001
TcpChannel chanTcp = new TcpChannel(10001);
///创建Http通道,使用端口10002
HttpChannel chanHttp = new HttpChannel(10002);
///创建IPC通道,使用端口10003,IPC只适合同系统内进程的通信,所以不需要设置端口和主机名
IpcChannel chanIPC = new IpcChannel("FrankTestIpc");
//////////////////////////////////////注册通道//////////////////////////////////////////////////
///注册TCP通道
ChannelServices.RegisterChannel(chanTcp);
///注册HTTP通道
ChannelServices.RegisterChannel(chanHttp);
///注册IPC通道
ChannelServices.RegisterChannel(chanIPC);
////////////////////////////////////////打印通道/////////////////////////////////////////////////
// 打印TCP通道的名称.
Console.WriteLine("The name of the TCPChannel is {0}.",
chanTcp.ChannelName);
// 打印TCP通道的优先级.
Console.WriteLine("The priority of the TCPChannel is {0}.",
chanTcp.ChannelPriority);
// 打印Http通道的名称.
Console.WriteLine("The name of the HttpChannel is {0}.",
chanHttp.ChannelName);
// 打印Http通道的优先级.
Console.WriteLine("The priority of the HttpChannel is {0}.",
chanHttp.ChannelPriority);
// 打印IPC通道的名称.
Console.WriteLine("The name of the IpcChannel is {0}.",
chanIPC.ChannelName);
// 打印IPC通道的优先级.
Console.WriteLine("The priority of the IpcChannel is {0}.",
chanIPC.ChannelPriority);
///////////////////////////////////////////注册对象/////////////////////////////////////////////////
//注册对象MyRemoteObject到Net Remoting运行库
//配置远程通信基础框架.第2个参数是对象的URI,“RemoteObject.MyRemoteObject”,客户端URL一定要和这个匹配,不然会出现查找不到代理对象的异常
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.MyRemoteObject), "RemoteObject.MyRemoteObject", WellKnownObjectMode.Singleton);
//远程对象激活方式是单件激活模式,每次调用共享一个对象,SingleCall激活模式会在每次调用的时候产生一个新对象
//向信道暴露一个IPC远程对象.
//RemotingConfiguration.RegisterWellKnownService(Type(typeof(RemoteObject), "RemoteObject.rem", System.Runtime.Remoting.WellKnownObjectMode.Singleton);
///////////////////For Debug/////////////////////////////////////////////////////////////////////////
Console.WriteLine("Press any key to exit!");
System.Console.ReadLine();
2 <appSettings>
3 <add key="ServiceURLTcp" value="tcp://localhost:10001/RemoteObject.MyRemoteObject"/>
4 <add key="ServiceURLHttp" value="http://localhost:10002/RemoteObject.MyRemoteObject"/>
5 <add key="ServiceURLIpc" value="ipc://FrankTestIpc/RemoteObject.MyRemoteObject"/>
6 </appSettings>
7 <system.runtime.remoting>
8
9 </system.runtime.remoting>
10</configuration>
2namespace RemoteClient
3{
4 class MyClient//客户端
5 {
6 [STAThread]//主线程,建立客户端程序:注册通道,根据URL得到对象代理,使用代理调用远程对象
7
8 static void Main(string[] args)
9 {
10 //为远程对象创建代理
11 //代理的优势在于不仅可以跨域访问对象还可以跨进程,和系统,使用TCP通道
12 try
13 {
14 /**/////
15 RemoteObject.MyRemoteObject proxyObjectTcp = (RemoteObject.MyRemoteObject)Activator.GetObject(typeof(RemoteObject.MyRemoteObject), System.Configuration.ConfigurationSettings.AppSettings["ServiceURLTcp"]);
16 //通过代理访问对象的方法,输出结果
17 Console.WriteLine("This call object by TcpChannel,100+200 = {0}", proxyObjectTcp.AddForTcpTest(100, 200));
18
19 /**///////
20 RemoteObject.MyRemoteObject proxyObjectHttp = (RemoteObject.MyRemoteObject)Activator.GetObject(typeof(RemoteObject.MyRemoteObject), System.Configuration.ConfigurationSettings.AppSettings["ServiceURLHttp"]);
21 //通过代理访问对象的方法,输出结果
22 Console.WriteLine("This call object by HttpChannel,100-200 = {0}", proxyObjectHttp.MinusForHttpTest(100, 200));
23
24 /**///// 注册一个远程对象的客户端代理.
25 //System.Runtime.Remoting.WellKnownClientTypeEntry remoteType = new System.Runtime.Remoting.WellKnownClientTypeEntry(typeof(RemoteObject.MyRemoteObject), "ipc://FrankTestIpc/RemoteObject.MyRemoteObject");
26 //System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(remoteType);//如果需要客户端和住进程通讯,要在客户端注册代理,方式和服务器端注册注册远程对象的代理相同
27
28 RemoteObject.MyRemoteObject proxyObjectIpc = (RemoteObject.MyRemoteObject)Activator.GetObject(typeof(RemoteObject.MyRemoteObject), System.Configuration.ConfigurationSettings.AppSettings["ServiceURLIpc"]);
29 //通过代理访问对象的方法,输出结果
30 Console.WriteLine("This call object by IpcChannel,100*200 = {0}", proxyObjectIpc.MultipleForIpcTest(100, 200));
31 }
32 catch (Exception e)
33 {
34 throw e;
35 }
36 finally
37 {
38
39 }
40 //For Debug
41 Console.WriteLine("Press any key to exit!");
42 Console.ReadLine();
43 }
44
45 }
46}