.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 ...
随机推荐
- Java——Java是什么一门什么语言
解释型语言 源代码不能直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行: 程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次: 解释性语言代表:Python ...
- Android P HIDL demo代码编写 (原创)
之前的文章已经分析了HIDL服务的注册和调用,这篇文章来总结下一个HIDL的服务如何编写. 缩写HAL文件 首先要确认放置文件夹和接口的包名,因为这跟后面使用脚本生成一部分代码有关,一般默认的放在ha ...
- oracle常用数学函数
数学函数 ABS:(返回绝对值) --返回绝对值 select abs(-1.11) from dual; CEIL:(向上取整) --向上取整 select ceil(3.1415) from du ...
- Spring官网阅读(二)(依赖注入及方法注入)
上篇文章我们学习了官网中的1.2,1.3两小节,主要是涉及了容器,以及Spring实例化对象的一些知识.这篇文章我们继续学习Spring官网,主要是针对1.4小节,主要涉及到Spring的依赖注入.虽 ...
- 新书《OpenShift云原生架构:原理与实践》第一章第三节:企业级PaaS平台OpenShift
近十年来,信息技术领域在经历一场技术大变革,这场变革正将我们由传统IT架构及其所支撑的臃肿应用系统时代,迁移至云原生架构及其所支撑的敏捷应用系统时代.在这场变革中,新技术的出现.更新和淘汰之迅速,以及 ...
- 【Hadoop离线基础总结】伪分布模式环境搭建
伪分布模式环境搭建 服务规划 适用于学习测试开发集群模式 步骤 第一步:停止单节点集群,删除/export/servers/hadoop-2.7.5/hadoopDatas,重新创建文件夹 停止单节点 ...
- xpath加PHP对网站相关数据的截取
首先了解一串代码 <?php $url = 'http://www.baidu.com';$ch = curl_init();curl_setopt($ch, CURLOPT_FILE, fo ...
- 在培训机构花了好几万学Java,当了程序员还常被鄙视,这是招谁惹谁了?
在之前的文章中说过,我是非计算机专业,通过参加培训进入程序员这行的. 入了程序员这行后,挺长一段时间在亲戚朋友中,我还是挺有面子的:家族里的第一个程序员,工作不用风吹日晒,收入比其他行业高不少,尤其是 ...
- C#枚举高级战术
文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角 ...
- js移动端复制到剪贴板
// 复制到剪切板 function copy(str){ var save = function (e){ e.clipboardData.setData('text/plain',str);//c ...