zeroMq路由模式

项目中遇到对接外部产品,之前用的通讯占用端口较多,并且每次对接都要新建一个通讯,维护麻烦,后面就做了个路由模式,一个端口,一套代码就能对接所有外部产品

直接上代码:

 

using Core;
using Microsoft.AspNetCore.Components.Routing;
using NetMQ;
using NetMQ.Sockets;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WinCopies.Util;

namespace CentralCtrlReceiveModule
{
    public class RouterDealerMq
    {
        RouterSocket _routerSocket;

        public static readonly RouterDealerMq Instance = new RouterDealerMq();

        public event Action<string, string> RouterEvent;

        public List<string> IdList { get; private set; } = new List<string>();

        private RouterDealerMq() { }

        private Dictionary<string, Action<string, string>> _actionDic = new Dictionary<string, Action<string, string>>();
        public void InitCon()
        {
            Task.Run(() =>
            {
                try
                {
                    _routerSocket = new RouterSocket();
                    _routerSocket.Bind("tcp://*:5879"); // 绑定端口 
                    _routerSocket.Options.RouterHandover = true;
                    _routerSocket.Options.RouterMandatory = true;
                    _routerSocket.Options.Relaxed = true;
                    _routerSocket.Options.DelayAttachOnConnect = true;
                    Log.Debug("Mq路由启动,端口:5879", LoggerNames.RouterMq);

                    while (true)
                    {
                        try
                        {
                            var receList = _routerSocket.ReceiveMultipartMessage();
                            if (receList.FrameCount >= 3)
                            {
                                // 接收客户端消息(包含身份标识) 
                                string clientIdentity = Encoding.UTF8.GetString(receList[0].Buffer);
                                string message = Encoding.UTF8.GetString(receList[2].Buffer); 
                                Log.Debug($"获取到消息,来自:【{clientIdentity}】,消息:【{message}】", LoggerNames.RouterMq);
                                RouterEvent?.Invoke(clientIdentity, message);
                                if (!IdList.Contains(clientIdentity))
                                {
                                    IdList.Add(clientIdentity);
                                }

                            }

                        }
                        catch (Exception ex)
                        {
                            Log.Debug($"会控屏Mq通讯有误:{ex.ToString()}", LoggerNames.RouterMq);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Debug($"会控屏Mq通讯有误:{ex.ToString()}", LoggerNames.RouterMq);
                }


            });
        }



        private object _lockMsg = new object();
        public bool SendRoutMsg(string clientType, string msg)
        {
            lock (_lockMsg)
            {
                try
                {
                    if (_routerSocket?.SendMoreFrame(clientType).SendMoreFrame("").TrySendFrame(TimeSpan.FromSeconds(3), msg) == false)
                    {
                        Log.Debug($"发送给{clientType}消息【失败】:{msg}", LoggerNames.RouterMq);
                        return false;
                    }
                    else
                    {
                        Log.Debug($"发送给{clientType}消息【成功】过:{msg}", LoggerNames.RouterMq);
                        return true;
                    }
                }
                catch(Exception ex)
                { 
                    Log.Debug($"发送Mq通讯有误,客户端:{clientType}报错:{ex.ToString()}", LoggerNames.RouterMq);
                    return false;
                }
         
            }
        }
    }

}

 

注意:需要别人传过来的消息是有三帧的,第一帧是id,第二帧是空帧,第三帧是内容

 

posted @ 2025-07-22 15:20  众爱卿平身2  阅读(27)  评论(0)    收藏  举报