remoting与socket、webservices、WCF比较和优势(转)

时间:2022-12-28 14:23:30

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是这样简单。