using BestHTTP.WebSocket; using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using static IWebSocketChannle; /// /// 抽象的websocket通信 /// public abstract class AbstractWebSocketChannle : IWebSocketChannle,IApplcationShutdown { private WebSocket webSocket; private Dictionary _messageMap = new Dictionary(); public WebSocket _webSocket { get => webSocket; } public abstract string _url { get; } public bool IsConnected => webSocket.IsOpen; /// /// 重连间隔 /// public int ReconnectionInterval = 3; public Dictionary messageMap => _messageMap; public abstract string Description { get; } public event OnCloseEvent _closeEvent; public event OnMessageEvent _messageEvent; public event OnErrorEvent _errorEvent; private Task ReconnectionTask; /// /// websocket 接受推送的消息过滤 /// /// /// public abstract object MesageFilter(string message); public void Connect() { Debug.Log(string.Format("{0}:地址【{1} 】", Description,_url)); webSocket = new WebSocket(new Uri(_url)); webSocket.OnMessage += Message; webSocket.OnError += Error; webSocket.OnClosed += Close; webSocket.OnOpen += OnOpen; webSocket.Open(); if(ReconnectionTask != null) { ReconnectionTask.Dispose(); ReconnectionTask = null; } } private void OnOpen(WebSocket webSocket) { Debug.Log(Description + ":连接成功!!!"); } public void OnClose(OnCloseEvent onClose) { _closeEvent -= onClose; _closeEvent += onClose; } public void OnError(OnErrorEvent onError) { _errorEvent -= onError; _errorEvent += onError; } public void OnMessage(OnMessageEvent onMessage) { _messageEvent -= onMessage; _messageEvent += onMessage; } private void Error(WebSocket webSocket, Exception ex) { Debug.Log(string.Format( "{0}:连接异常 : {1}", Description,ex.Message)); webSocket.Close(); Reconnection(); _errorEvent?.Invoke(); } /// /// websocket 推送的消息 /// /// /// public virtual void Message(WebSocket webSocket, string message) { object data = MesageFilter(message); _messageEvent?.Invoke(data); } private void Close(WebSocket webSocket, UInt16 code, string message) { Debug.Log(Description + ":连接关闭!!!"); _closeEvent?.Invoke(); } public void OnMessage(WebSocketChannleKey key, OnMessageEvent onMessage) { if(_messageMap.ContainsKey(key)) { OnMessageEvent events; if (_messageMap.TryGetValue(key, out events)) { events -= onMessage; events += onMessage; } } else { _messageMap.Add(key, onMessage); } } /// /// Fix 重连 /// private void Reconnection() { ///fix 待实现重连,以下临时实现及其耗性能 Connect(); } public void Shutdown() { webSocket?.Close(); Debug.Log(Description + "连接关闭"); } }