我已经在我的应用程序中实现了用于websocket通信的SocketRocket,但由于这个库太旧并且现在存档,我们决定实现StarScream,这似乎是值得信赖的。
但是,在我从SocketRocket => StarScream迁移后,我发现我的 websocket 只收到了PONG
响应,而其他请求没有得到响应。
有人会在这里帮助我找到问题或纠正我吗?
这是我的 SocketRocket 实现,即使在当前的实时生产应用程序中,我的 websocket 也能正常工作。
这是我的 StarScream 实现,即使使用生产配置也无法正常工作,我对两个应用程序使用相同的生产配置,但 SocketRocket 在 StarScream 失败时工作。
如果你检查代码,你会发现两个实现有很多相似之处,即使我没有收到对StarScream实现的正确响应。我尝试每 2 秒发送一次 ping 请求,我得到PONG
响应,但一旦连接套接字,我也确实发送auth
请求,我从未得到任何响应,而在 SocketRocket 中我确实得到了身份验证请求的响应。
-
connectSocket(( 是创建套接字的函数。请暂时忽略connectQuickStashSocket((,因为我暂时评论了它。
-
sendPing(( 现在也被省略了,因为我必须检查身份验证的响应,因此,每 2 秒注释一次 sendPing(( 调用。
-
send(( 是在套接字上写入数据的主要函数 一旦写入数据,我也会收到完成回调,但我仍然 没有得到任何回应。
注意:注释/取消注释sendPing()
,connectQuickStashSocket()
不会更改响应,代码的行为相同。
在这里,我附加了 SocketRocket 的日志,您将在其中看到所有请求/响应正常工作:
>>>> Connected to Socket
Optional("d2ee02da-e4de-4593-90e6-36598c00982d")
>>>>
{
"kind" : "auth",
"uuid" : "",
"auth" : {
"version" : "1.4.0",
"privateKey" : "d2ee02da-e4de-4593-90e6-36598c00982d",
"device" : {
"type" : "ios",
"properties" : [
],
"id" : "A5F24445-C688-43B0-98C1-96C636EFA08F"
}
}
}
>>>> Finished receiving socket data in 0.0020380020141601562 seconds
>>>> Deserialized pong data of length 25 in 0.0008620023727416992 seconds
>>>> Finished receiving socket data in 0.33321893215179443 seconds
>>>> Deserialized auth data of length 95 in 7.49826431274414e-05 seconds
>>>>
{
"sync" : {
"collections" : {
"24191c17-463c-4de9-b718-cad41976460c:stash" : {
"cache" : {
"e4d4804e-07a4-49f5-91f4-1b65935d4d8e" : 1,
"8834da09-a26d-4a0f-806a-f3c54fff175e" : 1,
"98a01deb-cfc7-4939-a6ce-d2dc64afe3a8" : 1,
"80986d67-e0a4-4f4d-85c0-e263989f0044" : 1,
"dd54420d-553b-4f43-808e-6cbdfcd0fe76" : 1,
"1da73786-da7c-4b3f-b99f-58b907d15cc2" : 2,
"c32c0a9a-c754-412e-af42-b8859a56ca72" : 1
}
},
"24191c17-463c-4de9-b718-cad41976460c:inbox" : {
"cache" : {
}
}
}
},
"kind" : "sync"
}
>>>> Finished receiving socket data in 0.421644926071167 seconds
>>>> Deserialized sync data of length 2473 in 0.000841975212097168 seconds
Processed json and written to realm in 0.0073059797286987305 seconds
Initial state processed
以下是 StarScream 的日志,其中只收到PONG
并且没有收到auth
请求的响应,它只显示作为请求写入的数据:
>>>> websocket is connected: ["Upgrade": "websocket", "Access-Control-Allow-Credentials": "true", "Date": "Tue, 12 May 2020 16:55:18 GMT", "Expect-CT": "max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"", "cf-request-id": "02ab68f8400000dcd233395200000001", "Access-Control-Allow-Origin": "wss://mercury.speare.io", "CF-Cache-Status": "DYNAMIC", "CF-RAY": "5925aaa06d91dcd2-SIN", "Sec-WebSocket-Accept": "szN0nnvUplvghVle+n4FXOFp2cw=", "Server": "cloudflare", "Connection": "upgrade"]
Connected to Socket
Optional("d2ee02da-e4de-4593-90e6-36598c00982d")
{
"kind" : "auth",
"auth" : {
"privateKey" : "d2ee02da-e4de-4593-90e6-36598c00982d",
"version" : "1.4.0",
"device" : {
"id" : "A5F24445-C688-43B0-98C1-96C636EFA08F",
"type" : "ios",
"properties" : [
]
}
},
"uuid" : ""
}
>>>> Received data: 47
Finished receiving socket data in 0.0007439851760864258 seconds
Deserialized data pong of length 25 in 0.0006880760192871094 seconds
2020-05-12 22:25:18.520913+0530 Stash[3952:884630] Socket done writing data => auth
请在这里建议我能做什么以及如何跟踪实际问题。
我遇到了不同的错误,一旦我在本地机器上设置开发环境并在那里连接 websocket,我就知道了。
我检查了服务器的日志,得到它给了我zlib - gzip : invalid header
.
因此,问题是服务器没有发送任何响应,因为它没有以正确的格式获取请求。
我通过 POD 更新了 gzip 库,现在我的套接字工作正常。
呼。。!