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

C#中用WebSocketSharp监听Laravel WebSocket频道事件的问题

问题解决:C# 对接 Laravel WebSocket(Pusher 协议)收不到消息的处理

是否需要更换库?

WebSocketSharp 仅实现基础的原生WebSocket通信,而你的 Laravel 后端用的是Pusher协议(不是纯文本WebSocket)——Echo本质是基于Pusher协议封装的客户端。直接用WebSocketSharp无法解析Pusher的订阅、事件格式,必须更换支持Pusher协议的库,或者手动实现复杂的Pusher协议逻辑(不推荐)。

推荐使用专门的Pusher客户端库:

  • PusherClient(官方维护的.NET客户端,兼容性最好)
  • LaravelWebsockets.Client(针对Laravel WebSockets的第三方适配库,API更贴近Echo)

具体实现方法(以 PusherClient 为例)

1. 安装依赖包

# NuGet包管理器安装
Install-Package PusherClient
# 或.NET CLI命令
dotnet add package PusherClient

2. 原JavaScript Echo代码翻译与功能说明

你提供的JS代码翻译及功能解释:

// 初始化Echo实例,采用Pusher广播驱动
window.Echo = new Echo({
    broadcaster: 'pusher', // 广播器类型为Pusher
    key: '123456', // 对应Laravel配置的PUSHER_APP_KEY
    cluster: 'mt1', // Pusher集群标识
    forceTLS: true, // 强制使用TLS加密连接
    wsHost: 'ws.test.bet', // WebSocket服务器地址
    wsPort: 6781, // WebSocket服务端口
    enabledTransports: ['ws', 'wss'] // 启用的传输协议:普通WebSocket和加密WebSocket
})

// 订阅名为'events'的公开频道,监听'RealTimeEvent'事件,收到消息后打印内容
window.Echo.channel('events').listen('RealTimeEvent', (e) => console.log(' 消息: ' + e.message))

3. 对应C#实现代码

using PusherClient;
using System;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        // 初始化Pusher客户端,匹配Laravel配置参数
        var pusher = new Pusher(
            appKey: "123456",
            options: new PusherOptions
            {
                Cluster = "mt1",
                Encrypted = true, // 对应JS中的forceTLS: true
                Host = "ws.test.bet",
                Port = 6781,
                Scheme = "wss" // 加密协议,与forceTLS匹配
            }
        );

        // 监听连接状态变更
        pusher.ConnectionStateChanged += (sender, state) =>
        {
            Console.WriteLine($"连接状态: {state.CurrentState}");
        };

        // 建立连接
        await pusher.ConnectAsync();

        // 订阅'events'频道
        var channel = await pusher.SubscribeAsync("events");

        // 注意:Laravel事件在Pusher中会被转为「命名空间+类名」格式,需完整填写
        channel.Bind("App\\Events\\RealTimeEvent", (dynamic data) =>
        {
            Console.WriteLine($"收到消息: {data.message}");
        });

        // 保持程序运行,等待接收消息
        Console.WriteLine("已连接并监听事件,按任意键退出...");
        Console.ReadKey();

        // 断开连接
        await pusher.DisconnectAsync();
    }
}

关键注意点

  • 事件名称匹配:Laravel中的RealTimeEvent事件,在Pusher协议中会被序列化为App\\Events\\RealTimeEvent(完整命名空间+类名),绑定事件时必须写全,否则收不到消息。
  • 配置一致性:客户端的加密设置、服务器地址、端口必须和Laravel WebSockets的配置完全一致。
  • 异常处理:实际项目中需添加try-catch块,处理连接失败、订阅失败等异常场景。

备选方案:LaravelWebsockets.Client

如果专门对接Laravel WebSockets服务器,可使用第三方库LaravelWebsockets.Client,API更贴近Echo的使用习惯(无需手动拼接事件命名空间):

Install-Package LaravelWebsockets.Client

内容的提问来源于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 02:00:34