前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NanoMsg框架|C#中Nanomsg的PAIR和BUS使用

NanoMsg框架|C#中Nanomsg的PAIR和BUS使用

作者头像
Vaccae
发布2020-02-25 15:07:27
2.9K10
发布2020-02-25 15:07:27
举报
文章被收录于专栏:微卡智享微卡智享

NanoMsg框架

C#中使用NanoMsg非常简单,在Nuget中已经有封装好的组件了,我们使用的就是Nuget中的NNanoMsg这个包,这篇中主要是创建了第一个NanoMsg的程序,然后使用前篇我们介绍的PAIR和BUS模式。

创建NanoMsg程序

微卡智享

要实现NanoMsg通讯,我们需要用到两个程序,一个服务端,一个客户端,所以我们用VS新建一个项目,创建了两个窗体应用程序分别起名为nanomsgserver和nanomsgclient

界面中我们加入了选择的协议类型的comobox组件,然后加了三个button和一个TextBox的显示,在客户端多加入一个TextBox可以输入我们要发送的文字,如下图:

Server端

Client端

NuGet中添加NNanoMsg

在NuGet中我们加入NNanoMsg的组件,分别在Server端和Client端都增加上

我的这个在已安装中,我们重新安装在浏览中输入Nanomsg中可以看到NNanoMsg,下载0.5.2版本即可。

安装完后在引用中会出来nnanomsg的组件,并且会多了两个文件夹x86和x64,分别的Window和Linux系统中32位和64位的nanomsg的动态库。

经过上面的步骤,NanoMsg就已经安装完成了。接下来我们就看看PAIR的模式和BUS模式。

PAIR协议

微卡智享

PAIR就是简单的一对一模式,也就是端对端双向通信模式。所以在通讯中如果要接收,它可以不会超时,一直在等待。

先说一下,这里面我用了Lazy<T>的模式定义的,关于Lazy这里简单说一下,.NET 4.0中加入了lazy<T>(懒对象),其实叫懒对象感觉不对,更应该叫延迟对象加载。正如我们所知。对象的加载是需要消耗时间的,特别是对于大对象来说消耗的时间更多.lazy可以实现对象的延迟加载。

Server端代码

代码语言:javascript
复制
        /// <summary>
        /// Pair连接
        /// </summary>
        private void PairSocketSrvConnect()
        {
            try
            {
                pairSocket = new Lazy<PairSocket>(() => new PairSocket());
                pairSocket.Value.Bind("tcp://*:8001");

                new Task(() =>
                {
                    while (pairSocket.IsValueCreated)
                    {
                        Thread.Sleep(1000);
                        //接收数据
                        byte[] buffer = pairSocket.Value.Receive();
                        string recvstr = Encoding.UTF8.GetString(buffer);
                        TextShow(recvstr);

                        //发送数据
                        string sendstr = "PAIR模式收到消息:" + recvstr + "。现在是返回的消息!";
                        pairSocket.Value.Send(Encoding.UTF8.GetBytes(sendstr));
                        TextShow(sendstr);
                    }
                }).Start();
            }
            catch (Exception ex)
            {
                TextShow(ex.Message);
            }
        }

Client端代码

代码语言:javascript
复制
  pairSocket = new Lazy<PairSocket>(() => new PairSocket());
  pairSocket.Value.Connect("tcp://localhost:8001");
  if (pairSocket.IsValueCreated)
  {
      //发送数据
      pairSocket.Value.Send(Encoding.UTF8.GetBytes(inputstr));

      //接收数据
      byte[] buffer = pairSocket.Value.Receive();
      TextShow(Encoding.UTF8.GetString(buffer));
}

Bus协议

微卡智享

BUS消息总线模式。一个消息总线上可以有多个套接字,每个套接字即是服务端可以启动监听,也是客户端可以同时连接多个其他的套接字。连接到消息总线的任何一个套接字发送消息,消息总线上的其他套接字都能收到,一个套接字发出的消息,其他套接字有可能重复的接收到多次(这个就好比街头听到的小道消息,可能由不同的人告诉你)。但是套接字永远不会收到自己发的消息。

上面这个情况,就好比我们关注了几个互推的公众号,有一篇不错的文章这几个公众号中相互转发,因为不你这几个都关注了,所以同一篇文章你会收到了多次。在做DEMO中就发现客户端和服务端中通讯,经常会发送一条,接收到了两个,所以来说这个模式使用的场景应该非常少,只是简单介绍一下好了。

Server端代码

代码语言:javascript
复制
        /// <summary>
        /// BUS连接
        /// </summary>
        private void BusSocketSrvConnect()
        {
            try
            {
                busSocket = new Lazy<BusSocket>(() => new BusSocket());
                busSocket.Value.Bind("ipc://server");
                busSocket.Value.Connect("ipc://client");
                new Task(() =>
                {
                    while (busSocket.IsValueCreated)
                    {
                        Thread.Sleep(1000);
                        //接收数据
                        byte[] buffer = busSocket.Value.Receive();
                        string recvstr = Encoding.UTF8.GetString(buffer);
                        TextShow(recvstr);
                    }
                }).Start();
            }
            catch (Exception ex)
            {
                TextShow(ex.Message);
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            switch ((ENanoType)cmbtype.SelectedIndex)
            {
                case ENanoType.BUS:
                   

                    string bussgtr = "这是一条BUS模式消息";
                    busSocket.Value.Send(Encoding.UTF8.GetBytes(bussgtr));
                    TextShow(bussgtr);

                    break;
            }
        }

Client端代码

代码语言:javascript
复制
  busSocket = new Lazy<BusSocket>(() => new BusSocket());
  busSocket.Value.Bind("ipc://client");
  busSocket.Value.Connect("ipc://server");
                    
  new Task(() =>
  {
     while (busSocket.IsValueCreated)
     {
        Thread.Sleep(1000);
        //接收数据
        byte[] buffer = busSocket.Value.Receive();
        string recvstr = Encoding.UTF8.GetString(buffer);
        TextShow(recvstr);
     }
  }).Start();
  
  //发送数据时
  if (busSocket.IsValueCreated)
   {
     //发送数据
     busSocket.Value.Send(Encoding.UTF8.GetBytes(inputstr));
    
   }

从上面的BUS模式中我们看到了,发送了一次消息,接收到了两遍,就像开头说的,场景应用我觉得还是蛮少的。

知识点

文章中介绍的挺简单的,这一系列完了后我会像原来一样把DEMO直接放到网上,所以篇中我们就只介绍重点了。

在PAIR中连接的时候,我们用到的TCP的模式,占用了端口8001

服务端绑定

客户端连接

在BUS模式中我们用的是IPC,也就是进程间的通讯,没再用端口,只是把服务端和客户端自己定义了一个IPC的名称。

服务端绑定和连接

客户端绑定和连接

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Server端代码
  • Client端代码
  • Server端代码
  • Client端代码
  • 服务端绑定
  • 客户端连接
  • 服务端绑定和连接
  • 客户端绑定和连接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档