Unity中使用SocketIoClient无法连接Laravel PHP WebSocket服务器求助
Unity Socket.IO客户端无法连接Laravel服务器的排查与修复
核心配置错误修正
你的代码里SocketIOOptions存在多处配置矛盾和错误,这是连接失败的主要原因:
- 协议与forceTLS冲突:URI用
ws://(非加密),但Query里设置forceTLS: "true"(强制加密),二者直接矛盾。要么将URI改为wss://ws.testing.bet:6781,要么移除forceTLS参数。 - enabledTransports参数位置错误:Socket.IO C#客户端的传输方式不需要通过Query传递,而是直接在
SocketIOOptions的EnabledTransports属性中配置,Query里的enabledTransports会被服务器忽略。 - 多余无效参数:
cluster是第三方推送服务(如Pusher)的参数,Laravel的Socket.IO服务器(如laravel-echo-server)不需要该参数,多余参数可能导致服务器拒绝连接。
修改后的客户端代码
using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using SocketIOClient; using SocketIOClient.Transport; class Program : MonoBehaviour { public static Program instance = null; async void Start() { Debug.Log("start code"); if (instance == null) { instance = this; } else if (instance != this) { Destroy(gameObject); } DontDestroyOnLoad(gameObject); await Main(); } public async Task Main() { Debug.Log("start main"); // 根据服务器配置选择ws或wss var uri = new Uri("wss://ws.testing.bet:6781"); var socket = new SocketIO(uri, new SocketIOOptions { ConnectionTimeout = TimeSpan.FromSeconds(120), // 配置传输方式,直接使用属性而非Query EnabledTransports = new List<TransportType> { TransportType.WebSocket }, Query = new Dictionary<string, string> { {"key", "12356"} // 仅保留服务器需要的有效参数 }, }); socket.OnConnected += Socket_OnConnected; socket.OnPing += Socket_OnPing; socket.OnPong += Socket_OnPong; socket.OnDisconnected += Socket_OnDisconnected; socket.OnReconnectAttempt += Socket_OnReconnecting; socket.OnError += Socket_OnError; socket.OnAny((name, response) => { Debug.Log(name); Debug.Log(response); }); socket.On("RealTimeEvent", response => { Debug.Log("Message: " + response.GetValue<string>()); }); try { await socket.ConnectAsync(); Debug.Log("CONNECT ATTEMPT FINISHED"); } catch (Exception ex) { Debug.LogException(ex); // 捕获连接异常,输出详细错误 } } private static void Socket_OnReconnecting(object sender, int e) { Debug.Log($"{DateTime.Now} Reconnecting: attempt = {e}"); } private static void Socket_OnError(object sender, string e) { Debug.Log("Error: " + e); } private static void Socket_OnDisconnected(object sender, string e) { Debug.Log("disconnect: " + e); } private static async void Socket_OnConnected(object sender, EventArgs e) { Debug.Log("Socket_OnConnected"); var socket = sender as SocketIO; Debug.Log("Socket.Id:" + socket.Id); await socket.EmitAsync("hi", DateTime.Now.ToString()); } private static void Socket_OnPing(object sender, EventArgs e) { Debug.Log("Ping"); } private static void Socket_OnPong(object sender, TimeSpan e) { Debug.Log("Pong: " + e.TotalMilliseconds); } }
额外排查步骤
- 服务器端配置检查:确认laravel-echo-server的
laravel-echo-server.json中,origins字段包含Unity客户端的IP/域名(本地测试可设为"*"临时测试)。 - 端口与网络连通性:用
wscat工具测试服务器端口:wscat -c wss://ws.testing.bet:6781,如果无法连接,检查服务器防火墙是否放行6781端口,或服务器是否正常运行。 - 版本兼容性:确认Socket.IO C#客户端版本与服务器端laravel-echo-server依赖的Socket.IO版本一致(如客户端用4.x,服务器也需对应4.x版本)。
- Unity网络权限:如果使用
ws://协议,在Android PlayerSettings中开启Allow Cleartext Traffic;iOS端需在Info.plist添加NSAppTransportSecurity例外。
内容的提问来源于stack exchange,提问作者atane
相关产品推荐
相关产品推荐

