为了账号安全,请及时绑定邮箱和手机立即绑定

SignalR、websockets 和 go

SignalR、websockets 和 go

Go
温温酱 2022-07-18 16:57:47
我需要从 Go 连接到 SignalR 服务器。我一直在尝试使用一些库和文章来帮助我:https://github.com/x2v3/signalrhttps://github.com/devigned/signalr-gohttps://www.derpturkey.com/signalr-is-an-abomination-how-to-connect-using-raw-websockets/https://blog.3d-logic.com/2015/03/29/signalr-on-the-wire-an-informal-description-of-the-signalr-protocol/问题是我需要从不同的端口检索令牌。我的 SignalR 服务器地址是https://server:10446/endpoint,但我需要从中检索我的令牌https://server:10443/connect/token,这与正常的 SignalR 协议不同。我能够得到我的令牌。并且能够获得以下响应的协商步骤:{    "connectionId": "JkOfCC0JykJ8hfzm8jd53w",    "availableTransports": [      {        "transport": "WebSockets",        "transferFormats": [          "Text",          "Binary"        ]      },      {        "transport": "ServerSentEvents",        "transferFormats": [          "Text"        ]      },      {        "transport": "LongPolling",        "transferFormats": [          "Text",          "Binary"        ]      }    ]  }然后我尝试通过使用 gorilla websockets 进行 websocket 连接来建立连接:wss://server:10446/endpoint?transport=WebSockets&id=${ConnectionIDFromNegotiate}&connectionData=[{\"name\":\"HubName\"}]&access_token=${MyRetrievedToken}此时,我收到一条回复说101,升级到 websocket。但是,从这一刻起,我无法继续握手。我正在向服务器发送消息,但除了 15-20 秒后握手中止之外,我没有得到任何响应。这是我用来连接和发送握手消息的代码:    ws, resp, err := websocket.DefaultDialer.Dial(u.String(), nil)    if err != nil {        return nil, err    }    if err = ws.WriteMessage(websocket.TextMessage, []byte(`{"protocol": "json","version": 1}`)); err != nil {        return nil, err    }任何想法都会受到热烈欢迎:)
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

Brennan给出了解决方案。非常感谢!

看起来您缺少部分消息有效负载。Spec github.com/dotnet/aspnetcore/blob/master/src/SignalR/docs/specs/... “HandshakeRequest 和 HandshakeResponse 消息都必须以 ASCII 字符 0x1E(记录分隔符)终止。”


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号