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

Unity C#客户端如何连接SockJS over STOMP WebSocket服务器?

适配SockJS over STOMP的Unity C#客户端方案

因为WebsocketSharp仅支持标准WebSocket协议,无法处理SockJS的前置握手逻辑和适配规则,你可以通过以下几种可靠方式实现连接:

1. 手动实现SockJS握手 + 搭配STOMP客户端库

核心思路

SockJS的WebSocket模式需要先完成HTTP握手获取连接参数,再建立标准WebSocket连接,之后在其上运行STOMP协议。可以拆分两步实现:

  • 第一步:完成SockJS初始握手
    向SockJS服务端的/your-endpoint/info路径发送GET请求,获取服务端支持的配置(比如是否允许WebSocket连接)。Unity中可以用UnityWebRequest完成这一步,解析响应中的websocket字段确认可用后,构造真实的WebSocket连接URL:

    ws://your-server-address/your-sockjs-endpoint/{random-server-id}/{random-client-id}/websocket
    

    其中random-server-id和random-client-id可以生成符合SockJS规则的随机字符串(比如8位字母数字组合)。

  • 第二步:用STOMP库连接WebSocket
    使用StompNet(支持.NET/Unity的STOMP客户端库)连接构造好的WebSocket端点,处理STOMP协议的CONNECT、SUBSCRIBE、SEND等操作。示例代码片段:

    // 假设已经拿到了SockJS的WebSocket连接url
    var client = new StompClient(new WebSocketTransport(new Uri(sockJsWsUrl)));
    await client.ConnectAsync(new StompConnectFrame {
        Login = "your-login",
        Passcode = "your-passcode",
        AcceptVersion = "1.2"
    });
    
    // 订阅主题
    client.SubscribeAsync("/topic/your-topic", frame => {
        Debug.Log("Received message: " + frame.Body);
    });
    

2. 基于原生ClientWebSocket手动实现SockJS+STOMP

如果不想依赖第三方库,可以直接用Unity支持的System.Net.WebSockets.ClientWebSocket实现全流程:

  • 完成SockJS的info请求和URL构造(同方案1第一步)。
  • 建立ClientWebSocket连接,手动编码/解码STOMP帧。STOMP帧的格式规则简单,示例CONNECT帧构造:
    string connectFrame = "CONNECT\n" +
                          "accept-version:1.2\n" +
                          "host:your-server\n" +
                          "\n" +
                          "\u0000"; // 帧结束符是ASCII 0x00
    byte[] buffer = Encoding.UTF8.GetBytes(connectFrame);
    await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
    
  • 接收响应时,解析STOMP帧的结构(帧头、体、结束符),处理CONNECTED、MESSAGE等响应类型。

注意事项

  • 确保Unity的.NET运行时版本支持所用库(比如StompNet需要.NET Standard 2.0及以上,Unity 2018.3+默认支持)。
  • SockJS的握手流程可能因服务端配置略有差异,需对照服务端的SockJS文档调整URL构造逻辑。
  • 在Unity中使用WebSocket时,要在主线程外处理异步操作,避免阻塞UI。

内容的提问来源于stack exchange,提问作者Min Jihong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:34