131 lines
3.5 KiB
C#
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 + "连接关闭");
|
|
}
|
|
}
|