如图: https://imgchr.com/i/dvyD6U
我是开发安卓终端的,对方开了个 ws 服务器,我连接他有时会断开报错,Protocol error 1002 。查了下,是协议错误,但是具体啥错误也没指出了。
大佬们帮忙看看
1
Githuboy 2020-09-01 16:36:34 +08:00
咨询是不是对方 ws 服务器内部错误.
|
2
jindeq 2020-09-01 18:51:29 +08:00 via Android
不要信任第三方服务,对接无数家第三方遇到过没部署服务,服务没启动,服务挂了,服务代码各种 bug,业务有问题,对方开发静默修改接口各种问题……
|
3
cavendish0 OP @jindeq 没办法,对方就是我们的客户。现在客户在重要汇报过程出现问题,就是上面的报错,然后我们被狠批了,所以我想知道到底是哪里的锅
|
4
cavendish0 OP @Githuboy 对方也是不清楚,他们服务器程序是 springboot 写的,说 ws 逻辑那一段是网上抄来的,我也是醉了
|
5
stach 2020-09-02 11:37:06 +08:00
看看抓包截图里面, 第一个 websocket 报文是什么
|
6
cavendish0 OP @stach 是一个空包。服务器发过来的
如图 https://s1.ax1x.com/2020/09/02/wSQIh9.png 很奇怪,我们客户端连上去,成功之后他就会发一个空包下来,一般情况下是没用问题的,我们也没处理 |
7
stach 2020-09-02 14:20:08 +08:00
@cavendish0 目前的过程大致是:
- 1. websocket 连接建立成功了 - 2. 服务端在成功后, 马上给客户端发送了一个`文本报文`的空包 - 3. 客户端收到空包, 没有做任何响应 - 4. 服务端可能认定客户端异常, 主动发送`close`包, 表示断开 websocket 连接 因此分析一下: - 服务端的问题: - 确认一下 2 中的空包, 是否有给到协议文档. 比如, 服务端将该空包定义为 "心跳包", 需要客户端回应一个 "心跳包" - 客户端的问题: - 如果确实服务端有要求需要响应`空包`, 如何响应, 符合服务端的要求(极有可能也是一个空包) - 如果服务端没有给协议, 回应"心跳包"也还是有报错, 试试其他第三方的 websocket 服务, 确保客户端代码是 OK 的, 然后将 bug 反馈给你的客户. |
8
cavendish0 OP @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 帮忙分析一些 感谢大佬耐心解答 |
9
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 点问题, 可以依次排查, 你只要配合就好了。 |