100分的Remoting问题

yanwei100 2002-06-10 01:41:25
我要做一个C/S结构的程序,大概的结构是这样的
在server端程序启动时,注册一个IUser服务,该服务用于用户信息的管理
RemotingConfiguration.RegisterWellKnownServiceType(
theType,
"IUser",
WellKnownObjectMode.SingleCall
);

在client端调用server端的IUser处理具体的用户
LogInUser = (InterfaceImpClient)Activator.GetObject(
theType,
ServerAdr//要取的服务的URL
);

现在我的问题是,在server端启动时,注册服务时已经使用了SingleCall的参数。
是否意味着在server端可以不处理响应多个客户端的问题了。
当有多个客户端同时访问server时,server是否会自动完成多线程的处理。

我刚开始使用C#,不了解Remoting的工作原理,但我总觉得这样处理也太容易了吧?
我原来打算在server端做一个pool,使用多线程方式响应client的请求。
每收到一个client的请求,就从pool中请求一个新的线程。到client不再需要服务时,再把线程释放到pool中。
这些复杂的工作是否都可以被Remoting自动处理了?。


...全文
72 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanwei100 2002-06-11
  • 打赏
  • 举报
回复
多谢各位的意见。散分啦

下面是我在MSDN上找到的一些东西,算是对这个问题的一个小结吧

远程处理概述
公共语言运行库远程处理结构提供一组丰富的类,这些类使开发人员可以不必考虑大部分部署和管理远程对象的复杂工作。即使要处理在不同运行库环境中运行的应用程序,对远程对象调用方法也几乎与调用本地方法相同。本“快速入门”目的在于提供有关“远程处理”的简短介绍,并描述所涉及的原则,以便您可以根据需要生成更复杂的应用程序。对远程对象、HTTP、TCP 和 URL 有基本的了解可帮助理解这些示例。

“远程处理”是内置到公共语言运行库中的框架,它可用于生成复杂的分布式应用程序和网络服务。虽然它与其他平台上的类似 .NET 框架具有许多相同的功能,但它还提供一组特有的功能,这是任何其他框架所没有的:


代理对象。当客户端创建远程对象的实例时,它接收服务器上该类实例的代理。对代理调用的所有方法都将自动转发到该远程类,并且任何结果都将返回到客户端。从客户端的角度来看,此过程与进行本地调用没有任何区别。远程对象引发的任何异常都将被自动返回到客户端。这使客户端得以在代码节周围使用正常的 Try 块和 catch 块捕获和处理异常。


对象传递。所有远程创建的对象都由引用返回而且必须从 MarshallByRefObject 派生。作为参数传递给远程方法调用的对象可以由值或引用转发。默认行为是由值传递,前提是使用自定义属性 [serializable] 标记了相关对象。另外,该对象可以实现 ISerializable 接口,这在应如何序列化和反序列化对象方面提供灵活性。不是用引用或值封送的对象不能进行远程处理。


激活模型。可通过调用 new 轻松地从客户端创建远程对象。框架包含足够的“智能”,能够知道您正在处理远程对象,而且将确保该对象的实例在相关的远程应用程序中创建。创建远程对象的实例不局限于默认构造函数;您甚至可以使用需要一个或多个参数的构造函数执行此操作。Activator 类包含 CreateInstance 和 GetObject 两个方法,它们也可用于创建远程对象的实例。前者可用于替代 new 来创建对象实例,而后者通常用于连接到位于指定 URL 的对象。


无状态和有状态对象。框架规定将远程对象创建为无状态。如果将某个对象配置为 SingleCall,则当对该对象调用方法时会创建该对象。该对象处理调用,返回可选结果,然后被垃圾回收器回收。这样,对于每个调用客户端都始终连接到新对象。将对象配置为 Singleton 将确保无论何时调用该对象,所有客户端都连接到同一对象。ClientActivated 对象允许客户端在远程对象创建后将参数传递给该对象的构造函数。在客户端上对客户端激活的对象的每个激活请求(Activator.CreateInstance 或者 new 与配置文件中的项相结合)都导致在服务器上创建一个新对象。


信道和序列化。当客户端对远程对象调用方法时,远程处理框架自动序列化与该请求关联的任何数据,然后使用信道将数据传输到远程对象。一些支持的比较常用的信道包括 HTTP、TCP 和 SMTP。对于 HTTP 而言,框架使用 SOAP 协议以 XML 格式在客户端和服务器之间来回传输数据。HTTP 的默认序列化格式化程序为 SOAP 格式化程序。因为程序员可以创建用于任何信道的自定义格式化程序,所以远程处理框架可以配置为与其他平台上的任何外部 .NET 框架协同工作。TCP 信道默认情况下使用普通套接字和“二进制序列化”,而且可用于与远程服务器上的任何对象进行通讯。


基于租约的生存期。远程对象的生存期由租约机制控制。当第一次创建对象时,赋予它一个租约时间。当对象的租约时间降到零时,该对象将与远程处理结构断开连接,而且当 AppDomain 内对该对象的所有引用都释放后,该对象将由垃圾回收器回收。框架提供许多机制,允许客户端延长该对象的租约,从而维持其生命。


在 IIS 中承载对象。远程对象可以轻松地寄宿在 IIS 中。这样使任何客户端都能使用常规 HTTP 通过端口 80 连接到该对象。还可以使用 Internet Explorer 创建允许用户连接到远程对象的 Web 页。


“快速入门”其余部分主要介绍上述概念的应用示例。


--------------------------------------------------------------------------------

版权所有 2001 Microsoft Corporation。保留所有权利。


远程处理的工作原理
.NET 远程处理框架为开发人员提供先进的分布式对象模型,该模型允许在网络中的不同公共语言运行库之间或者在同一公共语言运行库中的不同 AppDomain 之间进行远程方法调用。与远程对象的所有交互都通过代理发生,而且客户端无法直接访问远程对象,因为该对象仅在其自己的 AppDomain 内才有意义。下列规则适用:

所有远程对象都必须从 MarshalByRefObject 派生。

与远程对象的任何交互都通过代理使用引用发生。客户端必须获取此激活远程对象的代理。此操作可通过调用 CreateInstance、GetObject 或 new 来完成。

当进行远程调用时,本地对象可用作参数。因为对远程对象来说,对本地对象的引用没有意义,所以当本地对象用作远程调用中的参数或者作为远程调用的结果返回时,所有本地对象都通过值传递。

由值传递的所有对象都必须可序列化。这一点可通过实现 ISerializable 接口或使用 [serializable] 自定义属性标记该对象来完成。

必须先激活远程对象,客户端才能使用它们。框架支持两种激活模型:服务器激活和客户端激活。服务器激活意味着当客户端试图访问对象时,该对象自动在服务器上创建。客户端激活意味着对象将作为来自客户端的蓄意激活请求的结果而创建。有两种激活模型的原因是因为在分布式对象模型中,对象的生存期经常成为要考虑的问题。在某些情况下,要求远程对象在调用之间维护状态。在其他情况下,要求无状态对象,这样在每次调用时都可以为每个调用方提供一个新的对象实例。有时客户端要求对对象的生存期有更多的控制(相比服务器激活所提供的控制而言)。通过同时允许服务器激活和客户端激活,开发人员可为手头的任务自由选取最佳的激活模型。
服务器对象在尚未创建时如何能侦听客户端呢?在网络上的某个位置创建并部署服务器对象,该对象在此处侦听要连接的客户端。当客户端出现时,有关该调用和参数的详细信息被传输给该服务器对象,然后方法执行,并将可选结果传输回该客户端。

部署服务器对象的步骤如下所示:


所有远程对象都必须注册到公共语言运行库,这样客户端才能访问它们。需要向公共语言运行库提供关于对象的特定详细信息,如应加载以激活该对象的程序集的名称、该对象的命名空间和类型名以及可在其中访问该对象的终结点的名称。框架确保一个对象不会在同一 AppDomain 中注册多次。

还需要注册客户端将用来与该对象进行通讯的所有信道。每个信道使用特定协议,如 TCP、HTTP 或 SMTP。在合适的地方,可注册多个信道。

该对象的详细信息存储在一个由框架管理的表中。该表还存储了随后为对象创建的对象引用。对象引用将用于表示不同 AppDomain 中的注册对象,并将在需要时被序列化并传输到客户端。

然后,注册的信道开始侦听是否有客户端要连接。

部署远程对象后,客户端可以连接和调用服务器对象上的方法。

客户端注册将用来与该远程对象进行通讯的信道。此处唯一的要求是服务器应在类似信道上正在侦听。

随后,客户端通过调用 new、GetObject 或 CreateInstance 激活该对象。

随激活请求提供有关于该远程对象的类型和位置的充分信息,以便框架创建表示该远程对象的代理。此过程是本地的,明白这一点很重要,并且根本没有对该远程对象进行调用。代理也存储在本地的一个表中,客户端的任何其他激活请求都接收该代理。

在服务器激活对象的情况下,客户端使用它在激活时接收的代理调用该远程对象上的方法。如果客户端信道尚未连接到远程信道,则客户端信道尝试建立此连接。

建立连接后,消息接收使用指定协议连接到处理通讯详细信息的连接的任一端。

方法调用的详细信息加载到 Message 对象中,该对象被序列化并传输到服务器。序列化的类型取决于信道。例如,使用 HTTP 信道时,所有消息序列化为 XML 并通过 SOAP 传输。另一方面,TCP 使用二进制序列化。

消息到达服务器端后,框架重新汇编原始调用、激活目标对象(如果它尚未激活)并将调用转发给相关对象。结果返回客户端时路径与消息发出的路径正好相反,它被打包到传输回该客户端的消息中。如果目标对象是 SingleCall 类型,则在调用完成后自动对其进行垃圾回收。



--------------------------------------------------------------------------------

版权所有 2001 Microsoft Corporation。保留所有权利。
qqchen79 2002-06-10
  • 打赏
  • 举报
回复
1. Remoting内部使用了Thread Pooling,不需要应用程序再实现了。
2. 如果你的Server需要维护与单个Client的关系和状态,SingleCall和Singleton都不是很合适,用Client Activated Object可能会好些。由于CAO对象是为单个客户服务的,统计信息和维护状态都方便很多。
5drush 2002-06-10
  • 打赏
  • 举报
回复
用Remoting来写就是很简单呀,remoting把底层都隐藏了,当你激活一个远程对象的时候,会在本地自动生成一个代理对象,你对这个对象的调用和返回都被remoting自动传到真正的对象,就好象你调用本地对象一样

===========================================================
★CSDN助手.Net★

功能简介:
1、真正离线浏览,智能缓存,自动更新本地数据库,也能一次性下载论坛所有帖子,速度飞快。
2、强大的搜索功能,能进行“标题”,“全文”及“作者”关键字搜索。
3、帖子更新自动监测提醒(在线等待的时候不用不停的刷新帖子了)。
4、分类收藏夹,可以非常方便的进行精华帖子本地典藏。
5、可以选择保存用户名和密码,自动登录。
6、方便的发贴和回复(可以群发)。
7、自由设计个性签名。
8、帖子内的Web连接自动探测,点击直接打开外部浏览器。
9、可以自由设置帖子查看区的字体,颜色,背景。
10、个人专区(我的帖子列表,我参与的帖子列表)。

下载地址:http://www25.brinkster.com/nluyan/csdn.zip
jhnhu 2002-06-10
  • 打赏
  • 举报
回复
>>那么我是否可以在server端知道,现在有哪些client正在和我连接呢?<<
用remoting,client也是你写的,在client中调用remoteObject的方法,把client的信息传过去就行了。

>>是不是需要server端在每次实例化时做这些工作?<<
是的
这看你具体要求,remoteObject就是放你需要的功能的。
不像asp,可以通过各种函数得到IIS提供的客户的各种信息;你需要信息就得在client中获得,传到server上

server端实例化,不是在client端new的时候,而是在client第一次调用方法的时候

讲一下你要做什么,这样我才能给你意见。
yanwei100 2002-06-10
  • 打赏
  • 举报
回复
那么我是否可以在server端知道,现在有哪些client正在和我连接呢?
是不是需要server端在每次实例化时做这些工作?
jhnhu 2002-06-10
  • 打赏
  • 举报
回复
>>是否意味着在server端可以不处理响应多个客户端的问题了<<
是的

你可以在同一台机器上开多个client来测试。

不需要多线程;pool的功能由clr实现,但实际还是需要很多资源的,.net就是这样。

SingleCall Every incoming message is serviced by a new object instance
相当于asp的session,每个连接一个对象;
Singleton Every incoming message is serviced by the same object instance
相当于asp的application 所有连接一个对象
yanwei100 2002-06-10
  • 打赏
  • 举报
回复
有人知道吗?
第1章 正则表达式.... 1 1.1 为什么要用正则表达式... 1 1.2 正则表达式入门... 3 1.2.1 正则表达式中元字符的用法... 4 1.2.2 Java中的正则表达式API 5 1.2.3 java.util.regex的使用... 6 1.3 实战正则表达式... 8 第2章 程序最优化.... 14 2.1 空间与时间... 14 2.1.1 空间与时间的概念和度量... 14 2.1.2 空间与时间的背反... 15 2.1.3 以空间换时间... 15 2.2 字典、哈希与Map. 19 2.2.1 字典的定义... 19 2.2.2 哈希表与哈希方法... 19 2.2.3 冲突与冲突的解决... 20 2.2.4 Java中的Map接口... 20 2.3 HashMap. 21 2.3.1 应用举例... 21 2.3.2 Map与HashCode. 26 2.4 使用缓存... 29 2.4.1 缓存的概念... 29 2.4.2 LRUMap类... 30 第3章 AOP. 33 3.1 AOP概论... 33 3.2 AspectJ. 35 3.3 Spring AOP. 36 3.3.1 实现Advice. 36 3.3.2 编写业务代码... 37 3.3.3 装配pointcut和advice. 38 3.3.4 运行主程序... 39 3.4 动态代理... 40 3.4.1 CGLib. 40 3.4.2 JDK Proxy. 42 第4章 Java平台下的Web开发.... 48 4.1 标记语言... 48 4.2 自定义标记库的开发... 48 4.2.1 Tag接口的生命周期... 49 4.2.2 hello标记的开发... 50 4.2.3 flash标记的开发... 52 第5章 案例系统需求.... 58 5.1 基础系统... 58 5.1.1 系统用户管理... 58 5.1.2 编码规则管理... 59 5.2 基础资料... 60 5.2.1 人员管理... 60 5.2.2 供应商管理... 61 5.2.3 客户管理... 62 5.2.4 计量单位管理... 62 5.2.5 物料管理... 63 5.3 业务单据... 64 5.3.1 入库单... 64 5.3.2 出库单... 66 5.3.3 盘点单... 68 第6章 基于Spring的多层布式 应用.... 71 6.1 概述... 71 6.2 Spring Remoting. 72 6.2.1 Hessian使用演示... 72 6.2.2 几种Remoting实现的比较... 75 6.3 改造HttpInvoker 75 6.3.1 服务文件的模块化... 82 6.3.2 本地服务加载器... 85 6.4 Remoting Session实现... 87 6.4.1 实现思路... 88 6.4.2 Session Id的生成... 88 6.4.3 用户信息的保存... 93 6.4.4 维护管理Session. 95 6.4.5 Session的注销... 97 6.4.6 安全问题... 100 第7章 元数据引擎.... 102 7.1 MDA概述... 102 7.2 关于元数据... 104 7.2.1 元数据示例... 105 7.2.2 元元数据... 108 7.2.3 设计时与运行时... 108 7.2.4 元数据设计的基本原则... 109 7.2.5 此“元数据”非彼 “元数据”... 109 7.3 实体元数据... 110 7.3.1 实体元数据格式... 110 7.3.2 元数据编辑器... 113 7.4 元数据引擎设计... 118 7.4.1 实体元数据运行时模型... 118 7.4.2 包及命名规范... 119 7.4.3 元数据加载器接口... 120 7.4.4 元数据热部署... 121 7.4.5 元数据部署方式... 121 7.5 元数据引擎实现... 122 7.5.1 根据元数据路径加载 元数据... 122 7.5.2 元数据枚举器... 122 7.5.3 元数据缓存... 125 7.5.4 元数据加载器... 126 7.5.5 工具类... 132 7.5.6 待改进问题... 133 第8章 基础类与基础接口.... 135 8.1 异常处理... 135 8.1.1 异常处理的方式... 135 8.1.2 为异常“脱皮”... 140 8.1.3 枚举异常... 141 8.1.4 异常处理器... 146 8.2 工具类... 147 8.2.1 枚举... 147 8.2.2 资源管理工具类... 149 8.2.3 DateUtils. 149 8.2.4 StringUtils. 150 第9章 数据访问基础服务.... 151 9.1 多账套的实现... 151 9.1.1 配置文件的支持... 151 9.1.2 账套管理器... 154 9.2 线程变量管理器... 157 9.2.1 ThreadLocal类... 157 9.2.2 线程变量管理器的实现... 159 9.3 事务... 163 9.3.1 为什么需要事务... 163 9.3.2 什么是事务... 164 9.3.3 事务的边界划... 164 9.3.4 声明型事务的属性... 166 9.3.5 事务的隔离... 168 9.3.6 事务的隔离级别... 168 9.3.7 不同隔离级别的差异... 169 9.3.8 Spring的声明型事务... 169 9.3.9 改造Spring事务配置方式... 172 9.4 会话服务的生命周期管理... 175 9.5 IValueObject接口... 178 第10章 层间数据传输.... 180 10.1 什么是DTO.. 180 10.2 域DTO.. 181 10.3 定制DTO.. 186 10.4 数据传送哈希表... 188 10.5 数据传送行集... 189

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧