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可以实现对象的延迟加载。
/// <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);
}
}
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中就发现客户端和服务端中通讯,经常会发送一条,接收到了两个,所以来说这个模式使用的场景应该非常少,只是简单介绍一下好了。
/// <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;
}
}
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的名称。
完