Websocket 报错 1002 有大佬遇到过吗?

2020-09-01 14:11:35 +08:00
 cavendish0

如图: https://imgchr.com/i/dvyD6U

我是开发安卓终端的,对方开了个 ws 服务器,我连接他有时会断开报错,Protocol error 1002 。查了下,是协议错误,但是具体啥错误也没指出了。

大佬们帮忙看看

4444 次点击
所在节点    程序员
9 条回复
Githuboy
2020-09-01 16:36:34 +08:00
咨询是不是对方 ws 服务器内部错误.
jindeq
2020-09-01 18:51:29 +08:00
不要信任第三方服务,对接无数家第三方遇到过没部署服务,服务没启动,服务挂了,服务代码各种 bug,业务有问题,对方开发静默修改接口各种问题……
cavendish0
2020-09-02 08:17:02 +08:00
@jindeq 没办法,对方就是我们的客户。现在客户在重要汇报过程出现问题,就是上面的报错,然后我们被狠批了,所以我想知道到底是哪里的锅
cavendish0
2020-09-02 08:18:00 +08:00
@Githuboy 对方也是不清楚,他们服务器程序是 springboot 写的,说 ws 逻辑那一段是网上抄来的,我也是醉了
stach
2020-09-02 11:37:06 +08:00
看看抓包截图里面, 第一个 websocket 报文是什么
cavendish0
2020-09-02 13:32:03 +08:00
@stach 是一个空包。服务器发过来的
如图 https://s1.ax1x.com/2020/09/02/wSQIh9.png

很奇怪,我们客户端连上去,成功之后他就会发一个空包下来,一般情况下是没用问题的,我们也没处理
stach
2020-09-02 14:20:08 +08:00
@cavendish0 目前的过程大致是:
- 1. websocket 连接建立成功了
- 2. 服务端在成功后, 马上给客户端发送了一个`文本报文`的空包
- 3. 客户端收到空包, 没有做任何响应
- 4. 服务端可能认定客户端异常, 主动发送`close`包, 表示断开 websocket 连接

因此分析一下:
- 服务端的问题:
- 确认一下 2 中的空包, 是否有给到协议文档. 比如, 服务端将该空包定义为 "心跳包", 需要客户端回应一个 "心跳包"
- 客户端的问题:
- 如果确实服务端有要求需要响应`空包`, 如何响应, 符合服务端的要求(极有可能也是一个空包)
- 如果服务端没有给协议, 回应"心跳包"也还是有报错, 试试其他第三方的 websocket 服务, 确保客户端代码是 OK 的, 然后将 bug 反馈给你的客户.
cavendish0
2020-09-02 15:04:29 +08:00
@stach 感谢大佬帮助。

协议文档上我们并没有规定空包为心跳包,我们目前有 100 多台终端都连到他的 ws 服务器,全都是没用回应空包的。我极度怀疑是服务器程序的问题。

我找到客户,拿到了报错的日志,就是在这个报错之后,客户端 ws 就会断开,然后不断重连:

16:07:29.445 [http-nio-8082-exec-8] ERROR c.g.l.s.WebSocketServer - [onError,78] - 发生错误
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1208)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1142)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
16:07:29.445 [http-nio-8082-exec-8] INFO c.g.l.s.WebSocketServer - [onClose,58] - 连接 3110-440600-201112-0049 关闭!当前在线人数为 88

帮忙分析一些
感谢大佬耐心解答
stach
2020-09-03 00:43:16 +08:00
@cavendish0
从服务端的日志来看, 无疑是服务端报错了, 才导致的主动关闭连接。
(和心跳包没有关系, 虽然这个空包很诡异)

1. 让服务端排查一下网关,比如 Nginx, 看看 websocket 配置的 proxy_read_timeout 是多少秒, 网络差的情况下是否会超时, 从而导致上述问题

2. 让服务端发一下 onError,onClose,两个方法的代码截图, 排查一下是否有 Bug
(这两个方法,不会涉及什么公司机密)

3. 如果还是没有解决, 让服务端排查一下 websocket 授权的 session 管理是否出错, 导致用户新建连接和老连接的切换出错, 导致反复重连

PS:
猜测最可能是第 1 点问题, 可以依次排查, 你只要配合就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX