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

2020-04-15 21:17:03 +08:00
 yazinnnn

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

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

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

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

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

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

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

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


@araaaa
不是接受响应,两方保持 tcp 长连接时,通信的协议是 http,所以需要 request response 都能解析
zhaishunqi
2020-04-16 09:24:00 +08:00
@BBCCBB
纯看标题我也觉得说的是 websocket...
Ariver
2020-04-16 09:40:38 +08:00
lz 你的网络基础需要加强啊
yuankui
2020-04-16 10:38:40 +08:00
https://github.com/zhoumengkang/netty-websocket
没试过,不知道这个行不行?
yazinnnn
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
2020-04-16 10:42:23 +08:00
@yuankui
这个不行,三方的客户机不支持 ws...
VictorFan
2020-04-16 10:53:05 +08:00
http1.1 默认就是长连接的,其实说长连接应该是指 TCP 层。证好最近在研究网管协议 tr069,能实现 http 双向通信功能,可以借鉴一下它的机制。
yazinnnn
2020-04-16 11:33:19 +08:00
暂时妥协了,先控制客户机的报文长度(就是删掉上报图片),先解码成 string 实现业务再说.....

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

不知道有没有办法实现一个能区分出 req 和 resp 的 HttpObjectDecoder 子类来...抽空研究一下
xcstream
2020-04-16 16:04:40 +08:00
http 的话搜 comet 关键词可以找到答案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX