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

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

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

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

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

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

相关文章

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

  1. 如果客户端是标准 http1 的话,没啥办法。只能收到心跳的时候,把数据返回给客户端。不可能主动向客户端发送数据的。魔改版的 http 客户端,另说!

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

    这句什么意思,协议既要解析 tcp 的心跳又要解析 http ?

  3. @Malthael
    是这样,客户机是第三方的,长短链接都是用的 http 协议发送接收消息,因为服务端要主动下发一些东西,客户机也会主动上报一些报文,所以希望服务端都能解析出来

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

    @araaaa
    不是接受响应,两方保持 tcp 长连接时,通信的协议是 http,所以需要 request response 都能解析

  4. @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
    愿闻其详

  5. http1.1 默认就是长连接的,其实说长连接应该是指 TCP 层。证好最近在研究网管协议 tr069,能实现 http 双向通信功能,可以借鉴一下它的机制。

  6. 暂时妥协了,先控制客户机的报文长度(就是删掉上报图片),先解码成 string 实现业务再说…..

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

    不知道有没有办法实现一个能区分出 req 和 resp 的 HttpObjectDecoder 子类来…抽空研究一下

发表评论

电子邮件地址不会被公开。 必填项已用*标注