我正在开发一个使用
WebSocketSharp
处理网络连接的 Unity 项目。我的脚本应该在连接丢失或出现错误时重新连接到服务器。我正在使用协程来延迟重新连接尝试。但是,协程似乎没有启动,并且我没有看到来自ReconnectCoroutine()
的预期日志。
这是我的代码的简化版本:
using System.Collections;
using UnityEngine;
using WebSocketSharp;
public class WebSocketClient : MonoBehaviour
{
private WebSocket ws;
public Configurations config;
private int reconnectAttempt = 0;
void Start()
{
ConnectToServer();
}
void ConnectToServer()
{
ws = new WebSocket(config.serverAddress);
ws.OnOpen += (sender, e) => Debug.Log("Connected.");
ws.OnError += (sender, e) => AttemptReconnect();
ws.OnClose += (sender, e) => AttemptReconnect();
ws.Connect();
}
void AttemptReconnect()
{
if (reconnectAttempt < config.maxReconnectAttempts)
{
reconnectAttempt++;
Debug.Log($"Reconnect attempt {reconnectAttempt}/{config.maxReconnectAttempts}");
StartCoroutine(ReconnectCoroutine());
}
else
{
Debug.LogError("Max reconnect attempts reached.");
}
}
private IEnumerator ReconnectCoroutine()
{
Debug.Log("Starting ReconnectCoroutine");
yield return new WaitForSeconds(config.reconnectDelay);
Debug.Log("Reconnect Delay passed");
ConnectToServer();
}
void OnDestroy()
{
ws?.Close();
}
}
在此设置中:
ConnectToServer()
在 Start()
上调用并尝试连接到 WebSocket 服务器。
如果出现错误或连接关闭,则会调用 AttemptReconnect()
。
这应该记录一次尝试并启动一个协程来延迟下一次连接尝试。
问题是,当调用 AttemptReconnect()
时,我看到重新连接尝试的日志,但协程 (ReconnectCoroutine()
) 没有启动,因此在延迟后不会再次调用 ConnectToServer()
方法。
此脚本附加到的游戏对象存在且处于活动状态,并且脚本已启用。
有人以前遇到过这个问题或者可以发现这里可能出了什么问题吗?任何帮助将不胜感激!
WebsocketSharp 事件在后台线程上发送,协程是 Monobehavior 的一部分,需要在主线程上运行。
您可以使用主线程调度程序来解决此问题,这里是另一个问题的链接,其中有一个示例:c# unity IEnumerator notworking in eventhandler