.net remoting(一)
一、远程对象
①RemoteHello.csproj 类库项目,程序集名称 RemoteHello ,默认命名空间 Wrox.ProCSharp.Remoting;
②派生自System.MarsshalByRefObject ;
③根据不同的代理方式,需要有不同的构造函数(注意客户端的代码会有注释);
④Hello.cs源文件中的代码如下;
namespace Wrox.ProCSharp.Remoting
{
public class Hello:MarshalByRefObject
{
public Hello()
{
Console.WriteLine("创建Hello");
}
public Hello(string name)
{
Console.WriteLine($"创建 {name}");
}
public string Greeting(string name)
{
Console.WriteLine($"Hello {name}!!!!");
return $"Hello {name}!!!!";
}
}
}
二、服务端
①tcp、http和ipc三种不同的通讯协议服务端的实现;
②每种通讯协议都支持激活知名对象和激活客户端激活的对象的服务创建方式;
③每种的通讯协议包含的两种对象创建方式同客户端的代理创建方式都是一 一 对应的,例如:服务端使用的是tcp的服务端激活方式,客户端也必须是tcp的服务端激活方式代理创建方式;
④下方代码位于服务控制台项目HelloServer中的Program.cs源文件中;
⑤注意服务项目需要依赖远程对象库;
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting.Channels.Tcp;
using Wrox.ProCSharp.Remoting; namespace HelloServer
{
class Program
{
static void Main(string[] args)
{
{// tcp
{// 服务端激活(激活知名对象)
//var tcpChannel = new TcpServerChannel(8085);
//ChannelServices.RegisterChannel(tcpChannel, false);
//RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);
} {// 激活客户端激活的对象
//var tcpChannel = new TcpServerChannel(8085);
//ChannelServices.RegisterChannel(tcpChannel, false);
//RemotingConfiguration.ApplicationName = "Hi";
//RemotingConfiguration.RegisterActivatedServiceType(typeof(Hello));
} } {// http
{// 服务端激活(激活知名对象)
//var httpChannel = new HttpServerChannel(8086);
//ChannelServices.RegisterChannel(httpChannel, false);
//RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);
} {// 激活客户端激活的对象
//var httpChannel = new HttpServerChannel(8086);
//ChannelServices.RegisterChannel(httpChannel, false);
//RemotingConfiguration.ApplicationName = "Hi";
//RemotingConfiguration.RegisterActivatedServiceType(typeof(Hello));
} }
{// ipc 只能用于客户端和服务端在同一操作系统上
{// 服务端激活(激活知名对象)
//var ipcChannel = new IpcServerChannel("myIpcPort");
//ChannelServices.RegisterChannel(ipcChannel, false);
//RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);
} {// 激活客户端激活的对象
var ipcChannel = new IpcServerChannel("myIpcPort");
ChannelServices.RegisterChannel(ipcChannel, false);
RemotingConfiguration.ApplicationName = "Hi";
RemotingConfiguration.RegisterActivatedServiceType(typeof(Hello));
} } Console.WriteLine("Press Enter to exit!");
Console.ReadLine();
}
}
}
三、客户端
①tcp、http和ipc三种不同的通讯协议客户端的实现;
②每种通讯协议都支持激活知名对象(服务端激活)和激活客户端激活的对象的客户端代理创建方式;
③每种的通讯协议包含的两种对象创建方式同客户端的代理创建方式都是一 一 对应的,例如:服务端使用的是tcp的服务端激活方式,客户端也必须是tcp的服务端激活方式代理创建方式;
④下方代码位于服务控制台项目HelloClient中的Program.cs源文件中;
⑤注意服务项目需要依赖远程对象库;
⑥请注意阅读代码的注释,对规则和特性有关键描述;
⑦每种通讯协议的客户端激活代码都实现了三种远程代理创建方式,中间空了一行间隔开,请一定注意;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using Wrox.ProCSharp.Remoting; namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
try
{
#region tcp
{// tcp
{ // 服务端激活 对象调用后消失
// 只能默认构造函数
//TcpClientChannel tcpClient = new TcpClientChannel();
//ChannelServices.RegisterChannel(tcpClient, false);
//Hello obj = (Hello)Activator.GetObject(typeof(Hello), @"tcp://10.0.6.207:8085/Hi");
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//} //Console.WriteLine(obj.Greeting("tcp1"));
}
{ // 客户端激活 对象持久
//TcpClientChannel tcpClient = new TcpClientChannel();
//ChannelServices.RegisterChannel(tcpClient, false);
//object[] attrs = { new UrlAttribute(@"tcp://10.0.6.207:8085/Hi") };
////程序集 + 类型 + url属性 默认构造方法
//ObjectHandle handle = Activator.CreateInstance("RemoteHello", "Wrox.ProCSharp.Remoting.Hello", attrs);
//if (handle == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Hello obj = handle.Unwrap() as Hello;
//Console.WriteLine(obj.Greeting("tcp1")); //TcpClientChannel tcpClient = new TcpClientChannel();
//ChannelServices.RegisterChannel(tcpClient, false);
//object[] attrs = { new UrlAttribute(@"tcp://10.0.6.207:8085/Hi") };
//// 类型 + 参数 + url属性 参数位null,默认构造函数
//Hello obj = (Hello)Activator.CreateInstance(typeof(Hello),new object[] {"周静a" }, attrs);
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("tcp2")); //TcpClientChannel tcpClient = new TcpClientChannel();
//ChannelServices.RegisterChannel(tcpClient, false);
//// 注册
//RemotingConfiguration.RegisterActivatedClientType(typeof(Hello), "tcp://10.0.6.207:8085/Hi");
//// 创建
//Hello obj = new Hello("周静");
//if (obj == null)
//{
// Console.WriteLine("注册远程代理对象失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("tcp3"));
}
}
#endregion
#region http
{// http
{ // 服务端激活 对象调用后消失
// 只能默认构造函数
//HttpClientChannel httpClient = new HttpClientChannel();
//ChannelServices.RegisterChannel(httpClient, false);
//Hello obj = (Hello)Activator.GetObject(typeof(Hello), @"http://10.0.6.207:8086/Hi");
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//} //Console.WriteLine(obj.Greeting("http1"));
}
{ // 客户端激活 对象持久
//HttpClientChannel httpClient = new HttpClientChannel();
//ChannelServices.RegisterChannel(httpClient, false);
//object[] attrs = { new UrlAttribute(@"http://10.0.6.207:8086/Hi") };
////程序集 + 类型 + url属性 默认构造方法
//ObjectHandle handle = Activator.CreateInstance("RemoteHello", "Wrox.ProCSharp.Remoting.Hello", attrs);
//if (handle == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Hello obj = handle.Unwrap() as Hello;
//Console.WriteLine(obj.Greeting("http1")); //HttpClientChannel httpClient = new HttpClientChannel();
//ChannelServices.RegisterChannel(httpClient, false);
//object[] attrs = { new UrlAttribute(@"http://10.0.6.207:8086/Hi") };
//// 类型 + 参数 + url属性 参数位null,默认构造函数
//Hello obj = (Hello)Activator.CreateInstance(typeof(Hello), new object[] { "周静a" }, attrs);
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("http2")); //HttpClientChannel httpClient = new HttpClientChannel();
//ChannelServices.RegisterChannel(httpClient, false);
//// 注册
//RemotingConfiguration.RegisterActivatedClientType(typeof(Hello), "http://10.0.6.207:8086/Hi");
//// 创建
//Hello obj = new Hello("周静");
//if (obj == null)
//{
// Console.WriteLine("注册远程代理对象失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("tcp3"));
}
}
#endregion #region ipc
{// ipc 服务端和客户端只能在同一操作系统中,不持支跨域
{ // 服务端激活 对象调用后消失
// 只能默认构造函数
//IpcClientChannel ipcClient = new IpcClientChannel();
//ChannelServices.RegisterChannel(ipcClient, false);
//Hello obj = (Hello)Activator.GetObject(typeof(Hello), @"ipc://myIpcPort/Hi");
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//} //Console.WriteLine(obj.Greeting("ipc1"));
}
{ // 客户端激活 对象持久
//IpcClientChannel ipcClient = new IpcClientChannel();
//ChannelServices.RegisterChannel(ipcClient, false);
//object[] attrs = { new UrlAttribute(@"ipc://myIpcPort/Hi") };
////程序集 + 类型 + url属性 默认构造方法
//ObjectHandle handle = Activator.CreateInstance("RemoteHello", "Wrox.ProCSharp.Remoting.Hello", attrs);
//if (handle == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Hello obj = handle.Unwrap() as Hello;
//Console.WriteLine(obj.Greeting("ipc1")); //IpcClientChannel ipcClient = new IpcClientChannel();
//ChannelServices.RegisterChannel(ipcClient, false);
//object[] attrs = { new UrlAttribute(@"ipc://myIpcPort/Hi") };
//// 类型 + 参数 + url属性 参数位null,默认构造函数
//Hello obj = (Hello)Activator.CreateInstance(typeof(Hello), new object[] { "周静a" }, attrs);
//if (obj == null)
//{
// Console.WriteLine("获取远程代理失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("ipc2")); //IpcClientChannel ipcClient = new IpcClientChannel();
//ChannelServices.RegisterChannel(ipcClient, false);
//// 注册
//RemotingConfiguration.RegisterActivatedClientType(typeof(Hello), "ipc://myIpcPort/Hi");
//// 创建
//Hello obj = new Hello("周静");
//if (obj == null)
//{
// Console.WriteLine("注册远程代理对象失败!");
// return;
//}
//Console.WriteLine(obj.Greeting("ipc3"));
}
}
#endregion }
catch (Exception ex)
{ Console.WriteLine(ex.Message);
}
Console.WriteLine("Press AnyKey to Exit");
Console.ReadKey(); }
}
}
四、其他注意事项
① 本次实现只是remoting的简单实现,对初学者学习应该能很省很多事,其他AOP等方面的深度应用请阅读相关书籍,C#高级编程系列的书籍;
② 工程项目是在win10 64操作系统上vs2019中实现验证的,如有错误和疑问,欢迎留言,谢谢!
服务端激活
.net remoting(一)的更多相关文章
- spring remoting源码分析--Hessian分析
1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...
- Visual Studio 2013 Ultimate因为CodeLens功能导致Microsoft.Alm.Shared.Remoting.RemoteContainer.dll高CPU占用率的折中解决方案
1.为什么Microsoft.Alm.Shared.Remoting.RemoteContainer.dll的CPU占用率以及内存使用率会那么高? 在Visual Studio 2013 Ultima ...
- VS2015 出现 .NETSystem.Runtime.Remoting.RemotingException: TCP 错误
错误内容: 界面显示内容为: .NET�������������System.Runtime.Remoting.RemotingException: TCP 淇¢亾鍗忚鍐茬獊: 搴斾负鎶ュご銆� 鍦 ...
- .Net中Remoting通信机制简单实例
.Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...
- .Net中Remoting通信机制
Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...
- .NET Remoting 应用实例
前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...
- Holographic Remoting
看到微软官方的 Holographic Remoting Player https://developer.microsoft.com/en-us/windows/holographic/hologr ...
- IIS部署Remoting总结
1.在IIS里新建一个网站,命名为test,路径指向 e:\test: 2.在 e:\test下创建目录bin: 3.把Remoting远程对象的Project设置为类库,编译为DLL文件,然后复制到 ...
- .NET Remoting 体系结构 之 在 ASP.NET 中驻留远程服务器
迄今为止,所有服务器示例都是运行在自驻留(self-hosted)的.NET 服务器上.自驻留的服务器必 须手动启动..NET Remoting 服务器也可以在许多其他的应用程序类型中启动.在 Win ...
- Remoting and web services using Spring[摘自官网]
spring document url: http://docs.spring.io/spring/docs/ Using Hessian First we’ll have to create a n ...
随机推荐
- 201771010113 李婷华 《面向对象程序设计(java)》第十五周总结
一.理论知识部分 JAR文件 Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行. .jar文件(Java归档)既可以包含类文件 ...
- 11_JavaScript基础入门(1)
JavaScript简介 1.JavaScript用途 前端三层: 结构层 HTML(从语义的角度描述页面的结构) 样式层 CSS(从审美的角度装饰页面) 行为层 JavaScript (从交互 ...
- Badboy录制脚本时,提示脚本错误的解决方法
如下,录制时发生错误:
- CF-292D Connected Components 并查集 好题
D. Connected Components 题意 现在有n个点,m条编号为1-m的无向边,给出k个询问,每个询问给出区间[l,r],让输出删除标号为l-r的边后还有几个连通块? 思路 去除编号为[ ...
- zabbix部署与配置
zabbix部署与配置 1.zabbix的web界面是基于php开发,所以创建lnmp环境来支持web界面的访问 yum install nginx php php-devel php-mysql p ...
- Nginx|构建简单的文件服务器(mac) 续-FastDFS安装(mac)|文件存储方案
目录 Nginx|构建简单的文件服务器(mac) 1 所需安装包 2 安装fastdfs-nginx-module-master 3 安装Nginx Nginx|构建简单的文件服务器(mac) 续上文 ...
- Springboot中修改.properties文件为.yml文件时项目不能运行问题
可能很多小伙伴会考虑环境配置的问题,maven版本.idea版本什么的,其实没有必要 只要你之前.ies时能运行,那么环境配置就没有问题 不能运行的原因,一定是你的.yml文件的格式问题 .yml文件 ...
- 对background: url("~assets/img/common/collect.svg") 0 0/14px 14px 的理解
需求:给收藏数字前面通过::before伪元素添加图标 相关代码: .goods-info .collect { position: relative; } .goods-info .collect: ...
- python迭代器,生成器
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
- MCP3421使用详解
0 摘要 因某项目需要,需要采集微弱的电压信号,且对电压精度要求较高,于是选中MCP3421这款18 bit 高精度IIC AD转换芯片.本文将结合MCP3421的手册,对该芯片的使用进行详细解释,并 ...