ZeroMQ系列 之NetMQ
一:zeromq简介
二:NetMQ 请求响应模式 Request-Reply
三:NetMQ 发布订阅模式 Publisher-Subscriber
四:NetMQ 推拉模式 Push-Pull
NetMQ 请求响应模式 Request-Reply
1:简介
请求响应模式,客户端发起一个请求,服务端接收到消息,响应对应的内容给客户端。
2:案例说明
我们从一个简单的例子,即 HelloWorld 项目讲起。这就是网络请求中最基本的“请求-响应”模式(Request-Reply),客户端往服务端发送“Hello”,服务端回应“World”,如图1。
图1
-
NetMQ 版本号 3.3.3.1
-
.net45
客户端(请求端):
class Program
{
static void Main(string[] args)
{
using (NetMQSocket clientSocket = new RequestSocket())
{
Random rd = new Random();
int num = rd.Next(0, 100);
clientSocket.Connect("tcp://127.0.0.1:5555");
while (true)
{
Console.WriteLine(num + ",Please enter your message:");
string message = Console.ReadLine();
clientSocket.SendFrame(num + ":" + message);
string answer = clientSocket.ReceiveFrameString();
Console.WriteLine("Answer from server:{0}", answer);
if (message == "exit")
{
break;
}
}
}
}
}
服务端(响应端):
class Program
{
static void Main(string[] args)
{
using (NetMQSocket serverSocket = new ResponseSocket())
{
serverSocket.Bind("tcp://127.0.0.1:5555");
while (true)
{
string message1 = serverSocket.ReceiveFrameString();
Console.WriteLine("Receive message :
{0}
", message1);
string[] msg = message1.Split(':');
string message = msg[1];
#region 根据接收到的消息,返回不同的信息
if (message == "Hello")
{
serverSocket.SendFrame("World");
}
else if (message == "ni hao ")
{
serverSocket.SendFrame("你好!");
}
else if (message == "hi")
{
serverSocket.SendFrame("HI");
}
else
{
serverSocket.SendFrame(message);
}
#endregion
if (message == "exit")
{
break;
}
}
}
}
}
效果图:
启动一个客户端,一个服务器端。
然后,输入一些消息,得到的结果图:
从图中可以看到,客户端接收到的消息不同,服务器响应的消息也不同。这样,就可以定制返回的消息。
3:总结
- 服务端和客户端无论谁先启动,效果是相同的,这点不同于Socket。
- 在服务端收到信息以前,程序是阻塞的,会一直等待客户端连接上来。
- 服务端收到信息以后,会send一个“World”给客户端。值得注意的是一定是client连接上来以后,send消息给Server,然后Server再rev然后响应client,这种一问一答式的。如果Server先send,client先rev是会报错的。
- ZMQ通信通信单元是消息,他除了知道Bytes的大小,他并不关心的消息格式。因此,你可以使用任何你觉得好用的数据格式。Xml、Protocol Buffers、Thrift、json等等。
- 虽然可以使用ZMQ实现HTTP协议,但是,这绝不是他所擅长的。
4:下载地址
下载地址:请求响应模式例子