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

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

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

Server端代码:

  /// <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端代码:

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端代码:

/// <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端代码:

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;
1、服务端绑定

2、客户端连接

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

2、客户端绑定和连接

参考连接:https://my.oschina.net/u/4582134/blog/4378096 ;

NanoMsg框架|Android Studio编译NanoMsg源码

Android链接: NanoMsg的源码地址.

参考连接: https://my.oschina.net/u/4582134/blog/4378088 ;

nanomsg 高性能通信库_NanoMsg框架|C#中Nanomsg的PAIR和BUS使用相关推荐

  1. 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol

    目录 1.Java网络编程和套接字API的历史 2.InfiniBand 高速网络通信技术 3. Java 网络协议栈API 4.Java 7 SDP 远程直接内存存取(RDMA) 4.1 Java7 ...

  2. 基于Java的RDMA高性能通信库(五):JXIO

    JXIO 是 Mellanox 公司的RDMA中间件accelio在Java上的包装,JXIO使用类似于Java nio的ServerChannel方式,熟悉接口可以做好变换.AcceliO是针对硬件 ...

  3. 基于Java的RDMA高性能通信库(二):Java Socket Over RDMA

    目录 1.Comparing JSOR with Java TCP communications 2.Comparing JSOR to Java Sockets Direct Protocol (S ...

  4. 基于Java的RDMA高性能通信库(一):IBM jVerbs库

    目录 1. verbs API 2. endpoint API 3. jVerbs 应用程序系统和运行时需求(仅限 Linux) 4. Java Socket Over RDMA 与 jVerbs 比 ...

  5. 基于Java的RDMA高性能通信库(四):DaRPC

    DaRPC是一个用于Java的RPC框架和API,它使用RDMA在用户空间中实现RPC消息处理和网络处理之间的紧密集成. 自80年代初以来,远程过程调用(RPC)一直是分布式系统的基石. 最近,在数据 ...

  6. 基于Java的RDMA高性能通信库(三):Direct Storage and Networking Interface (DiSNI)

    The Direct Storage and Networking Interface (DiSNI) 是一个Java框架和API专门为了在用户空间进行存储和网络访问的(IBM的jVerbs的新开源代 ...

  7. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

  8. vue框架项目中使用阿里矢量图标库

    vue框架项目中使用阿里矢量图标库 一.打开阿里矢量图标,将需要图标加入购物车,选择下载代码 二.解压缩包,将解压缩后的 文件夹放入项目文件夹下的src/assets 1.在main.js中引入css ...

  9. Python Gevent – 高性能的 Python 并发框架

    From:http://www.xuebuyuan.com/1604603.html Gevent 指南(英文):http://sdiehl.github.io/gevent-tutorial Gev ...

  10. Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库

    UCX 是一个高性能网络通信库,它作为 MPI 所依赖的通信模块之一在高性能计算领域得到广泛的使用.UCX 使用 C 语言编写,为了在 Rust 项目中使用它,我们需要将它的 C 接口包装成 Rust ...

最新文章

  1. java 枚举使用简书_Java枚举
  2. 从向量的角度理解皮尔逊相关系数
  3. 【转】C# 正则表达式 使用介绍
  4. 《中国人工智能学会通讯》——4.32 数据包丢失
  5. css中margin属性的探究
  6. § 1.3 简 单 的 Java程 序
  7. 【mongoDB中级篇②】索引与expain
  8. 科技爱好者周刊:第 103 期
  9. bat学习(二)快速批量建立指定三级文件夹
  10. c 循序结构程序设计
  11. 三位数除以两位数竖式计算没有余数_三位数除以两位数有余数竖式运算300题
  12. Fiddler+雷电模拟器APP抓包
  13. 最美中国字|“粘”字书写技巧这样写,保证工整又好看!
  14. Theos(六):官方文档
  15. pwm一个时间单位_详解PWM原理、频率与占空比
  16. pfx证书转pem、crt、key
  17. 安全性剖析:对比 LayerZero、Wormhole 等跨链桥优劣
  18. 测试项目启动与研读需求文档
  19. 【Linux-SVN】安装 SVN Server
  20. 达内2016前端开发知识点总结--ajax php mysql--9天

热门文章

  1. 三区三线划定-永久基本农田
  2. 中国新一代超级安全核燃料材料入堆辐照试验开始
  3. 宿命java_昆仑奇侠传外传之宿命篇
  4. 20+免费精美响应式Html5 网站模板01(含源码)
  5. [转] 你没看过的囧人囧事大集合
  6. Mars3D开发基础学习:3DTiles三维模型
  7. 离散傅里叶变换matlab程序
  8. 用计算机显示器主屏区域造句,显示器造句
  9. 多功能便携扩音器,老师上课的好帮手
  10. ZYNQ平台Linux4.6内核蓝牙音频