nanomsg 高性能通信库_NanoMsg框架|C#中Nanomsg的PAIR和BUS使用
创建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使用相关推荐
- 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol
目录 1.Java网络编程和套接字API的历史 2.InfiniBand 高速网络通信技术 3. Java 网络协议栈API 4.Java 7 SDP 远程直接内存存取(RDMA) 4.1 Java7 ...
- 基于Java的RDMA高性能通信库(五):JXIO
JXIO 是 Mellanox 公司的RDMA中间件accelio在Java上的包装,JXIO使用类似于Java nio的ServerChannel方式,熟悉接口可以做好变换.AcceliO是针对硬件 ...
- 基于Java的RDMA高性能通信库(二):Java Socket Over RDMA
目录 1.Comparing JSOR with Java TCP communications 2.Comparing JSOR to Java Sockets Direct Protocol (S ...
- 基于Java的RDMA高性能通信库(一):IBM jVerbs库
目录 1. verbs API 2. endpoint API 3. jVerbs 应用程序系统和运行时需求(仅限 Linux) 4. Java Socket Over RDMA 与 jVerbs 比 ...
- 基于Java的RDMA高性能通信库(四):DaRPC
DaRPC是一个用于Java的RPC框架和API,它使用RDMA在用户空间中实现RPC消息处理和网络处理之间的紧密集成. 自80年代初以来,远程过程调用(RPC)一直是分布式系统的基石. 最近,在数据 ...
- 基于Java的RDMA高性能通信库(三):Direct Storage and Networking Interface (DiSNI)
The Direct Storage and Networking Interface (DiSNI) 是一个Java框架和API专门为了在用户空间进行存储和网络访问的(IBM的jVerbs的新开源代 ...
- 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】
一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...
- vue框架项目中使用阿里矢量图标库
vue框架项目中使用阿里矢量图标库 一.打开阿里矢量图标,将需要图标加入购物车,选择下载代码 二.解压缩包,将解压缩后的 文件夹放入项目文件夹下的src/assets 1.在main.js中引入css ...
- Python Gevent – 高性能的 Python 并发框架
From:http://www.xuebuyuan.com/1604603.html Gevent 指南(英文):http://sdiehl.github.io/gevent-tutorial Gev ...
- Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库
UCX 是一个高性能网络通信库,它作为 MPI 所依赖的通信模块之一在高性能计算领域得到广泛的使用.UCX 使用 C 语言编写,为了在 Rust 项目中使用它,我们需要将它的 C 接口包装成 Rust ...
最新文章
- java 枚举使用简书_Java枚举
- 从向量的角度理解皮尔逊相关系数
- 【转】C# 正则表达式 使用介绍
- 《中国人工智能学会通讯》——4.32 数据包丢失
- css中margin属性的探究
- § 1.3 简 单 的 Java程 序
- 【mongoDB中级篇②】索引与expain
- 科技爱好者周刊:第 103 期
- bat学习(二)快速批量建立指定三级文件夹
- c 循序结构程序设计
- 三位数除以两位数竖式计算没有余数_三位数除以两位数有余数竖式运算300题
- Fiddler+雷电模拟器APP抓包
- 最美中国字|“粘”字书写技巧这样写,保证工整又好看!
- Theos(六):官方文档
- pwm一个时间单位_详解PWM原理、频率与占空比
- pfx证书转pem、crt、key
- 安全性剖析:对比 LayerZero、Wormhole 等跨链桥优劣
- 测试项目启动与研读需求文档
- 【Linux-SVN】安装 SVN Server
- 达内2016前端开发知识点总结--ajax php mysql--9天