C# ZeroMQ 官方Samples 初探(三) Brokerless Reliability (Freelance Pattern)

服务端:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using NetMQ;
using NetMQ.Sockets;

namespace Freelance.ModelOne.Server
{
    internal static class Program
    {
        private const uint PortNumber = 5555;

        private static void Main()
        {
            using (var response = new ResponseSocket())
            {
                string address = GetComputerLanIP();

                if (!string.IsNullOrEmpty(address))
                {
                    Console.WriteLine("Binding tcp://{0}:{1}", address, PortNumber);
                    response.Bind($"tcp://{address}:{PortNumber}");

                    while (true)
                    {
                        bool hasMore;
                        string msg = response.ReceiveFrameString(out hasMore);
                        if (string.IsNullOrEmpty(msg))
                        {
                            Console.WriteLine("No msg received.");
                            break;
                        }

                        Console.WriteLine("Msg received! {0}", msg);
                        response.SendFrame(msg, hasMore);

                        Thread.Sleep(1000);
                    }

                    response.Options.Linger = TimeSpan.Zero;
                }
                else
                {
                    Console.WriteLine("Wrong IP address");
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }

        private static string GetComputerLanIP()
        {
            string strHostName = Dns.GetHostName();
            IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);

            foreach (var ipAddress in ipEntry.AddressList)
            {
                if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
                {
                    return ipAddress.ToString();
                }
            }

            return "";
        }
    }
}

接收端:

using System;
using System.Collections.Generic;
using NetMQ;
using NetMQ.Sockets;

namespace Freelance.ModelOne.Client
{
    internal static class Program
    {
        private const int RequestTimeout = 1000; // ms
        private const int MaxRetries = 50; // Before we abandon

        private static void Main()
        {
            var endpoints = new List<string>
            {
                "tcp://192.168.56.1:5555",

                //"tcp://*** Add your first endpoint ***",
                //"tcp://*** Add your second endpoint ***"
            };

            if (endpoints.Count == 1)
            {
                for (int i = 0; i < MaxRetries; i++)
                {
                    if (TryRequest(endpoints[0], $"Hello from endpoint {endpoints[0]}"))
                        break;
                }
            }
            else if (endpoints.Count > 1)
            {
                foreach (string endpoint in endpoints)
                {
                    if (TryRequest(endpoint, $"Hello from endpoint {endpoint}"))
                        break;
                }
            }
            else
            {
                Console.WriteLine("No endpoints");
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static bool TryRequest(string endpoint, string requestString)
        {
            Console.WriteLine("Trying echo service at {0}", endpoint);

            using (var client = new RequestSocket())
            {
                client.Options.Linger = TimeSpan.Zero;

                client.Connect(endpoint);

                client.SendFrame(requestString);
                client.ReceiveReady += ClientOnReceiveReady;
                bool pollResult = client.Poll(TimeSpan.FromMilliseconds(RequestTimeout));
                client.ReceiveReady -= ClientOnReceiveReady;
                client.Disconnect(endpoint);
                return pollResult;
            }
        }

        private static void ClientOnReceiveReady(object sender, NetMQSocketEventArgs args)
        {
            Console.WriteLine("Server replied ({0})", args.Socket.ReceiveFrameString());
        }
    }
}

运行结果:

 

结论:

1、还是请求回应模型。

2、解决了服务端和发送端都阻塞的问题,即引入了第一篇中的Timeout效果。

3、结构中只存在一个服务端,如客户端尝试重连崩溃的服务端则会永远尝试连接而无法得知服务端状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值