|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|