Remoting专题3(客户端和服务端之间的通信)

一、Remoting 的优缺点?
优点:
1、能让我们进行分布式开发 
2、Tcp 通道的 Remoting 速度非常快 
3、虽然是远程的,但是非常接近于本地调用对象 
4、可以做到保持对象的状态 
5、没有应用程序限制,可以是控制台,winform,iis,windows 服务承载远程对象
缺点:
 
1、非标准的应用
因此有平台限制 2、脱离 iis 的话需要有自己的安全机制

  

三、最简单的 Remoting 的例子
1、远程对象:
建立类库项目:RemoteObject
using System; 
namespace RemoteObject 
{ 
 public class MyObject:MarshalByRefObject 
 { 
 public int Add(int a,int b) 
 { 
 return a+b; 
 } 
 } 
}
2、服务端
建立控制台项目:RemoteServer
using System; 
using System.Runtime.Remoting; 
namespace RemoteServer 
{ 
 class MyServer 
 { 
 [STAThread] 
 static void Main(string[] args) 
 { 
 RemotingConfiguration.Configure("RemoteServer.exe.config"); 
 Console.ReadLine(); 
 } 
 } 
}
建立配置文件:app.config
 
 
"RemoteServer"> 
  
 "RemoteObject.MyObject,RemoteObject" 
objectUri="RemoteObject.MyObject" 
 mode="Singleton" /> 
  
  
 ref="tcp" port="9999"/> 
  
  
  
3、客户端:
建立控制台项目:RemoteClient
using System; 
namespace RemoteClient 
{ 
 class MyClient 
 { 
 [STAThread] 
 static void Main(string[] args) 
 { 
 RemoteObject.MyObject app = 
(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuratio
n.ConfigurationSettings.AppSettings["ServiceURL"]); 
 Console.WriteLine(app.Add(1,2)); 
 Console.ReadLine(); 
 } 
 } 
}
View Code
建立配置文件:app.config
 
  
 "ServiceURL" value="tcp://localhost:9999/RemoteObject.MyObject"/> 
  
View Code
4、测试
 
 
在最后编译的时候会发现编译报错:
1、找不到 app.Add() 
2、找不到 RemoteObject
 
       这是因为客户端 RemoteClient 没有添加 RemoteObject 的引用,编译器并不知道远程对象存在哪些成员所以报错,添加引用以后 vs.net 会在客户端也保存一个 dll,可能大家会问这样如果对远程对象的修改是不是会很麻烦?其实不麻烦,对项目编译一次 vs.net 会重新复制 dll。
       然后直接运行客户端会出现“目标主机拒绝”的异常,也说明了通道没有打开运行服务端再运行客户端出现“找不到程序集 RemoteObject”!回头想想可以发现我们并在服务端对RemoteObject 添加引用,编译的时候通过是因为这个时候并没有用到远程对象,大家可能不理解运行服务端的时候也通过?这是因为没有这个时候还没有激活远程对象。理所当然,对服务端要添加引用远程对象,毕竟我们的对象是要靠远程承载的。现在再先后运行服务端程序和客户端程序,客户端程序显示 3,测试成功。

你可能感兴趣的:(Remoting专题3(客户端和服务端之间的通信))