V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cavendish0
V2EX  ›  程序员

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

  •  
  •   cavendish0 · 256 天前 · 1449 次点击
    这是一个创建于 256 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    大佬们帮忙看看

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

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

    因此分析一下:
    - 服务端的问题:
    - 确认一下 2 中的空包, 是否有给到协议文档. 比如, 服务端将该空包定义为 "心跳包", 需要客户端回应一个 "心跳包"
    - 客户端的问题:
    - 如果确实服务端有要求需要响应`空包`, 如何响应, 符合服务端的要求(极有可能也是一个空包)
    - 如果服务端没有给协议, 回应"心跳包"也还是有报错, 试试其他第三方的 websocket 服务, 确保客户端代码是 OK 的, 然后将 bug 反馈给你的客户.
    cavendish0
        8
    cavendish0   255 天前
    @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
        9
    stach   255 天前
    @cavendish0
    从服务端的日志来看, 无疑是服务端报错了, 才导致的主动关闭连接。
    (和心跳包没有关系, 虽然这个空包很诡异)

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

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

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

    PS:
    猜测最可能是第 1 点问题, 可以依次排查, 你只要配合就好了。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1851 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:02 · PVG 10:02 · LAX 19:02 · JFK 22:02
    ♥ Do have faith in what you're doing.