.NET Remoting

轉自:http://www.iiiedu.org.tw/knowledge/knowledge20030430_2.htm

.NET Remoting

資策會數位教育研究所講師 董淑惠

 

 

概念簡介
微軟以往使用COM/DCOM的技術來處理分散式系統架構,透過Client端的Proxy代理程式來呼叫遠端Server機器上的物件。.NET Framework則使用.NET Remoting或Web Services技術來實作分散式處理的工作概念;在此針對.NET Remoting的設計架構做一個初步的簡介。

.NET Framework提供了多種的機制來支援Remoting,如:
.利用Channel來負責訊息的傳送與接收。
.利用Formatter來負責在訊息要透過channel傳送出去之前,先將訊息做適當的加密,或於訊息在透過Channel接收進來之後,先將訊息做相對的解密工作。
.利用Proxy來呼叫遠端的物件執行所要的功能呼叫。

其關係如下圖所示:



Channel 和 Formatter
在遠端物件被使用之前,必須先在Server端註冊好訊息傳送的通道(Channel),這些Channel可透過.NET Remotin configuration file或 ChannelServices物件類別的RegisterChannel方法來註冊。

在Channel的使用上,.NET Framework支援HTTP、TCP及SMTP等通道。若使用HTTP Channel ,則使用SOAP協定來收送訊息,所有的訊息會被傳送到SOAP Formatter中,被序列化(serialized)成XML的格式,而SOAP所需的headers也會被加入。至於使用TCP Channel者,則使用TCP協定來將訊息傳送到Binary Formatter中,以Binary Stream的方式來將訊息傳送到URI目的地。(URI : Universal Resource Identifier,類似大家所熟悉的URL)。

Activation and Proxy
Server-Side Activation
Server端在Client端要存取Remoting物件時必需在Server端能自動啟始Remoting物件,可使用RemotingConfiguration物件類別的RegisterWellKnownServiceType方法來完成這項工作。

Client-Side Activation
Client端要使用遠端物件之前,可使用New 或Activator 物件類別所提供的CreateInstance或GetObject方法來啟動物件並傳回Proxy,以便Client端可透過Proxy來執行叫用遠端物件的方法。

範例
以下分三個步驟來介紹
1. 建立Remoting物件
2. 在Server上初始Remoting物件
3. Client端使用Remoting物件

步驟1:建立Remoting物件
建立一個MathServer物件類別,提供Sum方法,可給予一連串的整數由Sum方法代為計算總和。程式碼如下,並說明於後:
Imports System
Namespace RemotingSamples

     Public Class MathServer
          Inherits MarshalByRefObject

          Public callCounter As Integer = 0

          Function Sum(ByVal ParamArray a() As Integer) As Integer
               Dim i As Integer
               For i = 0 To a.Length - 1
                    Sum += a(i)
               Next

               callCounter += 1
     End Function
End Class

End Namespace
說明:Remoting物件必須繼承自MarshalByRefObject,如此才能透過網路,將物件執行個體的參考位置傳遞給呼叫端。

步驟2:在Server上初始Remoting物件,程式碼如下,並說明於後:

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Channels.Http
Imports ObjectServices.RemotingSamples

Public Class Server
     Public Shared Sub Main()
               ‘建立兩個通道
          Dim chan1  As New Tcp.TcpChannel(8085)
          Dim chan2 As New Http.HttpChannel(8086)

               ‘註冊要偵聽這兩個通道
          ChannelServices.RegisterChannel(chan1)
          ChannelServices.RegisterChannel(chan2)

               ‘設定啟動哪個元件、服務的名稱及啟動的方式
                    ' 方法一
                    RemotingConfiguration.RegisterWellKnownServiceType( _
                         GetType(ObjectServices.RemotingSamples.MathServer), _
                         "CallMathFunction", _
                         WellKnownObjectMode.Singleton)

                    ' 方法二
                    ' RemotingConfiguration.RegisterWellKnownServiceType( _
                    '          GetType(ObjectServices.RemotingSamples.MathServer), _
                    '          "CallMathFunction", _
                    '          WellKnownObjectMode.SingleCall)


                    Console.WriteLine("Press Enter key to exit")
                    Console.ReadLine()
          End Sub
End Class
說明:
1. Dim
chan1 As New Tcp.TcpChannel(8085)
      Dim chan2 As New Http.HttpChannel(8086)
指出在8085 port上要建立TCP Channel, 8086 port上要建立Http Channel

2. ChannelServices.RegisterChannel(chan1)
    ChannelServices.RegisterChannel(chan2)
註冊要偵聽 Chan1 和 Chan2

3. RemotingConfiguration.RegisterWellKnownServiceType( GetType(ObjectServices.RemotingSamples.MathServer), "CallMathFunction",WellKnownObjectMode.Singleton)

指出在Server端註冊所要使用的元件、服務的名稱及啟動的方式。
其中WellKnownObjectMode.Singleton表示一個執行個體可供多個前端來呼叫,可保留其狀態,另一種則為WellKnownObjectMode.SingleCall,一個執行個體只能服務一個前端的呼叫,無法保留其狀態。

步驟3:在Client端使用Remoting物件,程式碼如下:
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Channels.Http
Imports Microsoft.VisualBasic
Imports System.IO
Imports ObjectServices.RemotingSamples

Public Class Client
     Public Shared Sub Main()

          Dim counter As Integer

          Dim chan1 As New TcpChannel()
          ChannelServices.RegisterChannel(chan1)

          Dim obj1 As MathServer = _
               CType(Activator.GetObject( _
                    GetType(ObjectServices.RemotingSamples.MathServer), _
                    "tcp://localhost:8085/CallMathFunction"), _
                    MathServer)

          If (obj1 Is Nothing) Then
               Console.WriteLine("Could not locate TCP server")
               Exit Sub
          End If

          Dim chan2 As New HttpChannel()
          ChannelServices.RegisterChannel(chan2)

          Dim obj2 As MathServer = _
               CType(Activator.GetObject( _
                    GetType(ObjectServices.RemotingSamples.MathServer), _
                    "http://localhost:8086/CallMathFunction"), _
                    MathServer)

          If (obj2 Is Nothing) Then
               Console.WriteLine("Could not locate HTTP server")
               Exit Sub
          End If

          Try
               Console.WriteLine("Client1 TCP Call Sum method {0} Counter {1}", obj1.Sum(10, 20, 30), obj1.callCounter)
               Console.WriteLine("Client2 HTTP HelloMethod {0} Counter {1}", obj2.Sum(100, 200, 300, 400), obj1.callCounter)
          Catch ioExcep As IOException
               Console.WriteLine("Remote IO Error" & vbCrLf & "Exception:" & vbCrLf & ioExcep.ToString())
               End Try
          End Sub

End Class

說明:
1.Dim obj1 As MathServer = _
                    CType(Activator.GetObject( _
                         GetType(ObjectServices.RemotingSamples.MathServer), _
                         "tcp://localhost:8085/CallMathFunction"), _
                         MathServer)
在Tcp道路上叫用遠端物件(含遠端物件的物件型別名稱、URI及通道資料),透過Activator.GetObject來起始物件並傳回Proxy。

原始程式碼下載

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼url增加参数useSSL 和时区 : jdbc:mysql://localhost:3306/mydb?useSSLfalse&serverTimezoneUTCdriver变化: com.mysql.jdbc.Driver > com.mysql.cj.jdbc.Driver常见错误提示1:如果driver没有添加cj&#xff0c…

通过python实现linux切换用户_Python操作远程服务器切换到root用户

在自动化运维过程中,需要远程服务器切换到root用户下执行命令,尝试了一些方法,得到如下好用的方法,供大家使用: import time import paramiko def verification_ssh(host,username,password,port,root_pwd,cmd): spara…

RabbitMQ 入门:1. Message Broker(消息代理)

Message Broker(消息代理)维基百科对 Message Broker 的定义是:Message broker是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息传递协议。这个定义略繁琐,下面看看 RabbitMQ 官网对 Mes…

ASP.NET中常用输出JS脚本的类(改进版)

在ASP.NET中我们经常需要输出一些JS脚本,比如弹出一个警告窗口,返回到历史页面等JS功能,我看到网上流传得比较广的是马先光写的一个JScript类,这个类基本将经常用到的JS脚本包含了,非常方便,唯一的不足是作…

mysql从库夯住_MySQL从库维护经验分享

前言:MySQL 主从架构应该是最常用的一组架构了。从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用。其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维护经验,一起来…

python frame用法_python—dataframe用法

#行处理 #df.iloc[1] 行索引号——获取行 #df.iloc[0,1] 行列索引号——获取一个元素 #df.iloc[[0,1]] 双括号默认都是行索引号——获取n行 #df.iloc[0:2,1:3] 行列索引号——获取区域元素 #df.loc["A"] 行名称——获取行 #df.loc["A","c1"] 行列…

什么时候我们应谈及性能?

【导读】实际项目开发中、有部分童鞋可能无时无刻都在关注性能,那么我们到底应该什么时候关注性能呢?个人以为,性能并非一次性就可完全成全,需结合实际业务有一个大致评估或预期,比如数据量大小,若预期短暂…

基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历

http://blog.csdn.net/dongfengsun/archive/2007/12/12/1930577.aspx 上次用J2SE写了一个文件夹传递工具,把所有文件都以字节流的形式写入到一个*.txt文件里。结果回到家后,光分目录筛选文件就浪费了我整整一个晚上。痛定思痛,决定还是从程序上来解决问题。 那么所有的磁盘文件…

python编写正则表达式匹配单词_Python正则表达式匹配整个单词

守候你守候我 我认为,通过给出的答案,OP所期望的行为并没有完全实现。具体来说,布尔值的期望输出没有完成。给出的答案做帮助说明这一概念,我认为他们是优秀的。也许我可以说明我的意思,我认为OP使用了下面的例子。给出…

python中可以表示任意大的整数_Python无法表示99999999999999999999这样大的整数。

被邓为“小平和国一部意义义的具有际意称赞法律历史,无法”的性的一个具有杰作创造“是是(。表示。对于的容性要密封求高器,样整数包括性试验的要求中应进行气密各种。无法喷涂金属及工具有设备。吊装台起用多重机设备时,表示为(吊装用的常采…

数据写入规则IBufferWriterT

IBufferWriter<T>从名字上看大概已经猜到作用&#xff0c;这个接口是在.NET Standard 2.1作为标准支持。那这个接口的实际使用场和作用是什么&#xff1f;在了解之前先看一下System.Text.Json的一些代码:public sealed class Utf8JsonWriter : IAsyncDisposable, IDispos…

[转]简单介绍如何用Reporting Service制作报表

1&#xff09; 在安装好Reporting Service后&#xff0c;打开Visual studio .net ,选择新建项目&#xff0c;选择建立商业智能项目&#xff0c;选择新建一个报表项目&#xff0c;命名为reportservice1,再选确定&#xff0c;如下图&#xff1a; 2&#xff09;之后&#xff0c;在…

freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

不用说&#xff0c;Spring已经成为Java后端开发的事实上的行业标准。无数公司选择Spring作为基本开发框架。大多数Java后端程序员在日常工作中也会接触到Spring。因此&#xff0c;如何很好地使用Spring&#xff0c;已成为Java程序员的必修课之一。同时&#xff0c;Spring Boot和…

adonis.js mysql_Adonis.js——数据库基本操作

一、配置数据库adonis支持 PostgreSQL&#xff0c;SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;Oracle&#xff0c;MSSQL 数据库&#xff0c;默认为SQLite。在 config/database 中修改配置。connection: Env.get(DB_CONNECTION, mysql),二、创建数据库模型(Model)λ…

C# ObservableCollection和List的区别

一、ObservableCollection和List的区别1&#xff09;ObservableCollection比较简单&#xff0c;继承了Collection, INotifyCollectionChanged, INotifyPropertyChangedCollection&#xff1a;为泛型集合提供基类。INotifyCollectionChanged&#xff1a;将集合的动态更改通知给侦…

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别&#xff1a;DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符&#xff08;而不是字节&#xff09;个数&#xff0c;其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…

rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

原文托管在Github: https://github.com/shellhub/blog/issues/52数据结构与算法之线性表-顺序表实现(C语言版本)前言数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的&#xff0c;如Java语言中的ArrayList类的底层实现就是使用顺序…

浅析 record 使用场景

浅析 record 使用场景Intro之前我们有介绍过 record 基本知识&#xff0c;可以参考 C# 9 新特性 — record 解读&#xff0c;record 会实现基于值的类型比较&#xff0c;最近遇到的几个问题觉得用 record 来解决会非常方便&#xff0c;分享一下基于值的类型比较最近有遇到一个场…

jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

我正在学习Jersey / JAX-RS&#xff0c;我需要一些ExceptionMapper的帮助 .我有一个UserFacade类&#xff0c;AbstractFacade类和User类本身&#xff0c;都非常标准&#xff0c;主要是通过在Netbeans中创建一个带有Database的新Web Service RestFUL项目生成的 . 我的问题是&…

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…