NetMQ(二): 请求响应模式 Request-Reply

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:总结

  1. 服务端和客户端无论谁先启动,效果是相同的,这点不同于Socket。
  2. 在服务端收到信息以前,程序是阻塞的,会一直等待客户端连接上来。
  3. 服务端收到信息以后,会send一个“World”给客户端。值得注意的是一定是client连接上来以后,send消息给Server,然后Server再rev然后响应client,这种一问一答式的。如果Server先send,client先rev是会报错的。
  4. ZMQ通信通信单元是消息,他除了知道Bytes的大小,他并不关心的消息格式。因此,你可以使用任何你觉得好用的数据格式。Xml、Protocol Buffers、Thrift、json等等。
  5. 虽然可以使用ZMQ实现HTTP协议,但是,这绝不是他所擅长的。

4:下载地址

下载地址:请求响应模式例子

NetMQ3.3.3.1例子
NetMQ3.3.2.2例子

posted @ 2016-05-12 15:36  weiqinl  阅读(5420)  评论(0编辑  收藏  举报