netty 可以实现长连接的 http 双向通信吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazinnnn
V2EX    Java

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

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

    大概的业务场景是这样: 服务队开启 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 么
    GBdG6clg2Jy17ua5
        5
    GBdG6clg2Jy17ua5  
       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     Solana     3992 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:24 PVG 13:24 LAX 21:24 JFK 00:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86