remoting与socket、webservice和wcf的比较及优势(转)
1:socket VS remoting
??? 使用socket无疑是效率最高的。但是,在复杂的接口环境下,socket的开发效率也是最低的。故在兼顾开发效率的情况下,可以使用remoting来代替socket开发。并且:
??? 1、Tcp通道的Remoting速度非常快。
??? 你可以通过端口查看工具,发现remoting比直接socket传输的内容,应该是属于同一个数量级的。我的另一个担心是,大客户端数量的情况下,remoting传输效率会不会很低,结果经过现场测试,同时对300个客户端进行数据通信,不存在信息丢失情况。
??? 2、虽然是远程的,但是非常接近于本地调用对象。
??? 也就是完全符合面向对象思想。
??? 3、可以做到保持对象的状态
??? 直接使用socket传输机制,我们必须花大量的精力来处理异常、断网、死机等现象,使用remoting,这些工作会大大简化。
2:remoting vs webservice?
??? 1、webservice在framework2.0状态下只能寄宿于IIS等应用服务器中。微软直到3.0才提供了servicehost来寄宿 webservice,这就极大地限制了webservice在使用中的灵活性。在framework2.0环境下,如果你有一个应用要脱离IIS而存 在,就不得不抛弃webservice。(除非你想代码实现一个WEB应用服务器)
??? 2、remoting可寄宿在你自己的代码中,也可寄宿在windows服务及IIS中。最大程度的提供了开发和部署的灵活性。
??? 3、remoting在使用http通道的时候,也如webservice一样支持穿透路由。
??? 4、remoting与websercie相比,提供双向通信。哪怕是将remoting寄宿在IIS中,也支持。
??? 5、webservice客户端自动生成的代理类比较复杂。而remoting一般来说,都是手动编写客户端代码。
??? 6、当然,webservice最主要优势是,它是一个行业标准,而remoting只是微软自己内部的标准,如果你的应用要脱离微软的平台,就只能使用webservice了。
3:remoting vs wcf
??? 与wcf的比较,更多的是从平台的普及度上来说。在当前环境下,2.0的普及度还是最高的。如果哪一天3.0甚至4.0普及了,当然WCF是最好的。
4:最简单例子?
??? 下面给出一个极其简单的Sample:
4.1远程对象?
??? 首先,创建一个项目,名为 RemoteObject,该项目经过编译后产生的DLL文件要在remoting客户端的项目和服务器端的项目中被引用。该项目包含一个类 MyObject, 即 Remoting使用的远程对象,如下:
using System;
using System.Windows.Forms;
namespace RemoteObject
{
??? public class MyObject : MarshalByRefObject
??? {
??????? private int i = 0;
????????
??????? public int Add(int a, int b)
??????? {
??????????? return a + b;
??????? }
??????? public int Count()
??????? {
??????????? return ++i;
??????? }
??? }
}
4.2Server端?
??? 新建项目 RemoteServer(控制台), Server端要引用MyObject的DLL。
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteServer
{
??? class MyServer
??? {
??????? [STAThread]
??????? static void Main(string[] args)
??????? {
??????????? TcpServerChannel channel = new TcpServerChannel(9999);
????????????? ChannelServices.RegisterChannel(channel);
????????????? RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.MyObject),
???????????????? "RemoteObject", WellKnownObjectMode.SingleCall);
????????????? System.Console.WriteLine("Press Any Key");
????????????? System.Console.ReadLine();
??????? }
??? }
}
4.3Client端?
??? 新建项目 RemoteClient(控制台), Client端也要引用MyObject的DLL。
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteClient
{
??? class MyClient
??? {
??????? [STAThread]
??????? static void Main(string[] args)
??????? {
??????????? ChannelServices.RegisterChannel(new TcpClientChannel());
??????????? RemoteObject.MyObject remoteobj = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),
?????????? "tcp://localhost:9999/RemoteObject");
??????????? Console.WriteLine("1 + 2 = " + remoteobj.Add(1, 2).ToString());
??????????? Console.WriteLine("i = " + remoteobj.Count().ToString());
???????????? Console.ReadLine();
??????? }
??? }
}
??? 好了,一次运行生成的RemoteServer.exe和RemoteClient.exe ,你就会发现原来Remoting是这样简单。
?