说说Remoting

简介:

Remoting的认识和学习要感谢张逸老师,看了他的blog后,使我对Remoting技术有了新的认识,下面总结一下.

remoting实现的结构,分为服务端,远程服务对象和客户端,看图

image

Remoting是一个分布式处理服务。服务器端首先创建通道(Channel),并自动开启监听通道。
根据客户端发出的请求,传递远程对象。因此,编写Remoting程序,主要分为三部分:
     1、被传递的远程对象;
    2、服务器端监听程序;
   3、客户端请求和处理对象程序;
  一、被传递的远程对象
    在Remoting中,被传递的远程对象类是有诸多限制的。首先,我们必须清楚,这里所谓的传递是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject。
   MarshalByRefObject 是那些通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject 继承的对象会以隐式方式按值封送。
    当远程应用程序引用一个按值封送的对象时,将跨越远程处理边界传递该对象的副本。因为您希望使用代理方法而不是副本方法进行通信,因此需要继承 MarshallByRefObject。(MSDN)
    这个类只实现了最简单的方法,就是设置一个人的基本信息,并返回一个Person类对象。值得注意的是,这里返回的Person类。由于是以引用和远程调用的方式。
    这里所传递的Person则是以传值的方式来完成。因此必须涉及到一个序列化的问题。所以,Remoting要求对象类还要调用或传递某个对象,例如类,或者结构,
  则该类或结构则必须实现串行化Attribute。[Serializable]。

下面我们来做一个例子:

远程对象代码:

     /// <summary>
    /// 人物
    /// </summary>
    [Serializable]
    public class Person
    {
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
    }

namespace RemoteObject
{
    public interface IServerObject
    {
        Person GetPersonInfo(string name, string sex, int age);
    }
 
    public interface IServerObjFactory
    {
        IServerObject CreateInstance();
    }
 
    public class ServerObject : MarshalByRefObject, IServerObject
    {
        public Person GetPersonInfo(string name, string sex, int age)
        {
            Person person = new Person
            {
                Name = name,
                Sex = sex,
                Age = age,
            };
            return person;
        }
    }
 
    public class ServerObjFactory : MarshalByRefObject, IServerObjFactory
    {
        public IServerObject CreateInstance()
        {
            return new ServerObject();
        }
    }
 
 
}
服务端监听程序代码:使用的是console程序
 
 class Server
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //创建通道,使用8080端口;
            TcpChannel channel = new TcpChannel(8080);
 
            //注册通道;
            ChannelServices.RegisterChannel(channel);
 
            //传递对象;
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(RemoteObject.ServerObject),
                "ServiceMessage", WellKnownObjectMode.SingleCall);
 
            Console.WriteLine("Open the server listener");
            Console.ReadLine();
        }
    }

客户端请求代码:

 class Program
    {
        static void Main(string[] args)
        {
            TcpChannel channel = new TcpChannel();
            ChannelServices.RegisterChannel(channel);
 
            RemoteObject.IServerObject serverObj = (RemoteObject.IServerObject)
                Activator.GetObject(
                typeof(RemoteObject.IServerObject),
                "tcp://localhost:8080/ServiceMessage");
 
            Console.WriteLine("Invoke remoting object:");
            RemoteObject.Person person = serverObj.GetPersonInfo("wayfarer", "male", 28);
 
            Console.WriteLine("name:{0},sex:{1},age:{2}", person.Name, person.Sex, person.Age);
            Console.ReadLine();
        }
    }

OK,现在一个最简单的remoting程序就做好了!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:说说Remoting,如需转载请自行联系原博主。

目录
相关文章
|
SQL JavaScript
vue 代码编辑器 vue-codemirror
vue 代码编辑器 vue-codemirror
246 0
|
关系型数据库 MySQL 应用服务中间件
|
SQL Java 关系型数据库
数据持久化技术(Python)的使用
- 传统数据库连接方式:mysql(PyMySQL) - ORM 模型:SQLAlchemy MyBatis、 Hibernate ## PyMySQL 安装: ``` pip install pymysql ``` ## 简单使用 利用 pymysql.connect 建立数据库连接并执行 SQL 命令(需要提前搭建好数据库): ``` import pymysql db =
|
安全 数据安全/隐私保护
阿里云安全肖力:云上数据安全体系建设的六要素
高等级的云上数据安全体系到底是如何做的?6月29日,在第二届数据安全峰会上,阿里云智能安全事业部总经理肖力给出了答案。肖力指出,云上数据安全建设是一个系统工程,最主要的六大方面是减少攻击面、正确的产品安全策略配置、统一的身份认证授权、数据加密、数据防泄漏、日志审计。
9186 0
|
机器学习/深度学习 分布式计算 算法
【Spark Summit East 2017】从巨型图中学习的神经网络
本讲义出自Daniel Darabos与Hanna Gabor 在Spark Summit East 2017上的演讲,为了应对在构建神经网络的训练过程中对于图形顶点的考虑问题的挑战,Daniel Darabos与Hanna Gabor和团队使用同一张图执行预测和训练的过程并且给出了一些训练的技巧,而为了应对图过大而无法在单个机器的内存内进行真正的资源密集型计算的问题,使用对于图的分布式存储和计算策略,同时还展示了来解决上述问题核心算法以及一些实验结果。
1858 0
|
C++
C++第6周(春)项目3 用多文件组织多个类的程序
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 【项目3-用多文件组织多个类的程序】  将项目2用“一个项目多个文件”的方式实现,其中两个类的声明放在同一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。   参考代码: Geometry.h
1094 0
|
1天前
|
云安全 人工智能 自然语言处理

热门文章

最新文章