前言

今天在整理以前写的一些demo,看到一个关于remoting的例子。好久不用remoting了,果断记录一下。

什么是Remoting

简单回顾下:

1.Remoting是一种远程通信,或者说跨应用程序(域)通信的技术,在C/S架构的程序中应用较多。

2.支持协议:TCP和HTTP。

3.激活方式:服务器端激活(WellKnow)和客户端激活。其中服务端激活又包含了SingleTon模式和SingleCall模式

HelloRemoting示例

一个完整的远程通信程序基本上包括以下几部分:

1.定义远程对象。Remoting传递的对象是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject;

2.服务端,主要是注册通道、注册远程对象、注销通道;

3.客户端,主要完成注册通道、获取远程对象。

第一步:

创建一个solution(HelloRemoting.sln)。然后按照上面描述的分别建立三个project:RemoteClient,RemoteObject,RemoteServer,如下图所示:

说明:我这里的使用的VS2008创建的,其中Client和Server是Winform程序,RemoteObject是类库。

第二步:

定义远程对象。Remoting的远程对象必须继承自:MarshalByRefObject。我们这里创建一个HelloRemote类,包含有求和运算。

View Source    /// <summary>/// 建立远程调用对象/// </summary>public class HelloRemote:MarshalByRefObject{public HelloRemote(){//构造函数}~HelloRemote(){ //析构函数}/// <summary>/// 求两数和/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns>和</returns>public int Sum(int a, int b){return a + b;}}

第三步:

创建服务,注册通道、远程对象。本示例使用服务端激活,TCP通道注册远程对象。具体如下:添加一个Form窗体,简单设置UI如下:

分别添加启动服务和关闭服务的按钮点击事件。代码如下(代码中已经有详细注释):我们把服务注册到10086端口上

View Source/// <summary>/// 启动服务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStartUp_Click(object sender, EventArgs e){try{//创建一个TCP通道TcpServerChannel channel = new TcpServerChannel(10086);//注册通道ChannelServices.RegisterChannel(channel);//使用WellKnown激活方式中的SingleCall模式注册远程对象RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.HelloRemote), "HelloRemote", WellKnownObjectMode.SingleCall);MessageBox.Show("启动成功", "提示");lblMsg.Text = "(服务已启动)";this.btnStartUp.Visible = false;//启动服务后隐藏启动按钮btnClose.Visible = true;//显示关闭服务按钮}catch (Exception ex){MessageBox.Show(ex.ToString(), "提示");}}/// <summary>/// 关闭服务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnClose_Click(object sender, EventArgs e){//获取当前已注册的通道IChannel[] registeredChannels = ChannelServices.RegisteredChannels;if (registeredChannels == null || registeredChannels.Length <= 0){MessageBox.Show("没有注册任何通道!", "提示");return;}foreach (IChannel channel in registeredChannels){//循环已经注册的通道if (channel.ChannelName.ToLower() == "tcp"){TcpServerChannel tcpchannel = (TcpServerChannel)channel;tcpchannel.StopListening(null);//关闭监听ChannelServices.UnregisterChannel(tcpchannel);//注销通道MessageBox.Show("服务关闭成功!", "提示");btnClose.Visible = false;btnStartUp.Visible = true;}}}

第四步:

创建客户端(Client),获取远程对象。同Server一样,在RemoteClient中添加一个Form如下:

在【点击计算】按钮上添加点击事件,完成注册通道,获取远程对象,以及调用远程对象计算并返回结果。代码如下:

View Source/// <summary>/// 计算两数的和/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSumbit_Click(object sender, EventArgs e){//获取远程对象其实是创建一个远程对象在客户端的代理HelloRemote obj = (HelloRemote)Activator.GetObject(typeof(HelloRemote), "tcp://localhost:10086/HelloRemote");if (obj == null){Console.WriteLine("Could not local Server");return;}try{//获取需要就算得两个数并转化为int型int firNum = Convert.ToInt32(txtFirst.Text.Trim());int secNum = Convert.ToInt32(txtSecond.Text.Trim());//调用远程对象int sum = obj.Sum(firNum, secNum);txtResult.Text = sum.ToString();}catch (Exception ex){MessageBox.Show(ex.ToString(), "提示");}}

通过上面的几步我们就创建了一个远程通信的示例,我们看一下运行结果,分别启动Server和Client,并输入10,20点击提交:

服务端:

客户端:

结果为30,说明我们成功的创建了一个使用Remoting的分布式应用程序。

源码如下:HelloRemoting.rar

转载于:https://www.cnblogs.com/pszw/archive/2012/05/10/2495102.html

一个关于Remoting的简单例子相关推荐

  1. glib g_main_loop的简单例子

    写了一个应用g_main_loop的简单例子 g_main_loop_new,创建了一个loop对象 g_main_loop_run,当程序运行到这里,就进入了一个死循环,不过添加到loop中的逻辑还 ...

  2. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  3. 什么是量子计算机?用一个简单例子来解释

    译者:王亮  作者:YK Sugi  原文:http://t.cn/EZAElk0 Hi,大家好! 不久前,我参观了加拿大温哥华的D-Wave Systems公司,这是一家制造前沿量子计算机的公司. ...

  4. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  5. KaTex的一个简单例子

    在网页中可以用KaTex显示数学公式,KaTex官网是https://katex.org 以下是KaTex的一个简单例子: 下载https://github.com/KaTeX/KaTeX/archi ...

  6. 单纯形法之人工变量法求解步骤:一个简单例子

    文章目录 人工变量法 1. 大M法 1.1. 题目 1.2. 转化为标准型 1.3. 添加人工变量 2. 两阶段法 2.1. 步骤 2.2. 题目 2.2.1. 转化为标准型 2.2.2. 添加人工变 ...

  7. android 百度语音 ui,在Android Studio下使用百度语音识别的一个简单例子

    一.引言 利用百度语音识别和百度语音合成可以很方便的设计一个语音交互应用,这里记录一下百度在线语音识别的简单例子以便快速上手. 我所用的语音识别包的版本是Baidu-Voice-SDK-Android ...

  8. 初次使用CTex时的一个简单例子

    初次使用CTex时的一个简单例子 1.初次使用Ctex时的例子 第一次使用 LATEX,在WinEdt编辑以下代码,然后使用PDFLaTeX生成PDF文档. \documentclass{articl ...

  9. 协方差检验用在什么地方_通过一个简单例子,通俗讲下协方差分析

    内容来自:"小白学统计"微信公众号,感谢作者授权. 临床中经常碰到这种设计:研究对象分为两组,接受不同治疗(如治疗组和安慰组),每组分别在治疗前和治疗后测量观察指标(如血压值).目 ...

最新文章

  1. MBE:ggtreeExtra-用图层叠加方法绘制环形进化树
  2. 在Windows上使用LaTeX
  3. PG奥斯卡!云数据库专属集群MyBase荣获2020 PG亚洲大会“年度最佳产品奖”
  4. ERROR 1130: Host '192.168.1.3' is not allowed to c
  5. Vue中computed分析
  6. 移动开发 or web 前端?
  7. linux 软件逆向工程,黑莓开源软件逆向工程 PE 文件的工具PE tree作为IDA插件的安装方式...
  8. Teamviwer和向日葵使用
  9. 大数据创业的门槛到底有哪些?
  10. c#万能视频播放器(附代码)
  11. Java Deque
  12. 业务流程图绘制方法经验谈(上篇)
  13. 02虚幻编辑器各部分功能详解
  14. swiper3D效果
  15. 简单粗暴的动态气泡图
  16. checkbox 设置默认选中
  17. Recursive function
  18. 移植u-boot-1.3.4到GT2440(第二版2.0)
  19. 怎样做小程序最省钱,小程序开发平台大盘点
  20. 行业沙龙第六期丨数字化采购寻源,实现阳光采购

热门文章

  1. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点
  2. 学好Linux决心书
  3. QQuickRenderControl
  4. 【 2013华为杯编程大赛成都第三组前两题试题及答案】
  5. 德勤收购MSSP厂商Vigilant
  6. Mysql 中 delete 与 left join 的问题
  7. C语言打包解包文件程序(简易版)
  8. 学成在线--17.我的课程
  9. MATLAB显示错误使用untitled,新手,用gui界面画李萨如图,出错,求解答
  10. linux mc服务器 mod_如何在linux搭建MC服务器