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. oracle中的decode的使用

    含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...

  2. dapper extensions (predicates)

    https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates The predicate system in Dapper Extensio ...

  3. dapper 自定义数据库字段和代码中Model字段不一致时候的mapping方法

    namespace YourNamespace { /// <summary> /// Uses the Name value of the ColumnAttribute specifi ...

  4. Spark小课堂Week2 Hello Streaming

    Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...

  5. Kakfa揭秘 Day9 KafkaReceiver源码解析

    Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...

  6. Js 处理将时间转换 “年-月-日”

    将时间  \/Date(1432828800000+0800)\/"  转换成:“年-月-日” //时间转换function ChangeDateFormat(val) {    if (v ...

  7. 【android-cocos2d-X iconv.h】在android下使用iconv

    (1) 下载文件 首先下载iconv文件  下载地址:http://download.csdn.net/detail/dingkun520wy/6703113 把解压后的iconv文件夹放到cocos ...

  8. jmeter测试本地myeclips调试状态下的tomcat程序死锁

    在myeclipse调试状态下的tomcat程序,用jmeter测试,居然发生死锁,调试两天无果,直接运行tomcat而不通过myeclipse,无死锁,真是又好气又好笑..

  9. ubuntu的vi

    ubuntu12.04的vi 1. 安装vim full版本由于Ubuntu预安装的是tiny版本,就会导致我们在使用上的产生不便.所以我们要安装vim的full版本.首先,先卸掉旧版的vi,输入以下 ...

  10. CentOS 报no acceptable C compiler found in $PATH的解决办法

    CentOS 6.2下安装tcpreplay工具的时候,先安装libpcap-1.3.0,configure libpcap时出错. #./configure 提示没有GCC编译器环境) config ...