remoting 在分布式应用中逐渐在企业级应用发展开来,最初提出分布式应用,主要目的是为了降低服务器的压力,将耗性能的处理放在另外一个程序中,然后将计算结果发送到另外一个应用中。而remoting就是提供了这个角色,本实例主要讲解服务器端订阅客户端,也就是客户端进行某操作,会及时告知服务器端。既然这样的话,事件订阅应该放在服务器端,行为放在客户端,通过行为触发服务器端事件。好了,大概的思路理清楚了,下面来主要讲解一下代码吧。

思路:客户端执行方法->服务器端事件被触发->公共实体类需要提供委托及执行方法才能让服务器端和客户端进行交互->如果让服务器端和客户端都能交互所以必须向上提炼出接口,接口包括委托和行为。

第一步:创建公共接口类库,命名为ICommon,代码如下:

namespace ICommon
{
public delegate void OnChangeHander(string msg); public interface IShare
{
void Say(string msg);
}
}

  第二步:创建实体类库,用于实现接口,命名为ServerBLL,代码如下:

namespace ServerBLL
{
public class CommonServerUse : MarshalByRefObject, IShare
{
public static event OnChangeHander OnChange; public void Say(string msg)
{
if (OnChange != null)
{
OnChange(msg);
}
}
}
}

  注意要添加MarshalByRefObject,主要目的是让通道技术数据传输

第三步:服务器端实现,创建服务器,开启事件监听,事件监听注意启用单例模式Sington,防止客户端调用的行为匹配不到服务器端的服务

代码如下:

namespace ConsoleServer
{
class Program
{
static void Main(string[] args)
{
HttpChannel chanel = new HttpChannel(8080);
ChannelServices.RegisterChannel(chanel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(CommonServerUse), "King", WellKnownObjectMode.Singleton);
CommonServerUse.OnChange += new OnChangeHander(CommonServerUse_OnChange);
Console.WriteLine("服务器已启动,等待客户端连接");
Console.ReadKey();
} static void CommonServerUse_OnChange(string msg)
{
Console.WriteLine("来自客户端消息:" + msg);
}
}
}

  好了,服务器端实体类(单例)创建好了,事件监听也绑定好饿,接下来就是客户端引用服务器端的单例实体类

第四部:引用服务器端的服务,生成实例:

代码如下:

namespace ConsoleClient
{
class Program
{
static void Main(string[] args)
{
HttpChannel channel = new HttpChannel(0);
ChannelServices.RegisterChannel(channel, false); IShare share = (IShare)Activator.GetObject(typeof(IShare),"http://localhost:8080/King");
Console.WriteLine("客户端已启动,输入exit退出客户端");
string console = Console.ReadLine(); while (console != "exit")
{
share.Say(console);
console = Console.ReadLine();
}
Console.ReadKey();
}
}
}

  好了,接下来看一下效果,先打开服务器端程序,然后打开多个客户端,效果如下:

源代码下载地址:ConsoleRemoting-服务器订阅客户端(服务器端收客户端消息)

net remoting 服务器端订阅客户端(附源代码)的更多相关文章

  1. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

  2. 【转】P2P之UDP穿透NAT的原理与实现(附源代码)

    作者:shootingstars (有容乃大,无欲则刚)  日期:2004-5-25 出处:P2P中国(PPcn.net) P2P 之 UDP穿透NAT的原理与实现(附源代码)原创:shootings ...

  3. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

  4. prisma 服务器端订阅试用

      graphql 协议是支持数据的实时订阅功能的(一般基于websocket 进行实现) prisma 支持客户端订阅以及服务器端订阅(类似webhook),可以方便将 数据推送后端服务 目的 pr ...

  5. TCP服务器端和客户端程序设计【转】

    本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...

  6. redis发布订阅客户端报错

    转自简书[https://www.jianshu.com/p/a85ec38245da] 最近遇到一个问题,springBoot程序中有一个监听器,监听redis中发来的消息(其实是监听一个key的消 ...

  7. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  8. 【知识积累】服务器端获取客户端的IP地址(当客户端调用由Axis开发的WebService)

    一.前言 由于项目中一个小的模块需要获取客户端的IP地址以保证安全调用webservice接口,项目中客户端使用C#编写,服务器端使用Java编写,服务器端与客户端采用Axis开发的WebServic ...

  9. 实现服务器端与客户端的高频实时通信 SignalR(2)

    说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) ...

随机推荐

  1. OSI与TCP/IP模型之比较

    摘要:OSI参考模型和Internet模型(或称TCP/IP模型)作为计算网络发展过程影响力大的两大模型,它们共同之处是:都采用了层次结构的概念,从分析两者的异同入手,找出OSI的消亡和Interne ...

  2. 【学习总结】整理一下int, NSInteger 等概念

    基本需要知道的 : unsigned : 没符号的 signed  : 有符号的 int : 整型 看看OC的定义 : #if __LP64__ || (TARGET_OS_EMBEDDED & ...

  3. Xcode常用设置

    1.设置主题和字体大小 2.设置显示代码行号

  4. ios实现截屏(转)

    -(UIImage*) makeImage {  UIGraphicsBeginImageContext(self.view.bounds.size);  [self.view.layer rende ...

  5. sentos 上安装vnc图形界面

    一.安装gnome图形化桌面   CentOS 6.3 64位 #yum groupinstall -y "X Window System" #yum groupinstall - ...

  6. css3实现非矩形图片效果

    经常在网站上看到有一些非矩形的图片展示.在以前可能我会毫不犹豫的直接放上张处理好的图片.但是这样的话确实有些不太友好.每每需要换图的时候,都要去开图像处理软件也是蛮拼的.自从有了css3的选装,妈妈就 ...

  7. 设置Cookie

    var Site=new Object(); Site.Cookie={ _expires:24*3600*1000, _domain:'.gdxxb.com', set:function(name, ...

  8. Scala中的Extractor

    Scala中使用unapply方法可以实现三种extractor(另外使用unapplySeq也可以实现extractor) def unapply(object: S): Option[(T1, . ...

  9. 深入浅出 ES6:ES6 与 Babel / Broccoli 的联用

    深入浅出 ES6指的是添加在 ECMASript 标准第六版中的 JavaScript 编程语言的新特性,简称为 ES6. 虽然 ES6 刚刚到来,但是人们已经开始谈论 ES7 了,它未来的样子,以及 ...

  10. Python的作用域

    Python的作用域 转自:http://www.cnblogs.com/frydsh/archive/2012/08/12/2602100.html Python是静态作用域语言,尽管它自身是一个动 ...