Remoting and MSMQ 结合做的一个DEMO

真的非常感谢CnBlogs.com,因为有很多教程里写的知识点并不全面,而且也没附带例子.通过这里我学习到了很多很多.希望网站能越办越好哦.
下面是我学习分布式开发时写的一个小demo,当然功能有限,技术也很低.希望大师们能拍拍砖,不吝赐教.呵呵
软件运行的一个截图
下面说说流程吧,
1:利用public static object CreateInstance(Type type, object[] args, object[] activationAttributes);方法创建一个类(并激活自定义的构造函数)
2:利用MSMQ异步接收事件参数来触发remoting的事件
大约就是这样的里程,不过看上去蛮简单的,可里面用到很多MSMQ和remoting事件的知识点哦..下面是一段在remoting里面调用的dll原代码
ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging; //此空间必须引用Mssaging空间才能访问哦
namespace MyRemotingAndMsmq
{
    
/*
     *关于Remoting和MSMQ系列的文章博客园里有很多
     *而且介绍的又很全面,在此我也就不具体的讲解了。
     *在此篇博客里我主要是针对Remoting和MSMQ结合的一些问题做个demo.
     *并在重点处做个标记,本文并不全文注释,如有任何疑问请发表看法,
     *欢迎大家互相学习,切磋。
     *此程序具体流程很简单,如下解释
     *一:利用一个Class定义个串行化类,并传给Remoting,Remoting接收MSMQ
     * 里的参数,并在客户端用Remoting事件触发来接收内容。其实真实过程中
     * 并不需要这么多的流程,只是本文是用来阐述这两种方法结合使用的例子,所以
     * 很多此一举,呵呵。。。。
    
*/
    
public class MyContext : MarshalByRefObject  //此类用来虚拟实例化事件参数类的类
    {
        
private string name = null;
        
private string address = null;
        
private string message = null;
        
public MyContext(string name, string address, string message) //此构造函数将用客户端激活模式来激活
        {
            
this.name = name;
            
this.address = address;
            
this.message = message;
        }
        
public string Name
        {
            
get { return name; }
            
set { name = value; }
        }
        
public string Address
        {
            
get { return address; }
            
set { address = value; }
        }
        
public string Message
        {
            
get { return message; }
            
set { message = value; }
        }
    }

    [Serializable]  
//此类是用来
    public class MyEvent:EventArgs
    {
        
private string name = null;
        
private string address = null;
        
private string message = null;
        
public MyEvent(string name, string address, string message) //此构造函数将用客户端激活模式来激活
        {
            
this.name = name;
            
this.address = address;
            
this.message = message;
        }
        
public string Name
        {
            
get { return name; }
            
set { name = value; }
        }
        
public string Address
        {
            
get { return address; }
            
set { address = value; }
        }
        
public string Message
        {
            
get { return message; }
            
set { message = value; }
        }
    }


    
public class MyMsmq : MarshalByRefObject  //因为需要传动MyMsmq类,所以需要编组
    {
        
public string context ="触发事件";  //因为此字段需要在类外部访问,所以需要定义public级别
        string name = @".\private$\my";
        MessageQueue mm 
= null;
        
public MyContext mycontext = null;
        
public void Shu()
        {
            
if (MessageQueue.Exists(name))
            {
                mm 
= new MessageQueue(name);
            }
            
else
            {
                mm 
= MessageQueue.Create(name);
            }
            context 
= mycontext.Name + "," + mycontext.Address + "," + mycontext.Message;
            System.Messaging.Message m 
= new System.Messaging.Message();
            m.Label 
= "异步消息发送";
            m.Body
=context;
            mm.Send(m);
            mm.ReceiveCompleted 
+= new ReceiveCompletedEventHandler(mm_ReceiveCompleted); //定义异步接收的事件
            mm.BeginReceive();
        }

        
void mm_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            MessageQueue mq 
= (MessageQueue)sender;
            System.Messaging.Message m 
= mq.EndReceive(e.AsyncResult);
            m.Formatter 
= new XmlMessageFormatter(new Type[] { typeof(string) });
            context 
= m.Body.ToString();//改变context
            mq.BeginReceive();//接收下一次事件 
        }
    }

    
public class MyRemoting : MarshalByRefObject
    {
        
public string context;
        
string[] contexts;
        
public delegate void MyDeledate(object sender, MyEvent e);
        
public event MyDeledate MyHandle;
        MyEvent e 
= null;
        
public MyMsmq mm = null;
        
public void Shu()
        {
            
if ((mm.context != "触发事件"))  //这里代表MSMQ异步接收事件成功
            {
                contexts 
= mm.context.Split(new char[]{ ','});
                
if (contexts.Length < 2 && contexts.Length > 0)
                {
                    e 
= new MyEvent(contexts[0].ToString(), contexts[1].ToString(), "自定义参数");
                    MyHandle(
this, e);
                }
                
if (contexts.Length > 1)
                {
                    e 
= new MyEvent(contexts[0].ToString(), contexts[1].ToString(), contexts[2].ToString());
                    MyHandle(
this, e);
                }
                
            }
        }
    }
}
服务器端需要创建3个远程对象,typeof(MyContext),typeof(MyMsmq),typeof(MyRemoting).代码如下
ContractedBlock.gifExpandedBlockStart.gifCode
    private void Form1_Load(object sender, EventArgs e)
        {
            RemotingConfiguration.ApplicationName 
= "remotingandmsmq"//客户激活模式需要的URI需要在此定义
            BinaryServerFormatterSinkProvider bk = new BinaryServerFormatterSinkProvider();
            BinaryClientFormatterSinkProvider ck 
= new BinaryClientFormatterSinkProvider();
            bk.TypeFilterLevel 
= TypeFilterLevel.Full;
            Dictionary
<stringstring> wo = new Dictionary<stringstring>();
            wo[
"port"= "8086";
            TcpChannel tcp 
= new TcpChannel(wo, ck, bk);//因为TcpServerChannl不支持安全性,所以用TcpChannel
            ChannelServices.RegisterChannel(tcp);
            RemotingConfiguration.RegisterActivatedServiceType(
typeof(MyContext));
            RemotingConfiguration.RegisterActivatedServiceType(
typeof(MyMsmq));
            RemotingConfiguration.RegisterActivatedServiceType(
typeof(MyRemoting));
        }
原代码下载这只是一个空的winform服务器,目的是在等待客户端调用.
客户端调用如下
ContractedBlock.gifExpandedBlockStart.gifCode
   private void button1_Click(object sender, EventArgs e)
        {
            
//RemotingConfiguration.RegisterActivatedClientType(typeof(MyContext), "tcp://localhost:8086/remotingandmsmq");
            object[] obj =new UrlAttribute("tcp://localhost:8086/remotingandmsmq") };
            
object[] objs = new object[3];
            objs[
0= "小徐";
            objs[
1= "扬州";
            objs[
2= "能不能触发了";
            MyContext mm 
= (MyContext)Activator.CreateInstance(typeof(MyContext), objs, obj);
            
//以上利用public static object CreateInstance(Type type, object[] args, object[] activationAttributes);
            
//来完成类MyContext的构造函数
            RemotingConfiguration.RegisterActivatedClientType(typeof(MyMsmq), "tcp://localhost:8086/remotingandmsmq");
            MyMsmq my 
= new MyMsmq();
            my.mycontext 
= mm;
            my.Shu();
            RemotingConfiguration.RegisterActivatedClientType(
typeof(MyRemoting), "tcp://localhost:8086/remotingandmsmq");
            MyRemoting mym 
= new MyRemoting();
            mym.mm 
= my;
            
//MessageBox.Show(mym.mm.context.ToString());
            ClassLibrary1.Class1 c = new ClassLibrary1.Class1();
            mym.MyHandle 
+= new MyRemoting.MyDeledate(c.StatusHandler);
            mym.Shu();
        }

        
void mym_MyHandle(object sender, MyEvent e)
        {
            
throw new Exception("The method or operation is not implemented.");
        }

        
private void Form1_Load(object sender, EventArgs e)
        {
            BinaryServerFormatterSinkProvider serverProvider 
= new BinaryServerFormatterSinkProvider();
            BinaryClientFormatterSinkProvider clientProvider 
= new BinaryClientFormatterSinkProvider();
            serverProvider.TypeFilterLevel 
= TypeFilterLevel.Full;
            Dictionary
<stringstring> wo = new Dictionary<stringstring>();
            wo[
"port"= "0";
            TcpChannel channel 
= new TcpChannel(wo, clientProvider, serverProvider);
            ChannelServices.RegisterChannel(channel);
        }
网站里关于这两个话题的博客很多,在这里我就不多加解释了,网友们自行查阅资料.重点地方我都做下注释了......

转载于:https://www.cnblogs.com/xuting/archive/2009/07/27/1532069.html

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

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

相关文章

再聊一次值类型和引用类型

C#值类型&#xff0c;作为函数形参&#xff0c;形参被修改&#xff0c;不影响原值。这是我们在初始学习编程时需要记住的内容&#xff0c;我们也是一直这样践行的。先说结论&#xff1a;这是不准确的。为什么提出这样看似很浅显的问题&#xff0c;是因为有次我在使用ArraySegme…

java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...

jclasslib是款免费的开源java字节码的查看工具&#xff1b;它支持进行查看您需要进行使用汉字运用到的Java字节码&#xff0c;并且还拥有一个的类库来让开发者进行读取&#xff0c;包括了修改、对JavaClass文件、字节码的写入等&#xff1b;用户这进行使用的过程中&#xff0c;…

ado filter 多条记录_注意!武汉江南中心绿道武九线综合管廊工程开工,青山区多条道路通行规则有变...

楚天都市报10月29日(记者吴昌华 通讯员 李佳 陈菲)今日记者从武汉交管部门获悉&#xff0c;本周六&#xff0c;10月31日&#xff0c;武汉市江南中心绿道武九线综合管廊工程开始施工&#xff0c;青山区多条道路通行规则有变&#xff0c;部分道路禁止通行。交管部门提供详细绕行建…

深度学习框架再次升级,它们都有什么优点?

全世界只有3.14 % 的人关注了爆炸吧知识经过几年的发展&#xff0c;深度学习方法摧枯拉朽般地超越了传统方法&#xff0c;成为人工智能领域最热门的技术。之后&#xff0c;谷歌、亚马逊、百度、Facebook 纷纷开源了自己的深度学习框架。而支撑AlphaGo的核心技术架构--TensorFlo…

SQL Server 2005的安装,SQL Server 2005系列之一

最近复习SQL Server 2005,忽然有了写系列的打算&#xff0c;也不知道能不能写好&#xff0c;今天先写一篇关于SQL Server 2005的安装的博文吧。和往常一样&#xff0c;我们先来看看SQL Server 2005到底是个什么东西&#xff1f;SQL Server 2005是一种以高性能、高可靠性和可用性…

Quartz - 作业调度框架-插件化开发

背景大部分业务都是基于定时的任务&#xff0c;特别适合使用quartz这类框架解决定时问题。具体quartz的使用&#xff0c;看官方文档就可以了。下面谈谈对quartz插件化的封装。我们使用quartz.plugin。然后在quartz_jobs.xml方法里面定义了schedule&#xff0c;其中灵活的地方在…

cgi备份还原和ghost有什么区别_手动GHOST还原重装系统详细教程

一键重装虽好&#xff0c;但也不是万能的。俗语说&#xff1a;治标不治本。也许你懂得用各种一键备份还原工具重装&#xff0c;但不一定懂得手动GHOST重装。为此&#xff0c;吻妻为大家分享一下如何手动GHOST还原重装系统&#xff0c;本教程步骤虽多&#xff0c;但很多都是点“…

图解一步步安装SharePoint Foundation 2010

图解一步步安装SharePoint Foundation 2010 下载后在Windows Server 2008 R2上进行安装安装产品必须的一些组件&#xff0c;比原来好多了不用自己一个个下了。同意许可&#xff0c;此产品为不收费版本&#xff0c;不用序列号了&#xff01;&#xff01;&#xff01;安装相关的…

MYSQ 查看 2 进制日志

方法 1&#xff1a; myqlbinlog filename; -----------------------------------------------------------------------------------------------------------------------------------------------

当身为老师的爸爸上课时......​

1 当身为老师的爸爸上课时......▼2 气氛突然微妙......▼3 隔壁的一家人都馋哭了&#xff01;▼4 结束疫情隔离的你▼5 WOW!AMAZING!▼6 女孩子喜欢帅哥是不分年龄的▼‍‍7 单身狗又做错了什么呢&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

amos里CFA可行性辨别结果怎么看_论文用问卷调查法,数据分析怎么做?

论文问卷数据的分析&#xff0c;看起来简单&#xff0c;好像每个人都会做。但是做起来还真的有点难度。很多初次使用问卷调查方法的人大多以为&#xff0c;问卷数据分析嘛&#xff0c;无外乎对单选题做做频率分析&#xff0c;看看选择不同的选项的人占比有多少。对于评分题目&a…

Hello Blazor:(10)按需加载JavaScript脚本

前言Blazor支持执行JavaScript脚本&#xff0c;通常是将脚本放在wwwroot/index.html(Blazor WebAssembly)或Pages/_Host.cshtml(Blazor Server)中。但是&#xff0c;这种方式会将所有JS方法用全局函数加载&#xff0c;即使某些方法只需要在特定组件中使用。既影响加载性能&…

只有学霸才懂的学习技巧,看完脑洞大开,绝对涨姿势!

▲ 点击查看法国生物学家乔治.居维叶曾说&#xff1a;“天才&#xff0c;首先是注意力。”事实上&#xff0c;除开那些逆天的天才之外&#xff0c;大部分人的智商&#xff0c;在先天因素的决定下&#xff0c;都是差不多的。但是专注力却可以因为后天的刻意训练&#xff0c;而有…

解析邻居的耳朵音乐地址(单页下载)

偶尔听歌的时候发现了一个很小众的音乐分享网站&#xff0c;邻居的耳朵&#xff0c;有个人的电台类型&#xff0c;属于音乐分享文字分享&#xff0c;觉得很不错。从域名来看&#xff0c;属于多米旗下的网站&#xff1a;http://ear.duomi.com/ 看来多米收购了很多这样的小站&am…

为什么电脑不能打字_嘉兴在线丨「生活经济学」为什么笔记本电脑能在任何国家的供电标准下运作,其他大部分电器却不能?...

【生活热搜】从日本背回来的电饭煲煮饭口感总是不对&#xff0c;用几天就坏了&#xff1b;英国邮回来的吹风机怎么都插不上电源只能闲置……如果你有从国外买家用电器的经历&#xff0c;你一定会发现很多电器因为每个国家或地区的供电标准不同而无法正常使用的情况。但笔记本电…

【DotNetMLLearn】.NET Core 人工智能系列-.NET Interactive环境介绍

在进入.NET Core 的人工智能应用开始前&#xff0c;我们先把环境搭建好&#xff0c;为以后的学习提供一个便利。作为一个.NET 程序员&#xff0c;或者其他编程语言的程序员&#xff0c;相信对IDE的依赖必不可少&#xff0c;如Visual Studio/Visual StudioCode , IntelliJ , Ecl…

php curl https 443,PHP CURL支持HTTP、HTTPS 请求亲测可用

废话就不多说 直接上代码&#xff0c;亲测好用原生&#xff1a;/*** curl发送htpp请求* 可以发送https,http,get方式,post方式,post数据发送*/public function dataRequest($url,$httpstrue,$methodget,$datanull){//初始化curl$ch curl_init($url);//字符串不直接输出&#x…

2020届的毕业生怎么这么苦!

一提到毕业论文我们身上的每个细胞都在告诉自己这件事太麻烦了&#xff01;每天要思考着选题、开题报告、查资料写稿、排版、答辩、做PPT......除了8000到20000的字数要求完成一篇毕业论文&#xff0c;要依次经历确定论文选题&#xff0c;提交开题报告查阅行业文献&#xff0c;…

RMSE均方根误差学习笔记

1.均方根误差&#xff0c;它是观测值与真值偏差的平方和观测次数n比值的平方根&#xff0c;在实际测量中&#xff0c;观测次数n总是有限的&#xff0c;真值只能用最可信赖&#xff08;最佳&#xff09;值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感&#xff0c;所…

java小数强制转换,Java中的强制类型转换 大数转小数

首先要明确一下转换规则&#xff1a;大数转小数&#xff0c;多出的高位部分会被截断。比如 int 占 4个byte(32 bit), byte占 1个byte(8bit), 那int 转 byte &#xff0c;int 高位多出的那24个bit会被截断。例1:int b 233; // 正整数强转System.out.println((byte)b);// 原码&a…