.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 ...
随机推荐
- SecureCRT怎么将本级文件上传到CentOS
进入到想要放文件的路径,不然会默认放在当前路径下: 输入 rz -------------------------------------------------------------------- ...
- C. Barcode dp
https://codeforces.com/problemset/problem/225/C 这个题目和之前一个题目很像 https://www.cnblogs.com/EchoZQN/p/1090 ...
- Django 配置JWT认证方式
1. 安装 rest_framework + djangorestframework_simplejwt 安装djangorestframework_simplejwt :pip install dj ...
- OpenWrt(LEDE)2020.4.12编译 UnPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成
固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.12)Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件 ...
- 花了几天入门Storm,上了一版,全是Bug
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 听说过大数据的同学应该都听说过Storm吧?其实 ...
- 【HBase】表模型和基本操作介绍
目录 HBase表模型 常用Shell操作 HBase表模型 创建一个hbase表,必须要有表名和列族名 列族 -- columnFamily,就是上图中的Column Family1 userInf ...
- [hdu5253] 最小生成树,Kruskal
题意:有n*m个单位的农田,给定每个单位农田地势高低,现在需要灌溉所有农田,如果把水引入相邻的农田里需要的管道长度为两者的高度差.求最少的管道长度花费. 思路:比较明显的最小生成树问题,相邻两点之间连 ...
- SpringBatch异常To use the default BatchConfigurer the context must contain no more thanone DataSource
SpringBoot整合SpringBatch项目,已将代码开源至github,访问地址:https://github.com/cmlbeliever/SpringBatch 欢迎star or fo ...
- void 型指针的高阶用法,你掌握了吗?
[导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用.测试环境采用 IAR for ARM 8.40.1 什么是void指针 void指针 ...
- MyBatis入门知识汇总
为什么要使用MyBatis? 我们都知道,在学习mybatis之前,要在Java中操作数据库,需要用到JDBC,但是在使用JDBC时会有许多缺陷. 比如: 1.使用时需要先进行数据库连接,不用后要立 ...