Files
5.24BuYu/Assets/MyGame/Scripts/Net/WebSocketManager.cs
T

158 lines
4.5 KiB
C#
Raw Normal View History

2026-02-03 11:35:19 +08:00
using Assets.MyGame.Scripts.Net.WebResponses;
using Best.WebSockets;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Assets.MyGame.Scripts.Net
{
public enum SocketType
{
login,
room,
game,
chess
}
public partial class WebSocketManager : MonoSingleton<WebSocketManager>
{
private readonly Dictionary<SocketType, WebSocket> sockets = new();
private readonly Dictionary<SocketType, string> socketPaths = new();
private const string baseUrl = "ws://524game.32.hzgqapp.com/";
protected override void Awake()
{
base.Awake();
socketPaths[SocketType.game] = "gamehub";
socketPaths[SocketType.room] = "fishingroomhub";
socketPaths[SocketType.login] = "loginhub";
socketPaths[SocketType.chess] = "chesshub";
}
/// <summary>
/// 创建或返回已存在的 WebSocket
/// </summary>
public WebSocket Connect(SocketType type)
{
// 已存在则直接返回
if (sockets.TryGetValue(type, out var exist))
{
if (exist.IsOpen)
{
Debug.Log($"[WebSocket] {type} 已连接,直接返回");
WebSocketSendList.JoinRoom("11109", GameManager.Instance.user.id, 1);
return exist;
}
}
string url = baseUrl + socketPaths[type];
var ws = new WebSocket(new Uri(url));
sockets[type] = ws;
// 事件绑定
ws.OnOpen += (web) =>
{
Debug.Log($"[WebSocket] {type} 已连接: {url}");
web.Send("{\"protocol\":\"json\",\"version\":1}\u001e ");
switch (type)
{
case SocketType.login:
WebSocketSendList.Bind(GameManager.Instance.user.id);
break;
case SocketType.room:
break;
case SocketType.game:
WebSocketSendList.JoinRoom("11109", GameManager.Instance.user.id,1);
break;
case SocketType.chess:
break;
default:
break;
}
};
ws.OnClosed += (web, code, reason) =>
{
Debug.Log($"[WebSocket] {type} 连接关闭 Code:{code} Reason:{reason}");
// 自动重连
StartCoroutine(Reconnect(type));
};
ws.OnClosed += (web, code, message) =>
{
Debug.LogError($"[WebSocket] {type} 错误{code}: {message}");
};
ws.OnMessage += (web, msg) =>
{
OnMessage(web, msg, type);
};
// 保存
sockets[type] = ws;
// 发起连接
ws.Open();
return ws;
}
/// <summary>
/// 发送消息
/// </summary>
public void Send(SocketType type, string msg)
{
if (sockets.TryGetValue(type, out var ws) && ws.IsOpen)
{
ws.Send(msg + "\u001e");
Debug.LogWarning($"[WebSocket] {type}Send :" + msg);
}
else
{
Debug.LogWarning($"[WebSocket] {type} 未连接,无法发送消息");
UIManager.Instance.ShowBoard($"[WebSocket] {type} 未连接,无法发送消息");
}
}
/// <summary>
/// 关闭某个 socket
/// </summary>
public void Close(SocketType type)
{
if (sockets.TryGetValue(type, out var ws))
{
ws.Close();
sockets.Remove(type);
}
}
/// <summary>
/// 自动重连
/// </summary>
private System.Collections.IEnumerator Reconnect(SocketType type)
{
Debug.Log($"[WebSocket] {type} 3 秒后尝试重连...");
yield return new WaitForSeconds(3f);
Connect(type);
}
/// <summary>
/// 关闭所有 socket
/// </summary>
private void OnDestroy()
{
foreach (var ws in sockets.Values)
{
ws.Close();
}
sockets.Clear();
}
}
}