Unity websocket

记录一下Unity WebSocket的简单用法

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityWebSocket;

public class WebSocketLogic :MonoBehaviour
{

    private WebSocketLogic() { }
    private WebSocketLogic _instance;
    private bool connected = false;
    private bool inited = false;
    private Dictionary<SocketCode, List<Action<string>>> msgResponseDic = new Dictionary<SocketCode, List<Action<string>>>();
    private Dictionary<SocketCode, List<Action<string>>> msgListenerDic = new Dictionary<SocketCode, List<Action<string>>>();

   

   public WebSocketLogic Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new WebSocketLogic();
            }
            return _instance;
        }
        private set { }
    }

    WebSocket webSocket;
    string ip;

    public void Init(string _ip)
    {
        inited = true;
        ip = _ip;
    }

    public void Connect()
    {
        RemoveHandle();
        webSocket = new WebSocket(ip);
        webSocket.OnClose += WebSocketClose;
        webSocket.OnOpen += WebSocketOpen;
        webSocket.OnError += WebSocketError;
        webSocket.OnMessage += WebSocketReceive;
        webSocket.ConnectAsync();
    }

    public void AddListener(SocketCode socketCode,Action<string> callback)
    {
        if (msgListenerDic.ContainsKey(socketCode))
        {
            List<Action<string>> actions = msgListenerDic[socketCode];
            for (int i = 0; i < actions.Count; i++)
            {
                if (actions[i] == callback)
                {
                    Debug.LogError("重复注册监听,消息号:" + socketCode);
                    return;
                }

            }
            msgListenerDic[socketCode].Add(callback);
        }
        else
        {
            List<Action<string>> actions = new List<Action<string>>();
            actions.Add(callback);
            msgListenerDic.Add(socketCode, actions);
        }
    }

    public void RemoveListener(SocketCode socketCode,Action<string> callback)
    {
        if (msgListenerDic.ContainsKey(socketCode))
        {
            List<Action<string>> actions = msgListenerDic[socketCode];
            for (int i = 0; i < actions.Count; i++)
            {
                if (actions[i] == callback)
                {
                    actions.RemoveAt(i);
                    return;
                }
            }
            Debug.LogError("移除监听出错,未包注册监听消息函数,消息号:" + socketCode);
        }
        else
        {
            Debug.LogError("移除监听出错,未包注册监听,消息号:" + socketCode);
        }
    }

    void RemoveHandle()
    {
        msgResponseDic.Clear();
        webSocket = null;
        webSocket.OnClose -= WebSocketClose;
        webSocket.OnOpen -= WebSocketOpen;
        webSocket.OnError -= WebSocketError;
        webSocket.OnMessage -= WebSocketReceive;
    }


    public void Send(SocketCode socketCode, string msg,Action<string> callback)
    {
        if (callback != null)
        {
            if (msgResponseDic.ContainsKey(socketCode))
            {
                msgResponseDic[socketCode].Add(callback);
            }
            else
            {
                List<Action<string>> actions = new List<Action<string>>();
                actions.Add(callback);
                msgResponseDic.Add(socketCode, actions);
            }
        }
        webSocket.SendAsync(string.Format("{0}/{1}", socketCode, msg));
    }


    private void WebSocketReceive(object sender, MessageEventArgs e)
    {
        //优化逻辑
        //heartTime = 0;
        receiveMsgTime = Time.realtimeSinceStartup;
        
         if (e.IsText)
        {
            string[] temp = e.Data.Split('.');
            //发送接口需要返回的消息
            SocketCode socketCode = (SocketCode)int.Parse(temp[0]);
            if (msgResponseDic.ContainsKey(socketCode))
            {
                List<Action<string>> actions = msgResponseDic[socketCode];
                for (int i = 0; i < actions.Count; i++)
                {
                    actions[i](temp[1]);
                }
                msgResponseDic.Remove(socketCode);
            }

            if (msgListenerDic.ContainsKey(socketCode))
            {
                List<Action<string>> actions = msgListenerDic[socketCode];
                for (int i = 0; i < actions.Count; i++)
                {
                    actions[i](temp[1]);
                }
            }
            Debug.LogError(string.Format("接收到消息: {0}", e.Data));
        }
        else if (e.IsBinary)
        {
            Debug.LogError(string.Format("接受到消息 Bytes ({1}): {0}", e.Data, e.RawData.Length));
        }
    }

    private void WebSocketError(object sender, ErrorEventArgs e)
    {
        connected = false;
        throw new NotImplementedException();
    }

    private void WebSocketOpen(object sender, OpenEventArgs e)
    {
        reconnectCount = 0;
        receiveMsgTime = Time.realtimeSinceStartup;
        connected = true;
        Debug.LogError(string.Format("连接成功,IP:{0}",ip));
    }

    private void WebSocketClose(object sender, CloseEventArgs e)
    {
        connected = false;
        Debug.LogError(string.Format("连接关闭: StatusCode: {0}, Reason: {1}", e.StatusCode, e.Reason));
    }


    float heartTime = 0;
    float receiveMsgTime = 0;
    float reconnectCount = 0;
    private void Update()
    {
        if (!inited)
        {
            return;
        }
        heartTime = heartTime + Time.deltaTime;
        if (heartTime >= 5.0f && connected == true)
        {
            heartTime = 0.0f;
            Send(SocketCode.Heart, "heartbeat",null);
        }
        if (receiveMsgTime != 0 &&Time.realtimeSinceStartup - receiveMsgTime > 6.0f)
        {
            if (reconnectCount > 5)
            {
                Debug.LogError("重新连接失败!");
                return;
            }
            receiveMsgTime = Time.realtimeSinceStartup;
            connected = false;
            webSocket.CloseAsync();
            Connect();
            reconnectCount = reconnectCount + 1;
            Debug.LogError(string.Format("连接断开,尝试第{0}次重新连接!", reconnectCount));
        }
    }

    public void Clear()
    {
        connected = false;
        inited = false;
        msgResponseDic.Clear();
        msgListenerDic.Clear();
    }
}
 

猜你喜欢

转载自blog.csdn.net/u014417405/article/details/126991621