remoting的远程操作

2023-10-13 12:08
文章标签 操作 远程 remoting

本文主要是介绍remoting的远程操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

           .net里面可远程操作对象有2种:值封送对象(其特点是通过序列化操作可保存会话状态),引用封送对象(不能使用序列化保存会话状态,只能通过创建副本进行远程操作)。在remoting里面由于单元素对象激活和客户激活是有会话状态的,所以牵涉到保存对话状态,这时的远程操作就必须使用值封送对象,值封送对象可以通过序列化操作来保存会话状态;可以申请新的对象实例,并且对新的新的对象实例的操作或者set(写入的值),传到服务器端使用(这就是保存会话状态);而单调用元素是没有会话状态的,所以不能够使用值封送对象来远程操作,只能使用引用封装对象,只能在客户端创建一个服务器端的副本操作,意思是同样可以创建新的对象实例,但对其操作的结果只能是在本地的副本上面,不能返回到服务器端,不能传到服务器端使用。只能在本地使用。
分别看看实例:
首先看客户端调用:
我们先来修改一下远程对象:
dll对象的修改:
using System;

namespace RemoteObject
{
    public class MyObject:MarshalByRefObject
    {
        private MBV _mbv;
        private MBR _mbr;
        public int Add(int a,int b)
        {
            return a+b;
        }

        public MBV GetMBV()
        {
            return new MBV(100);
        }

        public MBR GetMBR()
        {
            return new MBR(200);
        }

        public void SetMBV(MBV mbv)
        {
            this._mbv=mbv;
        }

        public int UseMBV()
        {
            return this._mbv.Data;
        }

        public void SetMBR(MBR mbr)
        {
            this._mbr=mbr;
        }

        public int UseMBR()
        {
            return this._mbr.Data;
        }
    }

    [Serializable]
    public class MBV
    {
        private int _data;
        public MBV(int data)
        {
            this._data=data;
        }
        public int Data
        {
            get
            {
                return this._data;
            }
            set
            {
                this._data=value;
            }
        }
    }

    public class MBR:MarshalByRefObject
    {
        private int _data;
        public MBR(int data)
        {
            this._data=data;
        }
        public int Data
        {
            get
            {
                return this._data;
            }
            set
            {
                this._data=value;
            }
        }
    }
}
           客户端的修改:
RemoteObject.MyObject app=(RemoteObject.MyObject)Activator.CreateInstance(typeof(RemoteObject.MyObject),null,new object[]{new System.Runtime.Remoting.Activation.UrlAttribute(System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"])});
            RemoteObject.MBV mbv=app.GetMBV();
            Console.WriteLine(mbv.Data);
            RemoteObject.MBR mbr=app.GetMBR();
            Console.WriteLine(mbr.Data);
            mbv=new RemoteObject.MBV(600);
            app.SetMBV(mbv);
            Console.WriteLine(app.UseMBV());
            //mbr=new RemoteObject.MBR(200);
            //app.SetMBR(mbr);
            //Console.WriteLine(app.UseMBR());
            Console.ReadLine();
             结果可以看到输出100,200,600,就象前面说的一样,600是我们用了set方法,象新建的对象里面输入的值,而这个值同样也被传到了服务器端里面,这就是序列化的保存了会话状态。这个对于客户端激活和Singleton是同样有效的。
             看看如果是Singleton我们也来试试。
             客户端程序修改:
RemoteObject.MyObject app=(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
             客户端配置文件同样也要修改.
             得到的结果和客户端激活完全一样。
            怎样去理解不保存对话状态而调用远程对象呢,我们用dataset来试一下:
远程对象修改如下:
using System;
using System.Data;

namespace RemoteObject
{
    public class MyObject:MarshalByRefObject
    {
        public DataSet Method(DataSet ds)
        {
            DataTable dt=ds.Tables[0];
            foreach(DataRow dr in dt.Rows)
            {
                dr["test"]=dr["test"]+"_ok";
            }
            return ds;
        }
    }
}
            客户端修改如下:
RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            DataSet ds=new DataSet();
            DataTable dt=new DataTable();
            dt.Columns.Add(new DataColumn("test",typeof(System.String)));
            DataRow dr=dt.NewRow();
            dr["test"]="data";
            dt.Rows.Add(dr);
            ds.Tables.Add(dt);
            ds=app.Method(ds);
            Console.WriteLine(ds.Tables[0].Rows[0]["test"].ToString());
            Console.ReadLine();
           运行后发现输出data_ok了。
           这里的data就在客户端,并没有传到服务器上面去,后面的_ok就是从服务器上面取下来的。这个结果是2个结果组合而成。
(感谢lovecherry的blog,我的文章里面加入了一些自己的理解和思考,如果大家想看到纯净版的remoting请看http://www.cnblogs.com/lovecherry。不敢掠人之美。)

这篇关于remoting的远程操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203100

相关文章

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.