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

netty 可以实现长连接的 http 双向通信吗?

  •  
  •   yazinnnn · 2020-04-15 21:17:03 +08:00 · 4300 次点击
    这是一个创建于 1712 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大概的业务场景是这样: 服务队开启 tcp 长连接服务,客户机发送心跳保持长连接

    客户机的相关业务协议都是 http(长连接时也是),所以需要服务端能接受 http 请求和 http 响应并正确解码,还要能发送 http 请求,不过不需要关心返回 http 响应

    现在卡在 socket 管道内处理接收到的数据时只能处理一种,比如添加了 HttpRequestDecoder 的解码器之后就无法解码客户机返回的 response 响应了...

    请问有啥方便的解决办法吗?

    现在能想到的就是自己实现一个先 request 解码 判断一下 失败的话就扔给 response 解码,不知道开销是不是比较大

    16 条回复    2020-04-16 16:04:40 +08:00
    xuxueli
        1
    xuxueli  
       2020-04-15 22:15:51 +08:00
    netty http/tcp 均支持双向通讯,可以参考这个实现: https://github.com/xuxueli/xxl-rpc
    BBCCBB
        2
    BBCCBB  
       2020-04-15 22:19:22 +08:00
    你是说 websocket 吧
    yazinnnn
        3
    yazinnnn  
    OP
       2020-04-15 22:25:30 +08:00
    @xuxueli
    是 tcp 的长连接保持双向通信,但是通信协议是 http 协议,请问大佬有解决思路吗😂
    tairan2006
        4
    tairan2006  
       2020-04-15 23:00:52 +08:00 via Android
    HTTP 就是短链接啊…你怎么长连接的,HTTP2/3 么
    angryfish
        5
    angryfish  
       2020-04-15 23:05:17 +08:00 via iPhone
    如果客户端是标准 http1 的话,没啥办法。只能收到心跳的时候,把数据返回给客户端。不可能主动向客户端发送数据的。魔改版的 http 客户端,另说!
    araaaa
        6
    araaaa  
       2020-04-15 23:05:18 +08:00 via iPhone
    不懂,为什么服务端需要接受响应
    Malthael
        7
    Malthael  
       2020-04-16 08:23:08 +08:00
    **现在卡在 socket 管道内处理接收到的数据时只能处理一种,比如添加了 HttpRequestDecoder 的解码器之后就无法解码客户机返回的 response 响应了...**

    这句什么意思,协议既要解析 tcp 的心跳又要解析 http ?
    yazinnnn
        8
    yazinnnn  
    OP
       2020-04-16 08:51:24 +08:00
    @Malthael
    是这样,客户机是第三方的,长短链接都是用的 http 协议发送接收消息,因为服务端要主动下发一些东西,客户机也会主动上报一些报文,所以希望服务端都能解析出来

    比如,虽然是 tcp 心跳,但是客户机是包装成 http 请求发送过来的


    @araaaa
    不是接受响应,两方保持 tcp 长连接时,通信的协议是 http,所以需要 request response 都能解析
    zhaishunqi
        9
    zhaishunqi  
       2020-04-16 09:24:00 +08:00
    @BBCCBB
    纯看标题我也觉得说的是 websocket...
    Ariver
        10
    Ariver  
       2020-04-16 09:40:38 +08:00 via iPhone
    lz 你的网络基础需要加强啊
    yuankui
        11
    yuankui  
       2020-04-16 10:38:40 +08:00
    https://github.com/zhoumengkang/netty-websocket
    没试过,不知道这个行不行?
    yazinnnn
        12
    yazinnnn  
    OP
       2020-04-16 10:41:46 +08:00
    @zhaishunqi
    客户机是第三方的,不支持 ws....

    客户机发送的 tcp 心跳报文是这样的
    ```
    DefaultHttpRequest(decodeResult: success, version: HTTP/1.1)
    POST /*******/HeartReportInfo HTTP/1.1
    Content-Type: application/json
    Content-Length: 166
    ```

    自主上报的业务报文是这样的
    ```
    DefaultHttpRequest(decodeResult: success, version: HTTP/1.1)
    POST /******/Verification HTTP/1.1
    Content-Length: 328196
    Content-Type: text/plain
    Connection: close
    ...

    客户机能接收的业务报文也是类似的 http 请求
    ```


    @Ariver
    愿闻其详
    yazinnnn
        13
    yazinnnn  
    OP
       2020-04-16 10:42:23 +08:00
    @yuankui
    这个不行,三方的客户机不支持 ws...
    VictorFan
        14
    VictorFan  
       2020-04-16 10:53:05 +08:00
    http1.1 默认就是长连接的,其实说长连接应该是指 TCP 层。证好最近在研究网管协议 tr069,能实现 http 双向通信功能,可以借鉴一下它的机制。
    yazinnnn
        15
    yazinnnn  
    OP
       2020-04-16 11:33:19 +08:00
    暂时妥协了,先控制客户机的报文长度(就是删掉上报图片),先解码成 string 实现业务再说.....

    发现了 HttpObjectDecoder 这个类,不过是抽象类,netty 的几个子类都直接区分了 request 和 response,还有一个流传输协议

    不知道有没有办法实现一个能区分出 req 和 resp 的 HttpObjectDecoder 子类来...抽空研究一下
    xcstream
        16
    xcstream  
       2020-04-16 16:04:40 +08:00
    http 的话搜 comet 关键词可以找到答案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5497 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.