WCF分布式开发必备知识(2):.Net Remoting
(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}
对象分别定义了3种方法,目的是为了测试3种不同的通道方式的效果. //简单的例子,实现加法功能的方法AddForTcpTest,这个远程对象可以实现封装业务逻辑或者数据访问等操作。实现减法功能的方法MinusForHttpTest,测试HTTP通道。实现乘法功能的方法MultipleForIpcTest,测试Ipc通道.
///创建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}
客户端分别通过3种方式调用远程对象,进行运算.测试成功!
WCF分布式开发必备知识(2):.Net Remoting相关推荐
- WCF分布式开发必备知识(4):Web Service(转)
今天继续我们的WCF分布式开发必备知识系列文章的第4节:Web Service.前3节我们分别介绍了MSMQ消息队列/.Net Remoting/Enterprise Services三个相关的技术. ...
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都 ...
- WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
WCF分布式开发学习,应该从哪里开始? 微软WCF Web服务 Web API学习群 339444457 微软ASP.NET MVC 4 Web编程群 44206115 学习WCF是不是就不需 ...
- [zz]WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
WCF分布式开发学习,应该从哪里开始? 学习WCF是不是就不需要学习Enterprise Sevices(COM+).Net Remoting.Web Service(ASMX).WSE3.0和 ...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...
- WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle).本节内容作为WCF分布式开发的一个重要知识点,无论在学习还是项目中都应 ...
- 移动web开发(一)——移动web开发必备知识
参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html
- WCF分布式开发步步为赢系列
众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的 出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都 ...
- 移动端webapp开发必备知识
转载自:移动终端开发必备知识 转载自:移动端webapp开发必备知识 请尊重版权,转载请注明来源,多谢~~ 移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动 ...
最新文章
- 【Qt】Qt再学习(十四):QGraphicsView
- java基础面试题:抽象类中是否可以有静态的main方法?
- 节后开工,请把这9句话写在你的办公桌上!
- Servlet的初始化参数
- 吃完晚饭干什么的好方法
- ubuntu pip更新_Cubietruck开发板折腾002:安装Python管理工具pip
- 关于Notes更改internet密码所需的缓存时间
- Linux内核中流量控制(4)
- Linux(Ubuntu18.04)安装SEAL-python
- mysql drop 几十g的表_MySQL Drop 大表的解决方案
- 《深入学习VMware vSphere 6》——1.5 主流服务器的RAID配置
- 《JavaScript高级程序设计》Chapter 10 DOM
- 运动目标跟踪(十二)--KCF跟踪及CSK,CN对比
- Using mysqldump for Backups(备份还原数据库实例及参数详细说明)
- python标准库——math模块
- Scala二十四点游戏
- 人工智能3.0展望---一种让AI产生自我意识的方法
- 倍思途享伸缩车载充电器体验:乐享车载快充,让爱车少些凌乱
- Rounding necessary
- Java集合(一)Java集合及其关系
热门文章
- oshi.systeminfo 获取cpu的数量_CPU 的基础知识
- 工具坐标6点法_轻松学机器人系列之各坐标系关系
- 基于朴素贝叶斯的垃圾邮件分类-着重理解拉普拉斯变换
- 网络爬虫(urllib超详细使用指南)
- PostgreSQL(三)pgpool管理PostgreSQL集群下主机宕机后的主从切换
- 百练OJ:2964:日历问题
- 信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2
- Java基础 集合(Collection)结构详解 Collection和Collections的区别
- mappingResources、mappingLocations、mappingDirectoryLocations、mappingJarLocations配置映射文件时的区别
- 《系统集成项目管理工程师》必背100个知识点-99云计算