欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NETRemoting学习笔记

程序员文章站 2022-06-15 09:28:30
1、.NET Remoting概念 1、一种分布式处理方式。从字面意义上看出,他是基于.net平台的一种远程对象开发技术,该技术是将远程计算机中的数据视为分布式对象来进行开发。 2、一种网络通信技术。既然这种技术可以操作远程计算机的数据,他当然是网络通信技术。 2、.NET Remoting使用的技 ......
 
1、.net remoting概念
 
NETRemoting学习笔记
1、一种分布式处理方式。从字面意义上看出,他是基于.net平台的一种远程对象开发技术,该技术是将远程计算机中的数据视为分布式对象来进行开发。
2、一种网络通信技术。既然这种技术可以操作远程计算机的数据,他当然是网络通信技术。
2、.net remoting使用的技术
1、xml
2、soap
soap=简单对象传输协议。
3、序列化
-二进制
-xml
 
3、.net remoting原理
通过通道(channel)实现网络之间通信的。
1、首先通过remoting访问通道以获得服务端访问对象
NETRemoting学习笔记
 
2、再通过代理解析为客户端对象
NETRemoting学习笔记
 
3、然后就可以在客户端去操作这个服务端对象了
NETRemoting学习笔记
 
 
客户端要获取服务器端对象,我们只需要知道通道的类型(tcpchannel和httpchannel)和服务器端的端口号就可以了,无需知道数据包的格式。
要注意的是,客户端在获取服务端对象时,并不是获取服务端实际的对象,而是获取了他的引用,这既保证了客户端和服务器端的有关对象的松散耦合,同时也优化了通信的性能。
 
 
4、.net remoting中的主要元素
NETRemoting学习笔记
 
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。
 
NETRemoting学习笔记
/*
* 远程对象类必须派生自marshalbyrefobject
*/
public class remoteclass : marshalbyrefobject
{
int num = 0;
public remoteclass()
{
console.writeline("激活了remoteclass远程对象");
}
public string method(string name)
{
console.writeline("第{0}次调用,参数为{1}", num++, name);
return "hello " + name;
}
}

 

5.2 步骤2:创建服务端宿主程序,用于接收客户端请求
1、注册管道
2、注册服务器激活对象方式
NETRemoting学习笔记
 
/*
* 需要引用system.runtime.remoting
*/
class program
{
static void main(string[] args)
{
//1、注册管道
tcpchannel tcpchannel = new tcpchannel(10000);//端口指定
httpchannel httpchannel = new httpchannel(10001);
 
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、使用代理调用远程对象
NETRemoting学习笔记
 
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为启动项目
NETRemoting学习笔记
 
2、f5启动服务端
 
NETRemoting学习笔记
 
4、启动client
NETRemoting学习笔记
 
 
效果:
NETRemoting学习笔记
 
NETRemoting学习笔记
 
 
 
 
6、.net remoting的配置文件
不用代码注册,用配置文件
服务端:
NETRemoting学习笔记
 
 
remotingconfiguration.configure(appdomain.currentdomain.setupinformation.configurationfile, true);
 
客户端:
 
NETRemoting学习笔记
 
remotingconfiguration.configure(appdomain.currentdomain.setupinformation.configurationfile, true);
remoteclass obj = new remoteclass();
 
console.writeline("http方式{0}", obj.method("祥子"));
 
 
代码下载