大概的业务场景是这样: 服务队开启 tcp 长连接服务,客户机发送心跳保持长连接
客户机的相关业务协议都是 http(长连接时也是),所以需要服务端能接受 http 请求和 http 响应并正确解码,还要能发送 http 请求,不过不需要关心返回 http 响应
现在卡在 socket 管道内处理接收到的数据时只能处理一种,比如添加了 HttpRequestDecoder
的解码器之后就无法解码客户机返回的 response 响应了...
请问有啥方便的解决办法吗?
现在能想到的就是自己实现一个先 request 解码 判断一下 失败的话就扔给 response 解码,不知道开销是不是比较大
1
xuxueli 2020-04-15 22:15:51 +08:00
netty http/tcp 均支持双向通讯,可以参考这个实现: https://github.com/xuxueli/xxl-rpc
|
2
BBCCBB 2020-04-15 22:19:22 +08:00
你是说 websocket 吧
|
4
tairan2006 2020-04-15 23:00:52 +08:00 via Android
HTTP 就是短链接啊…你怎么长连接的,HTTP2/3 么
|
5
angryfish 2020-04-15 23:05:17 +08:00 via iPhone
如果客户端是标准 http1 的话,没啥办法。只能收到心跳的时候,把数据返回给客户端。不可能主动向客户端发送数据的。魔改版的 http 客户端,另说!
|
6
araaaa 2020-04-15 23:05:18 +08:00 via iPhone
不懂,为什么服务端需要接受响应
|
7
Malthael 2020-04-16 08:23:08 +08:00
**现在卡在 socket 管道内处理接收到的数据时只能处理一种,比如添加了 HttpRequestDecoder 的解码器之后就无法解码客户机返回的 response 响应了...**
这句什么意思,协议既要解析 tcp 的心跳又要解析 http ? |
8
yazinnnn OP |
9
zhaishunqi 2020-04-16 09:24:00 +08:00
@BBCCBB
纯看标题我也觉得说的是 websocket... |
10
Ariver 2020-04-16 09:40:38 +08:00 via iPhone
lz 你的网络基础需要加强啊
|
11
yuankui 2020-04-16 10:38:40 +08:00
https://github.com/zhoumengkang/netty-websocket
没试过,不知道这个行不行? |
12
yazinnnn OP @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 愿闻其详 |
14
VictorFan 2020-04-16 10:53:05 +08:00
http1.1 默认就是长连接的,其实说长连接应该是指 TCP 层。证好最近在研究网管协议 tr069,能实现 http 双向通信功能,可以借鉴一下它的机制。
|
15
yazinnnn OP 暂时妥协了,先控制客户机的报文长度(就是删掉上报图片),先解码成 string 实现业务再说.....
发现了 HttpObjectDecoder 这个类,不过是抽象类,netty 的几个子类都直接区分了 request 和 response,还有一个流传输协议 不知道有没有办法实现一个能区分出 req 和 resp 的 HttpObjectDecoder 子类来...抽空研究一下 |
16
xcstream 2020-04-16 16:04:40 +08:00
http 的话搜 comet 关键词可以找到答案
|