You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中使用SocketIoClient无法连接Laravel PHP WebSocket服务器求助

Unity Socket.IO客户端无法连接Laravel服务器的排查与修复

核心配置错误修正

你的代码里SocketIOOptions存在多处配置矛盾和错误,这是连接失败的主要原因:

  1. 协议与forceTLS冲突:URI用ws://(非加密),但Query里设置forceTLS: "true"(强制加密),二者直接矛盾。要么将URI改为wss://ws.testing.bet:6781,要么移除forceTLS参数。
  2. enabledTransports参数位置错误:Socket.IO C#客户端的传输方式不需要通过Query传递,而是直接在SocketIOOptions的EnabledTransports属性中配置,Query里的enabledTransports会被服务器忽略。
  3. 多余无效参数: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:45:21