Remoting服务端和客户端程序该这样模式来写

如何在Ubuntu 22.04上为AlphaFold3配置NVIDIA A100 GPU(含驱动安装避坑指南) 本文提供了在Ubuntu 22.04系统上为AlphaFold3部署NVIDIA A100 GPU的完整安装教程。内容涵盖从系统环境准备、NVIDIA驱动安装与避坑指南,到Docker容器化部署、数据库获取以及最终构建运行AlphaFold3的详细步骤,旨在帮助研究者和开发者高效配置高性能计算环境,充分发挥A100的硬件潜力。 阅读详情
远程对象的激活模式分服务端激活和客户端激活两种,(也就是对象分服务端激活对象或者说是知名对象和客户端激活对象两种)先看看msdn怎么描述服务端激活的:

服务器激活的对象是其生存期由服务器直接控制的对象。服务器应用程序域只有在客户端在对象上进行方法调用时才创建这些对象,而不会在客户端调用 new 或 Activator.GetObject 时创建这些对象;这节省了仅为创建实例而进行的一次网络往返过程。客户端请求服务器激活的类型实例时,只在客户端应用程序域中创建一个代理。然而,这也意味着当您使用默认实现时,只允许对服务器激活的类型使用默认构造函数。若要发布其实例将使用带参数的特定构造函数创建的类型,可以使用客户端激活或者动态地发布您的特定实例。

服务器激活的对象有两种激活模式(或 WellKnownObjectMode 值):Singleton 和 SingleCall。

Singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。由于 Singleton 类型具有关联的默认生存期,即使任何时候都不会有一个以上的可用实例,客户端也不会总接收到对可远程处理的类的同一实例的引用。

SingleCall 远程服务器类型总是为每个客户端请求设置一个实例。下一个方法调用将改由其他实例进行服务。从设计角度看,SingleCall 类型提供的功能非常简单。这种机制不提供状态管理,如果您需要状态管理,这将是一个不利之处;如果您不需要,这种机制将非常理想。也许您只关心负载平衡和可伸缩性而不关心状态,那么在这种情况下,这种模式将是您理想的选择,因为对于每个请求都只有一个实例。如果愿意,开发人员可以向 SingleCall 对象提供自己的状态管理,但这种状态数据不会驻留在对象中,因为每次调用新的方法时都将实例化一个新的对象标识。

首先对于服务端激活的两种模式来做一个试验,我们把远程对象做如下的修改:

using  System;

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;
        }
    }
}

对客户端做以下修改:
RemoteObject.MyObject app  =  (RemoteObject.MyObject)Activator.GetObject( typeof (RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings[ " ServiceURL " ]);
            Console.WriteLine(app.Count());
            Console.ReadLine();

第一次打开客户端的时候显示1,第二次打开的时候显示2,类推……由此验证了 Singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。

把服务器端的config修改一下:
< wellknown  type ="RemoteObject.MyObject,RemoteObject"  objectUri ="RemoteObject.MyObject"
                    mode
="SingleCall"   />

(这里注意大小写,大写的C)
再重新运行服务端和客户端,打开多个客户端发现始终显示1。由此验证了SingleCall 类型对于每个客户端请求都会重新创建实例。下一个方法调用将由另一个服务器实例提供服务。

下面再说一下客户端的激活模式,msdn中这么写:

客户端激活的对象是其生存期由调用应用程序域控制的对象,正如对象对于客户端是本地对象时对象的生存期由调用应用程序域控制一样。对于客户端激活,当客户端试图创建服务器对象的实例时发生一个到服务器的往返过程,而客户端代理是使用对象引用 (ObjRef) 创建的,该对象引用是从在服务器上创建远程对象返回时获取的。每当客户端创建客户端激活的类型的实例时,该实例都将只服务于该特定客户端中的特定引用,直到其租约到期并回收其内存为止。如果调用应用程序域创建两个远程类型的新实例,每个客户端引用都将只调用从其中返回引用的服务器应用程序域中的特定实例。

理解一下,可以归纳出
1、客户端激活的时间是在客户端请求的时候,而服务端激活远程对象的时间是在调用对象方法的时候

远程对象修改如下:
using  System;

namespace  RemoteObject
{
    
public   class  MyObject:MarshalByRefObject
    {
        
private   int  i = 0 ;

        
public  MyObject()
        {
            Console.WriteLine(
" 激活 " );
        }

        
public   int  Add( int  a, int  b)
        {
            
return  a + b;
        }

        
public   int  Count()
        {
            
return   ++ i;
        }
    }
}

服务端配置文件:
< configuration >
    
< system .runtime.remoting >
        
< application  name ="RemoteServer" >
            
< service >
                
< activated  type ="RemoteObject.MyObject,RemoteObject" />
            
</ service >
            
< channels >
                
< channel  ref ="tcp"  port ="9999" />
            
</ channels >
        
</ application >
    
</ system.runtime.remoting >
</ configuration >

客户端程序:
using  System;

namespace  RemoteClient
{
    
class  MyClient
    {
        [STAThread]
        
static   void  Main( string [] args)
        {
            
// RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.CreateInstance( typeof (RemoteObject.MyObject), null , new   object []{ new  System.Runtime.Remoting.Activation.UrlAttribute(System.Configuration.ConfigurationSettings.AppSettings[ " ServiceURL " ])});
            
// Console.WriteLine(app.Count());
            Console.ReadLine();
        }
    }
}

客户端配置文件:
< configuration >
 
< appSettings >
 
< add  key ="ServiceURL"  value ="tcp://localhost:9999/RemoteServer" />
 
</ appSettings >
</ configuration >

(这里的uri按照服务端配置文件中application元素定义的RemoteServer来写)

运行程序可以看到,在客户端启动的时候服务端就输出了“激活”,我们再转回知名模式进行测试发现只有运行了方法才会在服务端输出“激活”。

2、客户端激活可以调用自定义的构造方法,而不像服务端激活只能使用默认的构造方法

把客户端代码修改如下:
RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.CreateInstance( typeof (RemoteObject.MyObject), new   object []{ 10 }, new   object []{ new  System.Runtime.Remoting.Activation.UrlAttribute(System.Configuration.ConfigurationSettings.AppSettings[ " ServiceURL " ])});
            Console.WriteLine(app.Count());

这里看到我们在CreateInstance方法的第二个参数中提供了10作为构造方法的参数。在服务端激活模式我们不能这么做。

远程对象构造方法修改如下:

public  MyObject( int  k)
        
{
            
this.i=k;
            Console.WriteLine(
"激活");
        }

毫无疑问,我们运行客户端发现输出的是11而不是1了。

3、通过上面的例子,我们运行多个客户端发现出现的永远是11,因此,客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。

总结:
1、Remoting支持两种远程对象:知名的和客户激活的。知名的远程对象使用了uri作为标识,客户程序使用这个uri来访问那些远程对象,也正式为什么称作知名的原因。对知名的对象来说2种使用模式:SingleCall和Singleton,对于前者每次调用都会新建对象,因此对象是无状态的。对于后者,对象只被创建一次,所有客户共享对象状态,因此对象是有状态的。另外一种客户端激活对象使用类的类型来激活,uri再后台被动态创建,并且返回给客户程序。客户激活对象是有状态的。
2、对于Singleton对象来说需要考虑伸缩性,Singleton对象不能在多个服务器上被部署,如果要跨服务器就不能使用Singleton了。

备注:个人习惯原因,在我的例子中服务端的配置都是用config文件的,客户端的配置都是基本用程序方式的
使用配置文件的优点:无需重新编译就可以配置通道和远程对象,编写的代码量比较少
使用程序定制的优点:可以获得运行期间的信息,对程序调试有利。

附:msdn有关章节:
http://msdn.microsoft.com/library/CHS/cpguide/html/cpconActivation.asp

Spring AI 项目实战(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司发票智能处理系统的技术实践(附完整源码) 本文介绍了基于百度OCR API与DeepSeek AI的发票智能处理系统,通过整合AI技术实现发票识别、信息提取和验证的全流程自动化。系统采用Spring Boot 3.2.0架构,结合百度OCR的高精度图像识别和DeepSeek的语义理解能力,显著提升了发票处理效率与准确率。关键技术包括多模型融合、智能错误纠正和自适应学习机制,实现了95%以上的识别准确率,将传统处理效率提升90%以上。该系统为数字化转型中的企业财务管理提供了智能化解决方案,具备高精度识别、实时处理、智能验证等核心优势。 阅读详情

相关推荐

数字后端零基础入门系列 | Innovus零基础LAB学习Day7

数字后端零基础入门系列 | Innovus零基础LAB学习Day7

weixin_37584728的博客 2278

初步接触remoting

刚接触remoting,看着网上的例子,写了一个示例,记录步骤: 1.创建一个PersonManager类库,里面是我们要对对象的操作方法,这里就不写啦。。。 2. 创建服务器端: /// //建立服务传输方式,可选择TCP或者HTTP,前者更能发挥高效性 TcpServerChannel tcp = new TcpServerChannel(8089);

热爱生活的专栏 711

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 328

C# 反射之Activator用法举例

概述 程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。Activator用法介绍Activator用于实例化对象的类,通过type获取类型后,可以通过它实例化对象.Activator.CreateInstance默认调用无参构造函数。实例:先定义一个学...

dotNET跨平台 1905

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2759

PX4 Offboard模式实战避坑:为什么你的Gazebo无人机解锁了却飞不起来?

本文深入解析PX4 Offboard模式下Gazebo无人机解锁后无法起飞的关键原因,提供详细的故障排查流程和调试方法。重点解决MAVROS连接、setpoint消息频率、坐标系一致性等常见问题,帮助开发者快速掌握无人机控制核心技术。

weixin_33461476的博客 328

(原创)一步一步学Remoting之二:激活模式

                                           一步一步学Remoting之二:激活模式 远程对象的激活模式分服务端激活和客户端激活两种,(也就是对象分服务端激活对象或者说是知名对象和客户端激活对象两种)先看看msdn怎么描述服务端激活的:服务器激活的对象是其生存期由服务器直接控制的对象。服务器应用程序域只有在客户端在对象上进行方法调用时才创建这些对

523

STM32新手必看:AHT20温湿度传感器实战指南(附完整I2C代码)

本文详细介绍了如何使用STM32驱动AHT20温湿度传感器,包括硬件连接、I2C通信协议解析、驱动代码优化及实战调试技巧。通过对比AHT20与DHT11、SHT30等传感器的性能,突出AHT20的高性价比优势,并提供完整的I2C代码示例,帮助新手快速上手嵌入式传感器开发。

weixin_29163857的博客 293

Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇

我写的.Net Remoting系列专题: Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务 Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触 Microsoft .Net Remoting系列专题之一 一、Remoting基础 什么是Remoting,简而言之,我们可以将其看...

weixin_34200628的博客 417

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 493

把 SAP ABAP ALE 与 IDoc 玩明白:从架构、配置到排错的一套闭环方法

本文介绍了SAP集成中ALE与IDoc的核心概念与实战应用。ALE作为SAP分布式应用框架,通过异步消息机制实现系统间数据交换,其三层架构隔离业务与传输细节。IDoc作为标准化消息容器,包含控制、数据和状态记录。文章详细解析了配置要点(端口、伙伴参数)、处理流程(Process Code)、排错工具(BD87、WE09)及同系统测试方法,并提供了发送程序代码骨架。通过架构认知→配置→开发→运维的完整路径,帮助读者掌握ALE/IDoc的实际操作技能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 229

[原创]Flash Remoting -- 全新的网络应用开发模式

Flash Remoting ----全新的网络应用开发模式Flash Remoting 的开发模式自从三年前我开始从事 Java 网站后台开发工作以来,我一直都在寻找一种比较好的开发模式。纵观现在众多的网站开发方式,虽然开发语言各不相同,但是形式没什么太大的变化。无论你采用 Perl,PHP,ASP,JSP,实际的过程大致是这样的。1:用户到你的站点,输入信息,点击“提交”按钮2:用户等待来自服

eiffelqiu的专栏 1749

详解AUTOSAR:DaVinci Configurator配置CAN和UART数据协议解析器(RH850)(实战篇—1)

通过学习本篇博文项目,将会把所学的DaVinci Configurator知识系统串联起来。

不脱发的程序猿 2816

remoting 简单使用

1 建立模型类 有的人编译为dll 文件 2 建立客户端 引用模型类 引用remoting 3建立服务器端 引用模型类 引用remoting <代码>//Remotingmodel(类文件 类库或者应用程序) //实例(数字 文字 字符)直接传送 类、结构什么 的必须序列化后传送(继承MarshalByRefObject) class talk:Marshal...

asdqwe23321的博客 146

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

.Net Remoting与WCF实现Server与Client通讯比较

  .Net Remoting是微软早前推出的一项分布式通讯技术框架,在.Net架构的程序中有着比较广泛的应用。在WCF中,已经集成了Remoting的技术。不过,他们有着很多相同的概念,如:信道(Channel)、代理(Proxy)、寄宿(host)等。在如今仍有一些分布式系统应用中运行着由Remoting技术构建的系统。本文将描述在服务端与客户端的交互中,他们各自的实现方式。   1、Rem...

weixin_33898876的博客 193

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

分布式应用处理方式 - Remoting

分布式应用程序   所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。 分布式的优势   地域分散性     比如银行系统,总行与各分行处于不同的城市或城市中的各个地区,在业务上它们需要处理各自的数据,也需要彼此之间的交换和处理,这就需要分布式的系统。 ...

weixin_30566149的博客 182

.Net Remoting测试小技巧

其实也不能说是小技巧,只是大家可能会没有重视。这是需要先说明的,否则会被我的标题迷惑,因为我要描述的内容,真是寻常无比。 编写Remoting程序,通常分为三部分:远程对象、服务端程序、客户端程序。如果不考虑元数据的安全性,我们会把远程对象的dll生成相同的两份,分别放到服务端和客户端。Remoting在客户端的调用是很简单的,但调试起来就没有那么容易。因为客户端和服务器端分别属于不同的应用程序...

weixin_34268579的博客 108

Remoting疑惑续集

上次写了一篇《关于Remoting的疑惑》,结果令人满意,解决了一个难题。但今天的问题有些奇怪,归结原因,还是对Remoting的内在机制不甚了解。问题如下: Remoting传递远程对象是通过通道来传递的,而每个通道将占用一个端口。要在服务端提供远程对象的实现,首先要Register通道,然后将对象Marshal。如果要停止该远程对象,再通过Disconnect。但该通道仍然存在。如果要停止通...

weixin_30781631的博客 69

.NET Remoting程序开发入门篇(五)

客户端: public class ServerObject:MarshalByRefObject{ public ServerObj() {  throw new System.NotImplementedException(); } public Person GetPersonInfo(string name,str...

weixin_30340617的博客 65

Windows Service开发的一个经典问题

很多人这样设计Windows Service,希望在某种条件下,比如某个事件发生后,希望Windows Service弹出一个窗体! 其实这非常不正确,不管是C#,VB.net还是C++创建的Windows Service是被OS windows子系统调用的和维护的, 恰恰它没有桌面站,OS在启动Windows子系统的时候,会默认创建两类东西,就是有窗口站的桌面(其实也是一个窗口以及窗口树结构...

Leo Open Space 158

【.NetRemoting-2】2015.09.17

【Remoting架构】 【1】是.NetFramework的一个重要组成 【2】框架的两个重要特性 【A】基本实现【B】可扩展/可定制 【各个组成部分】 【1】【客户端,客户端应用程序域】 【组成】 【A】代理【Proxy】 【B】格式器【Formatter】 【C】通道【Channel】 【要点】 1.总是通过代理【Proxy】和...

weixin_33711647的博客 95

[ZT]基于Spring实现远程服务编程

一.引言从根本上分析,Remoting实际上是一种企业分布式计算的组件。在同一服务器(Java虚拟机)内进行调用的服务(或类)并不需要把自己暴露为一种远程服务;但是,如果你需要与一个外部程序(在不同的服务器上或在一个不同的组织中)进行通讯的话,那么,必须把它实现为一个远程服务。Spring 框架为把业务类暴露为远程服务提供了一种独特而灵活的方式。Spring Remoting架构的核心是服

Stewart的专栏 1080
上一篇: Remoting和Web服务的区别
下一篇: Remoting的承载方式是这样的
JavaProgramers
博客等级 码龄22年 660粉丝 304原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值