AK056/Assets/GameLogic/Origin/network/AbstractWebSocketChannle.cs

131 lines
3.5 KiB
C#

using BestHTTP.WebSocket;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using static IWebSocketChannle;
/// <summary>
/// 抽象的websocket通信
/// </summary>
public abstract class AbstractWebSocketChannle : IWebSocketChannle,IApplcationShutdown
{
private WebSocket webSocket;
private Dictionary<WebSocketChannleKey, OnMessageEvent> _messageMap = new Dictionary<WebSocketChannleKey, OnMessageEvent>();
public WebSocket _webSocket { get => webSocket; }
public abstract string _url { get; }
public bool IsConnected => webSocket.IsOpen;
/// <summary>
/// 重连间隔
/// </summary>
public int ReconnectionInterval = 3;
public Dictionary<WebSocketChannleKey, OnMessageEvent> messageMap => _messageMap;
public abstract string Description { get; }
public event OnCloseEvent _closeEvent;
public event OnMessageEvent _messageEvent;
public event OnErrorEvent _errorEvent;
private Task ReconnectionTask;
/// <summary>
/// websocket 接受推送的消息过滤
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
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();
}
/// <summary>
/// websocket 推送的消息
/// </summary>
/// <param name="webSocket"></param>
/// <param name="message"></param>
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);
}
}
/// <summary>
/// Fix 重连
/// </summary>
private void Reconnection()
{
///fix 待实现重连,以下临时实现及其耗性能
Connect();
}
public void Shutdown()
{
webSocket?.Close();
Debug.Log(Description + "连接关闭");
}
}