You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
6.9 KiB
C#

9 months ago
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();
}
}
/// <summary>
/// 打开websocket
/// </summary>
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);
}
/// <summary>
/// 获取连接服务中心状态
/// </summary>
/// <returns></returns>
public string GetWebSocketStatus()
{
var result = "离线";
if(websocket != null)
{
if(websocket.State == WebSocketState.Open)
{
result = "正常";
}
else
{
result = "离线";
}
}
return result;
}
public void SubScriptions()
{
this.On<string>(CommandName.NEWORDER, NEWORDER.OnNewOrder);
this.On<string>(CommandName.KDSHUACAI, KdsHuacaiNotify.OnKdsHuacaiNotify);
}
/// <summary>
/// 发送链式消息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <param name="content"></param>
/// <param name="executor"></param>
/// <returns></returns>
public string Query<T>(string name, object content, Action<T> executor)
{
if (websocket != null)
{
if (websocket.State == WebSocketState.Open)
{
return websocket.Query<T>(name, content, executor);
}
else
{
return null;
}
}
else
{
return null;
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="name"></param>
/// <param name="content"></param>
public void Send(string name, object content)
{
if (websocket != null)
{
if (websocket.State == WebSocketState.Open)
{
websocket.Send(name, content);
}
}
}
public void On<T>(string name, Action<JsonWebSocket, T> executor)
{
if(websocket != null)
{
if(websocket.State == WebSocketState.Open)
{
websocket.On<T>(name, executor);
}
else
{
}
}
else
{
}
}
public void On<T>(string name, Action<T> executor)
{
if (websocket != null)
{
websocket.On<T>(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();
}
}
}