NETRemoting学习笔记
1、.NET Remoting概念

1、一种分布式处理方式。从字面意义上看出,他是基于.net平台的一种远程对象开发技术,该技术是将远程计算机中的数据视为分布式对象来进行开发。
2、一种网络通信技术。既然这种技术可以操作远程计算机的数据,他当然是网络通信技术。
2、.NET Remoting使用的技术
1、Xml
2、SOAP
SOAP=简单对象传输协议。
3、序列化
-二进制
-xml
3、.NET Remoting原理
通过通道(Channel)实现网络之间通信的。
1、首先通过Remoting访问通道以获得服务端访问对象

2、再通过代理解析为客户端对象

3、然后就可以在客户端去操作这个服务端对象了

客户端要获取服务器端对象,我们只需要知道通道的类型(TcpChannel和HttpChannel)和服务器端的端口号就可以了,无需知道数据包的格式。
要注意的是,客户端在获取服务端对象时,并不是获取服务端实际的对象,而是获取了他的引用,这既保证了客户端和服务器端的有关对象的松散耦合,同时也优化了通信的性能。
4、.NET Remoting中的主要元素

4.1 远程对象
远程对象是.net remoting的核心元素,他分为两种
1、操作远程对象
2、传递远程对象
操作远程对象,就是对象运行在远程,客户端通过引用来发送操作消息。这种远程对象必须是MarshlByRefObject这个类的派生类, 这样才能将他的对象引用传递到客户端。
传递远程对象是指将远程对象复制到本地,客户端对其操作,然后把操作后的副本发送回服务器端,此类的操作对象必须标记为[Serializable]
4.2 通道(Channels)
分为 TcpChannel 和HttpChannel。
TcpChannel使用二进制格式序列化消息对象,因此他具有更高的传输性能。
HttpChannel使用SOAP格式序列化消息对象,因此他具有更好的互操作性。
4.3 激活方式
什么是激活方式?我们在操作远程对象时需要考虑一个问题:远程对象何时创建,由谁来创建,这些都取决于激活方式。
激活方式分为两种:服务器激活和客户端激活。
主要是学习服务器激活方式。
Singleton
SingleCall
5、.NET Remoting的开发步骤
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
5.1 步骤1:创建远程对象类
远程对象类必须派生自System.MarshlByRefObject。

/*
* 远程对象类必须派生自MarshalByRefObject
*/
public class RemoteClass : MarshalByRefObject
{
int num = ;
public RemoteClass()
{
Console.WriteLine("激活了RemoteClass远程对象");
}
public string Method(string name)
{
Console.WriteLine("第{0}次调用,参数为{1}", num++, name);
return "hello " + name;
}
}
5.2 步骤2:创建服务端宿主程序,用于接收客户端请求
1、注册管道
2、注册服务器激活对象方式

/*
* 需要引用System.Runtime.Remoting
*/
class Program
{
static void Main(string[] args)
{
//1、注册管道
TcpChannel tcpChannel = new TcpChannel();//端口指定
HttpChannel httpChannel = new HttpChannel();
ChannelServices.RegisterChannel(tcpChannel, true);
ChannelServices.RegisterChannel(httpChannel, false);
//2、注册服务器激活方式
//WellKnownObjectMode.Singleton表示生成的实例是单例模式
//WellKnownObjectMode.SingleCall表示每个传入消息是由新的对象实例
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteClass), "HelloTest", WellKnownObjectMode.SingleCall);
Console.WriteLine("这里是服务器端宿主程序");
Console.Read();
}
}
5.3 步骤3:创建客户端,调用远程对象
1、注册通道
2、根据URL获取对象代理
3、使用代理调用远程对象

class Program
{
static void Main(string[] args)
{
#region TCP方式
/*
//1、注册通道
TcpChannel tcpChannel = new TcpChannel();//客户端不需要指定端口号
ChannelServices.RegisterChannel(tcpChannel, true);
//2、创建代理
RemoteClass rc = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "tcp://localhost:10000/HelloTest");//1000端口号是服务器端指定的
if (rc == null)
{
Console.WriteLine("Could not locate TCP Server");
}
Console.WriteLine("TCP方式{0}", rc.Method("张飞"));
//*/
#endregion
#region Http方式
HttpChannel httpChannel = new HttpChannel();
ChannelServices.RegisterChannel(httpChannel, false);
RemoteClass object2 = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "http://localhost:10001/HelloTest");
if (object2 == null)
{
Console.WriteLine("Could not locate HTTP Server");
}
Console.WriteLine("HTTP方式{0}", object2.Method("关羽"));
#endregion
Console.Read();
}
}
5.4 调试
1、设置Server为启动项目

2、f5启动服务端

4、启动client

效果:


6、.NET Remoting的配置文件
不用代码注册,用配置文件
服务端:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true);
客户端:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true);
RemoteClass obj = new RemoteClass();
Console.WriteLine("HTTP方式{0}", obj.Method("祥子"));
NETRemoting学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- mac切图
1.按住command键位, 两只手指点击需要切的图 2.再在右边栅格化图层 3.选中需要剪切的图层.command+c 和command+n和 command+v OK 切整张图.先 option ...
- 一条简单的 SQL 执行超过 1000ms,纳尼?
阅读本文大概需要 2.8 分钟. MySQL 对我说 “Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用通过 Du ...
- Chrome调试工具Developer Tools——前端必备神器
本文链接:https://blog.csdn.net/u012542647/article/details/79401485 今天要给大家介绍一个神器,就是谷歌浏览器(Chorme)自带的前端调试工具 ...
- Spring(二十三):Spring自动注入的实现方式
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解包含:Autowrired/Resource/Qualifier/Service/Controller/Repository/C ...
- dubbo学习笔记(二)dubbo中的filter
转:https://www.cnblogs.com/cdfive2018/p/10219730.html dubbo框架提供了filter机制的扩展点(本文基于dubbo2.6.0版本). 扩展接口 ...
- 【重庆师范大学】PHP博客训练-Thinkphp
设计数据库 CREATE TABLE `user` ( `user_id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar() COM ...
- 【Linux】Linux环境变量的设置和查看
Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...
- 使用 Laravel-Swagger 编写接口文档(php)
使用 Laravel-Swagger 编写接口文档 Table of Contents Swagger 文档管理 官方网站:https://swagger.io/ 快速编写你的 RESTFUL API ...
- 阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-8 优化Swagger2显示
左侧的全是英文 忽略api 把HelloController也忽略掉 重启api的服务,刷新页面.只剩下了passport的Controller 给passport接口加上注解. 重启服务,并刷新页面 ...
- springboot+mybatisplus+druid数据库
1.添加maven依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis ...