Remoting简单实践
一句话概括
remoting是微软的一种实现在不同的.net应用程序中进行分布式通信的技术
重要概念
原理大致是首先客户端通过remoting通道来获取服务器对象代理,通过序列化与反序列方式实现数据交互
远程对象:服务器端的实现类必须继承MarshalByRefObject,进而实现remoting通信,支持跨程序域的访问
远程对象的激活
主要分为服务器端激活和客户端激活
交互前都需要激活相应的实例,便于调用方法
通道:
主要tcp,http,ipc这几种方式
tcp通过二进制传输,传输效率高,局域网中适合用tcp
http:采用soap格式序列化消息对象,可以跨越防火墙,安全性较高,
IpcChannel:进程间通信,只使用同一个系统进程之间的通信,不需要主机名和端口号。而使用Http通道和Tcp通道都要指定主机名和端口号。
简单Demo
1.创建服务器端服务实现类
public class MyRemotingObject : MarshalByRefObject
{
// 用来测试Tcp通道
public int AddForTcpTest(int a, int b)
{
return a + b;
} // 用来测试Http通道
public int MinusForHttpTest(int a, int b)
{
return a - b;
} // 用来测试IPC通道
public int MultipleForIPCTest(int a, int b)
{
return a * b;
}
}
2.配置服务端remting服务
<?xml version="1.0" encoding="utf-8" ?>
<!--服务端App.config的内容-->
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton"
type="RemotingDemo.MyRemotingObject,RemotingDemo"
objectUri="MyRemotingObject"/>
</service>
<channels>
<channel port="" ref="tcp"/>
<channel port="" ref="http"/>
<channel portName="IpcTest" ref="ipc"/>
<!--Ipc通道不需要端口号-->
</channels>
</application>
</system.runtime.remoting>
</configuration>
3.在服务器端程序入口启动加载配置文件,让它内部自己去注册启动服务
RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, false);
4.客户端激活远程对象并调用相应方法
MyRemotingObject proxyobj1 = Activator.GetObject(typeof(MyRemotingObject), "tcp://localhost:9001/MyRemotingObject") as MyRemotingObject;
if (proxyobj1 == null)
{
Console.WriteLine("连接TCP服务器失败");
} //HttpChannel httpChannel = new HttpChannel();
//ChannelServices.RegisterChannel(httpChannel, false);
MyRemotingObject proxyobj2 = Activator.GetObject(typeof(MyRemotingObject), "http://localhost:9002/MyRemotingObject") as MyRemotingObject;
if (proxyobj2 == null)
{
Console.WriteLine("连接Http服务器失败");
} //IpcChannel ipcChannel = new IpcChannel();
//ChannelServices.RegisterChannel(ipcChannel, false);
MyRemotingObject proxyobj3 = Activator.GetObject(typeof(MyRemotingObject), "ipc://IpcTest/MyRemotingObject") as MyRemotingObject;
if (proxyobj3 == null)
{
Console.WriteLine("连接Ipc服务器失败");
}
// 输出信息
Console.WriteLine("This call object by TcpChannel, 100 + 200 = {0}", proxyobj1.AddForTcpTest(, ));
Console.WriteLine("This call object by HttpChannel, 100 - 200 = {0}", proxyobj2.MinusForHttpTest(, ));
Console.WriteLine("This call object by IpcChannel, 100 * 200 = {0}", proxyobj1.MultipleForIPCTest(, ));
Console.WriteLine("Press any key to exit!");
Console.ReadLine();
总结
以前很惧怕去了解相关的技术,感觉非常难学,譬如说wcf,接下来我应该去实践wcf带来的乐趣!
Remoting简单实践的更多相关文章
- Thrift简单实践
0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Android 设计随便说说之简单实践(合理组合)
上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...
- c#中,委托Func的简单实践
c# 委托Func的简单实践最近才真正的接触委托,所以针对Func类型的委托,做一个实践练习. 首先说一些我对委托的初级理解:"就是把方法当做参数,传进委托方法里". 我平时用到的 ...
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- SQL知识以及SQL语句简单实践
综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定 ...
- ZooKeeper分布式锁简单实践
ZooKeeper分布式锁简单实践 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁 ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
- VueRouter爬坑第一篇-简单实践
VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...
随机推荐
- iOS中运用正则表达式
iOS中运用正则表达式来匹配短信验证码,电话号码,邮箱等是比较常见的. 在iOS中运用正则表达式主要有三种方式: -:通过谓词下面是实例代码: - (BOOL)regularExpresionWith ...
- c#打包文件解压缩
首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: /// <summary> /// 得到指定的输入流的ZIP ...
- Python 3 学习笔记2
教程链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 高级特性 切片 取一个l ...
- C++ 字符串指针与字符串数组
在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...
- Mac环境下Myeclispe2015工具的安装与破解
链接地址:http://www.07net01.com/2015/08/919753.html 07net01.com 发布于 2015-08-30 22:19:37 分类:IT技术 阅读(306) ...
- Problem F: Exponentiation
Problem F: ExponentiationTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 4 Solved: 2[Submit][Status][W ...
- 求新的集合 A=AUB(顺序表)
#include<stdio.h> typedef int A; const int LIST_INIT_SIZE=100; const int LISTINCREMENT=10; typ ...
- Mysql数据库中 ,涉及事物,循环添加数据
),), ) BEGIN declare cnt ; declare i ; declare growthid ; DECLARE t_error INTEGER DEFAULT ; DECLA ...
- Android开发中出现cannot be resolved to a variable错误,也就是R文件不能生成。
最近开始学过习Android开发,配置完成开发环境后,在创建第一个Android项目就出现了cannot be resolved to a variable错误,也就是R文件不能生成的问题. 以下是从 ...
- (Problem 72)Counting fractions
Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...