一个关于Remoting的简单例子

前言

今天在整理以前写的一些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,如下图所示:

image

说明:我这里的使用的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如下:

image

分别添加启动服务和关闭服务的按钮点击事件。代码如下(代码中已经有详细注释):我们把服务注册到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如下:

image

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

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点击提交:

服务端:

image

客户端:

image

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

源码如下:HelloRemoting.rar

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

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

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

相关文章

php mqtt qos,Mqtt Qos 深度解读

1.QoS含义 &#xff1a;Quality of Service,服务质量2.作用域发布者的Qos订阅者的Qos3.等级与作用level 0&#xff1a;最多一次的传输level 1&#xff1a;至少一次的传输&#xff0c;(鸡肋)level 2&#xff1a; 只有一次的传输4.交互过程qos0对于qos1而言&#xff0c;对于clien…

LeetCode 1502. 判断能否形成等差数列

文章目录1. 题目2. 解题1. 题目 给你一个数字数组 arr 。 如果一个数列中&#xff0c;任意相邻两项的差总等于同一个常数&#xff0c;那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列&#xff0c;请返回 true &#xff1b;否则&#xff0c;返回 false 。 …

matlab2017调用vgg19,VGG19模型训练+读取

VGG-19的介绍和训练这里不做说明,网上资源很多,而且相对比较简单.本博文主要介绍VGG-19模型调用官方已经训练好的模型,进行测试使用.[TOC]VGG-19模型简单介绍VGG模型使用VGG结构模型VGG具体参数模型VGG-19模型文件介绍这里是重难点,VGG-19模型存储的方式有点复杂可以通过作者文…

LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)

文章目录1. 题目2. 解题1. 题目 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat &#xff0c; 请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,0,1],[1,1,0],[1,1,0]] 输出&#xff1a;13 解释&#xff1a; 有 6 个 1x1 的矩…

matlab中ode23s使用方法,MATLAB中ode23函数,龙格库塔函数

今天说一说MATLAB中ode23函数的原理&#xff0c;在网上看了好多&#xff0c;但是不知道是怎么计算的&#xff0c;就知道是那么用的&#xff0c;但是最后结果咋回事不知道&#xff0c;今天来讲一讲是怎么计算的。首先来个程序&#xff1a;function feg6fun(t,y)f-y^3-2;end上面是…

LeetCode 1503. 所有蚂蚁掉下来前的最后一刻(脑筋急转弯)

文章目录1. 题目2. 解题1. 题目 有一块木板&#xff0c;长度为 n 个 单位 。一些蚂蚁在木板上移动&#xff0c;每只蚂蚁都以 每秒一个单位 的速度移动。其中&#xff0c;一部分蚂蚁向 左 移动&#xff0c;其他蚂蚁向 右 移动。 当两只向 不同 方向移动的蚂蚁在某个点相遇时&a…

LeetCode 1246. 删除回文子数组(区间DP)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 arr&#xff0c;每一次操作你都可以选择并删除它的一个 回文 子数组 arr[i], arr[i1], ..., arr[j]&#xff08; i < j&#xff09;。 注意&#xff0c;每当你删除掉一个子数组&#xff0c;右侧元素都会自行向前移动填补空…

LeetCode 573. 松鼠模拟(数学)*

文章目录1. 题目2. 解题1. 题目 现在有一棵树&#xff0c;一只松鼠和一些坚果。位置由二维网格的单元格表示。 你的目标是找到松鼠收集所有坚果的最小路程&#xff0c;且坚果是一颗接一颗地被放在树下。 松鼠一次最多只能携带一颗坚果&#xff0c;松鼠可以向上&#xff0c;向下…

MySQL索引背后的数据结构及算法原理(转)

摘要 本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;MySQL支持诸多存储引擎&#xff0c;而各种存储引擎对索引的支持也各不相同&#xff0c;因此MySQL数据库支持多种索引类型&#xff0c;如BTree索引&#xff0c;哈希索…

LeetCode 1273. 删除树节点(拓扑排序/DFS)

文章目录1. 题目2. 解题2.1 取巧解2.2 拓扑排序2.3 建图DFS1. 题目 给你一棵以节点 0 为根节点的树&#xff0c;定义如下&#xff1a; 节点的总数为 nodes 个&#xff1b; 第 i 个节点的值为 value[i] &#xff1b; 第 i 个节点的父节点是 parent[i] 。 请你删除节点值之和为…

WinForm邮件内容编辑器的简单实现

1、概述 在WinForm开发中&#xff0c;您可能会碰到发送邮件时内容编辑的问题&#xff0c;大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET 中类似FCK一样。今天我们就来介绍下如何实现和FCK一样的内容编辑器功能。 2、正文 邮件内容编辑器的问题,在…

LeetCode 1245. 树的直径(图的最大直径结论)

文章目录1. 题目2. 解题1. 题目 求树的最大直径。 2. 解题 类似题目&#xff1a;LeetCode 5538. 统计子树中城市之间最大距离&#xff08;枚举所有可能图的最大直径&#xff09; 结论&#xff1a;求无权无向图中的最长一条路径 先从任意一点P出发&#xff0c;找到离它最远的…

64 位 win7(2008 r2) 使用PLSQL Developer x86 32bit的解决方法

64 位 win7 使用PLSQL Developer 由于 PLSQL Developer 没有64位版本&#xff0c;所以在64位系统上运行该程序会报错&#xff0c;笔者为这个问题纠结了好几天&#xff0c;后来通过请教Google 动手实践&#xff0c;终于搞定了这个问题。现在把笔者解决的过程记录下来&#xff…

python的序列类型包括哪三类,Python常用的序列类型包括列表、元组和字典三种。...

表示M型&#xff0c;常用统中库管理系数据。边际位人的人消费每增增加加1均收均消倾向个单出数入所费支是指&#xff0c;列类边际消费民的年农倾向村居是(。的家品消庭食9年则2居民城镇出为费支&#xff0c;型包庭以3口镇家若城人计算。括列北省的份控股有及额为年国占河企业国…

LeetCode 545. 二叉树的边界(前序+后序)*

文章目录1. 题目2. 解题1. 题目 给定一棵二叉树&#xff0c;以逆时针顺序从根开始返回其边界。 边界按顺序包括左边界、叶子结点和右边界而不包括重复的结点。 (结点的值可能重复) 左边界的定义是从根到最左侧结点的路径。 右边界的定义是从根到最右侧结点的路径。 若根没有左…

centos 7 ssh 安装mysql,Linux服务器远程ssh为centos7安装MySQL

最近为客户选了个云服务器操作系统选择CentOS 7.0 64位通过ssh远程安装MySQL5.6&#xff0c;与大家分享安装过程ssh远程客户端选择的是xshell,感觉比较好用&#xff0c;可以直接通过绑定的xftp进行远程目录的上传下载操作通过xshell先连接远程服务器&#xff0c;指定服务器ip&a…

LeetCode 333. 最大 BST 子树(递归)*

文章目录1. 题目2. 解题1. 题目 给定一个二叉树&#xff0c;找到其中最大的二叉搜索树&#xff08;BST&#xff09;子树&#xff0c; 其中最大指的是子树节点数最多的。 注意: 子树必须包含其所有后代。 示例: 输入: [10,5,15,1,8,null,7]10 / \ 5 15 / \ \ 1 8 7 输…

LeetCode 663. 均匀树划分(树形DP)

文章目录1. 题目2. 解题1. 题目 给定一棵有 n 个结点的二叉树&#xff0c;你的任务是检查是否可以通过去掉树上的一条边将树分成两棵&#xff0c;且这两棵树结点之和相等。 样例 1: 输入: 5/ \10 10/ \2 3 输出: True 解释: 5/ 10和: 1510/ \2 3和: 15样例 2: 输入…

LeetCode 261. 以图判树(全部连通+边数=V-1)

文章目录1. 题目2. 解题1. 题目 给定从 0 到 n-1 标号的 n 个结点&#xff0c;和一个无向边列表&#xff08;每条边以结点对来表示&#xff09;&#xff0c; 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1&#xff1a; 输入: n 5, 边列表 edges …

php实现数字滚动效果,vue如何实现数字滚动增加效果?代码示例

项目中需要做数字滚动增加的效果&#xff0c;一开始很懵&#xff0c;研究了一下原理&#xff0c;发现很简单&#xff0c;贴出来分享一下 ^_^数字滚动组件&#xff1a;0props: {time: {type: Number,default: 2},value: {type: Number,default: 720000}},methods: {numberGrow (…