using JwKdsV.Core.SocketMessage; using NLog; using POSV.Common; using POSV.Service; using System; using System.Collections.Generic; using System.Linq; using System.Text; using WebSocket4Net; namespace JwKdsV.Core { public class WebSocketEnter { private Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static WebSocketEx websocket; private static WebSocketEnter _instance; private System.Timers.Timer _reconnectTimer; public static WebSocketEnter Instance { get { if(_instance == null) { _instance = new WebSocketEnter(); } return _instance; } } public void Init() { if(_reconnectTimer == null) { _reconnectTimer = new System.Timers.Timer(); } //设置定时间隔(毫秒为单位) this._reconnectTimer.Interval = 40000; //设置执行一次(false)还是一直执行(true) this._reconnectTimer.AutoReset = true; //设置是否执行System.Timers.Timer.Elapsed事件 this._reconnectTimer.Enabled = true; //绑定Elapsed事件 this._reconnectTimer.Elapsed -= ReconnectCallback; this._reconnectTimer.Elapsed += ReconnectCallback; //第一次直接连接 Reconnect(); } private void ReconnectCallback(object sender, System.Timers.ElapsedEventArgs e) { if (websocket != null) { logger.Info("websocket连接状态<{0}>", websocket.State); if (websocket.State != WebSocketState.Open) { logger.Info("websocket重新连接..."); websocket = null; this.Reconnect(); } } else { //未初始化,初始化 logger.Info("websocket初始化..."); this.Reconnect(); } } /// /// 打开websocket /// public void Reconnect() { if(websocket == null) { var ip = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_BUSINESS_SERVICECENTER_IP); var port = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_BUSINESS_SERVICECENTER_PORT); if(!string.IsNullOrEmpty(ip) && !string.IsNullOrEmpty(port)) { var url = string.Format("ws://{0}:{1}/{2}", ip, port, "KDS-" + Global.Instance.StoreInfo.PosNo); websocket = new WebSocketEx(url); websocket.EnableAutoSendPing = true; websocket.AutoSendPingInterval = 5; websocket.Opened -= websocket_Opened; websocket.Opened += websocket_Opened; websocket.Error -= Websocket_Error; websocket.Error += Websocket_Error; websocket.Closed -= websocket_Closed; websocket.Closed += websocket_Closed; websocket.Open(); //订阅主题 SubScriptions(); } else { logger.Error("服务中心地址未配置,websocket未开启"); } } } private void Websocket_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e) { logger.Error("websocket异常:" + e.Exception); } /// /// 获取连接服务中心状态 /// /// public string GetWebSocketStatus() { var result = "离线"; if(websocket != null) { if(websocket.State == WebSocketState.Open) { result = "正常"; } else { result = "离线"; } } return result; } public void SubScriptions() { this.On(CommandName.NEWORDER, NEWORDER.OnNewOrder); this.On(CommandName.KDSHUACAI, KdsHuacaiNotify.OnKdsHuacaiNotify); } /// /// 发送链式消息 /// /// /// /// /// /// public string Query(string name, object content, Action executor) { if (websocket != null) { if (websocket.State == WebSocketState.Open) { return websocket.Query(name, content, executor); } else { return null; } } else { return null; } } /// /// 发送消息 /// /// /// public void Send(string name, object content) { if (websocket != null) { if (websocket.State == WebSocketState.Open) { websocket.Send(name, content); } } } public void On(string name, Action executor) { if(websocket != null) { if(websocket.State == WebSocketState.Open) { websocket.On(name, executor); } else { } } else { } } public void On(string name, Action executor) { if (websocket != null) { websocket.On(name, executor); } else { } } void websocket_MessageReceived(object sender, MessageReceivedEventArgs e) { //this.Invoke(new Action(() => { // this.textBox1.Text = e.Message; //})); //this.textBox1.Invoke(new EventHandler(ShowMessage) , e.Message); logger.Info("收到的消息 ==》" + e.Message); } void websocket_Closed(object sender, EventArgs e) { logger.Error("websocket关闭"); } void websocket_Opened(object sender, EventArgs e) { logger.Info("websocket已打开"); } void ShowMessage(object sender, EventArgs e) { //this.textBox1.Text = sender.ToString(); } } }