SignalR,网络插座,然后走



我需要从Go连接到SignalR服务器。我一直在尝试使用一些库和文章来帮助我:

  • https://github.com/x2v3/signalr
  • https://github.com/devigned/signalr-go
  • https://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"
]
}
]
}

然后,我尝试通过使用大猩猩网络套接字进行网络套接字连接来获得连接:

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
}

任何想法都将受到热烈欢迎:(

解决方案由Brennan提供。非常感谢!

看起来您缺少了部分消息负载。Spec github.com/dotnet/aspnetcore/bob/master/src/SignlR/docs/specs/…";握手请求和握手响应消息都必须以ASCII字符0x1E(记录分隔符(结尾">

相关内容

最新更新