关于Romoting又一例
--------------------
本文主要描述了Romoting的远程对象定义,以及工厂模式的用法,
事件的相关知识,
为了安全,可分三个组件,BLLObject.dll共用接口组件,BLLService.dll(exe)服务器组件商务逻辑实现代码
BLLClient.dll客户端引用的且只定义不实现的与服务器组件相同命名空间和类名的组件库,
废话少说,请看代码:
FaxService.cs
-------------------------------------------------
/// <summary>
/// 功能:传真服务(即客户端向服务端发传真信息)
/// vp:hsg
/// create date:2011-09-29
/// version:1.0
/// </summary>
public class FaxService : MarshalByRefObject,IRegisterSelf, IFaxService
{
private static List<string> FaxList = new List<string>();
public static event FaxEventHandler FaxSendedEvent=null;
public FaxService()
{
init();
}
public override object InitializeLifetimeService()
{
return null;
}
public static void init()
{
FaxService.FaxSendedEvent += new FaxEventHandler(FaxService_FaxSendedEvent);
}
public static void Close()
{
FaxService.FaxSendedEvent -= new FaxEventHandler(FaxService_FaxSendedEvent);
FaxList.Clear();
}
private static void FaxService_FaxSendedEvent(string fax)
{
FaxList.Add(fax);
errorlog.WriteLine("ServiceIn_fax=" + fax);
}
#region IFaxService 成员
public void SendFax(string fax)
{
if (FaxSendedEvent != null)
{
FaxSendedEvent(fax);
}
}
#endregion
#region IRegisterSelf 成员
public void RegisterSelf()
{
RemotingConfiguration.RegisterWellKnownServiceType(typeof(FaxService), "FaxService",
WellKnownObjectMode.Singleton);
}
#endregion
//
}
BroadCastService.cs文件内容如下:
----------------------------------------------------------------------------------------------
public class BroadCastService : MarshalByRefObject, IRegisterSelf, IBroadCastService
{
public BroadCastService()
{
}
public override object InitializeLifetimeService()
{
return null;
}
#region IRegisterSelf 成员
public void RegisterSelf()
{
RemotingConfiguration.RegisterWellKnownServiceType(typeof(BroadCastService), "BroadCastService",
WellKnownObjectMode.Singleton);
}
#endregion
#region IBroadCastService 成员
public event BroadCastEventHandler BroadCastEvent=null;
public void BroadCastingInfo(string info)
{
//errorlog.WriteLine("BroadCastService.cs/36="+info);
if (BroadCastEvent != null)
{
//BroadCastEvent(info);
BroadCastEventHandler tempEvent = null;
int index = 1; //记录事件订阅者委托的索引,为方便标识,从1开始。
foreach (Delegate del in BroadCastEvent.GetInvocationList())
{
try
{
tempEvent = (BroadCastEventHandler)del;
if (tempEvent != null)
{
tempEvent(info);
}
}
catch (Exception ee)
{
//errorlog.WriteLine("执行BroadCast:BroadCastingInfo(string info):" + ee.ToString());
//MessageBox.Show("事件订阅者" + index.ToString() + "发生错误,系统将取消事件订阅!");
BroadCastEvent -= tempEvent;
}
index++;
}
}
else
{
//errorlog.WriteLine("BroadCast事件为空!");
}
//
}
#endregion
}
BFFactory.cs类的定义
-----------------------------------------------------------
/// <summary>
/// 功能:BF 工厂类
/// vp:hsg
/// create date:2011-09-29
/// version:1.0
/// </summary>
public class BFFactory : MarshalByRefObject, IRegisterSelf, IBFFactory,IDisposable
{
public BFFactory()
{
}
//生命周期为无限
public override object InitializeLifetimeService()
{
//return base.InitializeLifetimeService();
return null;
}
#region IRegisterSelf 成员
public void RegisterSelf()
{
RemotingConfiguration.RegisterWellKnownServiceType(typeof(BFFactory), "BFFactory",
WellKnownObjectMode.Singleton);
}
#endregion
#region IDisposable 成员
public void Dispose()
{
if (m_IBaseService != null)
{
m_IBaseService = null;
}
if (m_IDatabaseService != null)
{
m_IDatabaseService.Dispose();
m_IDatabaseService = null;
}
if (m_FaxService != null)
{
FaxService.FaxSendedEvent -= new FaxEventHandler(FaxService_FaxSendedEvent);
FaxService.Close();
m_FaxService = null;
}
if (m_BroadCastService != null)
{
RemotingServices.Disconnect(m_BroadCastService as MarshalByRefObject);
m_BroadCastService = null;
}
}
#endregion
#region IBFFactory 成员
private IBaseService m_IBaseService = null;
public IBaseService GetBaseService()
{
if (m_IBaseService == null)
{
m_IBaseService = new BaseService();
(m_IBaseService as IRegisterSelf).RegisterSelf();
}
return m_IBaseService;
}
private IDatabaseService m_IDatabaseService = null;
public IDatabaseService GetDatabaseService()
{
if (m_IDatabaseService == null)
{
m_IDatabaseService = new DatabaseService();
(m_IDatabaseService as IRegisterSelf).RegisterSelf();
}
return m_IDatabaseService;
}
private IFaxService m_FaxService = null;
public IFaxService GetFaxService()
{
if (m_FaxService == null)
{
m_FaxService= new FaxService();
(m_FaxService as IRegisterSelf).RegisterSelf();
FaxService.FaxSendedEvent -= new FaxEventHandler(FaxService_FaxSendedEvent);
FaxService.FaxSendedEvent += new FaxEventHandler(FaxService_FaxSendedEvent);
}
return m_FaxService;
}
private void FaxService_FaxSendedEvent(string fax)
{
//errorlog.WriteLine("ServiceFactory_fax=" + fax);
//接收到传真后,从服务器端发广播
IBroadCastService bcs = GetBroadCastService();
bcs.BroadCastingInfo(fax);
}
private BroadCastService m_BroadCastService = null;
private ObjRef m_bcsRef = null;
public IBroadCastService GetBroadCastService()
{
//errorlog.WriteLine("BC_1");
if (m_BroadCastService == null)
{
//errorlog.WriteLine("BC_2");
m_BroadCastService = new BroadCastService();
//(m_BroadCastService as IRegisterSelf).RegisterSelf();
m_bcsRef = RemotingServices.Marshal(m_BroadCastService, "BroadCastService");
}
//errorlog.WriteLine("BC_3");
return m_BroadCastService;
}
#endregion
//
}
//服务器端初始化方法
---------------------------------------------------------
app.config
<configuration>
<appSettings>
<add key="tcpport" value="9999"/>
<add key="httpport" value="8888"/>
</appSettings>
</configuration>
------------------------------------------------------
public void init()
{
try
{
//default=9999
string tcpport_str = ConfigurationManager.AppSettings["tcpport"];
int tcpport = int.Parse(tcpport_str);
//default=8888
string httpport_str = ConfigurationManager.AppSettings["httpport"];
int httpport = int.Parse(httpport_str);
远程对象并自注册
//baseService = new BaseService();
//baseService.RegisterSelf();
//dbService = new DatabaseService();
//dbService.RegisterSelf();
//远程对象并自注册
BFFact = new BFFactory();
BFFact.RegisterSelf();
//
//initOneTcpChannel(tcpport);
initMuliChanel(tcpport, httpport);
}
catch (Exception ee)
{
errorlog.WriteLine(ee.ToString());
}
}
//关闭服务功能
public void CloseService()
{
try
{
//if (baseService != null)
//{
// baseService = null;
//}
//if (dbService != null)
//{
// dbService.Dispose();
// dbService = null;
//}
if (BFFact != null)
{
BFFact.Dispose();
BFFact = null;
}
if (tcpchannel != null)
{
ChannelServices.UnregisterChannel(tcpchannel);
tcpchannel = null;
}
if (httpchannel != null)
{
ChannelServices.UnregisterChannel(httpchannel);
httpchannel = null;
}
}
catch (Exception ee)
{
errorlog.WriteLine(ee.ToString());
}
}
//注册一个Tcp通道方法
public void initOneTcpChannel(int port)
{
//注册Tcp通道
tcpchannel = new TcpChannel(port);
ChannelServices.RegisterChannel(tcpchannel, false);
}
//注册多通道方法
public void initMuliChanel(int tcpPort,int httpPort)
{
//注册Tcp通道 9999
IDictionary tcpProp = new Hashtable();
tcpProp["name"] = "tcp" + tcpPort;
tcpProp["port"] = tcpPort;
IClientChannelSinkProvider ccsp=new BinaryClientFormatterSinkProvider();
BinaryServerFormatterSinkProvider scsp = new BinaryServerFormatterSinkProvider();
scsp.TypeFilterLevel = TypeFilterLevel.Full;
tcpchannel = new TcpChannel(tcpProp, ccsp, scsp);
ChannelServices.RegisterChannel(tcpchannel,false);
//注册Http通道 8888
IDictionary httpProp = new Hashtable();
httpProp["name"] = "http" + httpPort;
httpProp["port"] = httpPort;
IClientChannelSinkProvider ccsp_soap=new SoapClientFormatterSinkProvider();
SoapServerFormatterSinkProvider scsp_soap = new SoapServerFormatterSinkProvider();
scsp_soap.TypeFilterLevel = TypeFilterLevel.Full;
httpchannel = new HttpChannel(httpProp, ccsp_soap, scsp_soap);
ChannelServices.RegisterChannel(httpchannel,false);
}
客户端实始化代码
-------------------------------------------------------------------------------------------------
<configuration>
<appSettings>
<add key ="BFFactoryUrl" value ="tcp://192.168.1.249:9999/BFFactory"/>
<!--
<add key ="BFFactoryUrl" value ="http://192.168.1.249:8888/BFFactory"/>
-->
</appSettings>
</configuration>
------------------------------------------------------------------
//RemoteService方法
private IBFFactory m_BFFactory = null;
public IBFFactory BFFactory
{
get
{
if (m_BFFactory == null)
{
string BFFactoryUrl = ConfigurationManager.AppSettings["BFFactoryUrl"];
m_BFFactory = (IBFFactory)Activator.GetObject(typeof(IBFFactory), BFFactoryUrl);
}
return m_BFFactory;
}
}
private IBaseService m_BaseService = null;
public IBaseService BaseService
{
get
{
if (m_BaseService == null)
{
m_BaseService = BFFactory.GetBaseService();
}
return m_BaseService;
}
}
private IDatabaseService m_DatabaseService = null;
public IDatabaseService DatabaseService
{
get
{
if (m_DatabaseService == null)
{
m_DatabaseService = BFFactory.GetDatabaseService();
}
return m_DatabaseService;
}
}
private IBroadCastService m_BroadCastService = null;
public IBroadCastService BroadCastService
{
get
{
if (m_BroadCastService == null)
{
m_BroadCastService = BFFactory.GetBroadCastService();
}
return m_BroadCastService;
}
}
private EventWrapper wrapper = null;
public void initBroadCastService()
{ //初始化广播服务
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["name"] = "tcp0";
props["port"] = 0;
HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel,false);
wrapper = new EventWrapper();
wrapper.RegisterSelf();
wrapper.LocalBroadCastEvent += new BroadCastEventHandler(BroadCastService_BroadCastEvent);
BroadCastService.BroadCastEvent += new BroadCastEventHandler(wrapper.BroadCasting);
//
}
public void CloseBroadCastService()
{
if (wrapper != null)
{
wrapper.LocalBroadCastEvent -= new BroadCastEventHandler(BroadCastService_BroadCastEvent);
BroadCastService.BroadCastEvent -= new BroadCastEventHandler(wrapper.BroadCasting);
}
}
private void BroadCastService_BroadCastEvent(string info)
{
try
{
MessageBox.Show(info, "提示");
}
catch (Exception ee)
{
MessageBox.Show(ee.Message, "提示");
}
}
-----------------------
--the end----
转载于:https://www.cnblogs.com/sqlite3/archive/2011/09/30/2566815.html
关于Romoting又一例相关推荐
- 一个小兔子的大数据见解2
Big Data 阿里的大数据解决方案 MAXCOMPUTE DATAWORKS QUICKBI 1.Vmware增强 2. 1.1.VMware 虚拟网络设备 1.1.1.虚拟网卡.虚拟交换机 虚拟 ...
- 《Java150道面试题全集》
本文转载他人,自留作笔记用,请尊重原创作者. 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两 ...
- YOLOv4 资源环境配置和测试样例效果
YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...
- 2021年大数据常用语言Scala(三十二):scala高级用法 样例类
目录 样例类 定义样例类 样例类方法 样例对象 样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例 ...
- 2021年大数据常用语言Scala(二十九):scala面向对象 单例对象
目录 单例对象 定义object - 掌握 伴生对象 - 掌握 apply方法 - 掌握 main方法 单例对象 Scala中没有static关键字,但是它支持静态 如果要定义静态的东西,统统定义到o ...
- Android/Java 单例使用总结
学而时习之,温故而知新. 什么是单例? 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3. ...
- 在Ubuntu下构建Bullet以及执行Bullet的样例程序
在Ubuntu下构建Bullet以及执行Bullet的样例程序 1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2 ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
最新文章
- spring入门(二) 使用注解代替xml配置
- oracle设置大表空间,Oracle怎样设置表空间数据文件大小
- 目标检测 - Tensorflow Object Detection API
- 关于Android加载的优化
- C# using的用法
- jq定制上传按钮,选择文件就上传
- 「后端小伙伴来学前端了」分析Vue脚手架结构
- day23 01 类的命名空间
- 有趣,机器人吵架视频!
- nodejs原始连接mysql
- 使用Span T 提高C#代码的性能
- cad常青藤插件_CAD 2020软件安装包+插件大合集+完整视频教程,自学也可以的
- 米莱狄机器人怎么那么多_王者荣耀米莱狄攻略,团战技能好了就丢,操作最简单上分法师...
- 开机进入boot menu和application menu,无法开机
- 初入职场,你够聪明不?
- 感应(异步)电机磁场定向控制速度环PI控制参数设计
- SIGIR'22 | 阿里 ESCM^2: 升级版全空间多任务转化率预估
- 性能测试之线上引流测试--让性能测试更真实更丰富
- 乐天行动派2018年度公益盛典成功举办 公益大脑掀起创变未来风暴
- SIL9687读数据手册零碎笔记
热门文章
- 计算机主机名在哪里看win7,大师教您win7系统查看win7系统电脑主机名的图文步骤...
- 剪枝综述论文阅读:Methods for Pruning Deep Neural Networks
- 从零开始刷Leetcode——动态规划(70.198.303)
- 开源中文关系抽取框架,来自浙大知识引擎实验室
- 基于40万表格数据集TableBank,用MaskRCNN做表格检测
- 热流体动压润滑matlab_设备润滑知识点(下午见)
- pytorch梯度累积
- python框架实例,从零构建一个简单的 Python 框架
- python高手养成_Python用PyQt5制作颜色对话框,PyQt图形界面编程之QColorDialog
- python字符串添加元素_python向字符串中添加元素的实例方法