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,第二帧是空帧,第三帧是内容

浙公网安备 33010602011771号