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 :\r\n{0}\r\n", 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:下載地址
下載地址:請求響應模式例子