netty 的问题

2019-12-20 16:14:27 +08:00
 wuwudeqi

现在我是用 netty 服务端来和硬件做通讯,用 spring boot 框架,硬件每次连接上线,我通过 HashMap<String, Channel> channelHashMap,将 ip 与对应的 channel 存储,当我需要主动发起请求,就根据 ip 去 map 中拿 channel,然后发送数据,因为会有很多设备连接会上报消息,那么我该怎么判断在 RequestDecoder 收到的消息是我刚刚发出的消息

3836 次点击
所在节点    Java
7 条回复
xzg
2019-12-20 16:53:27 +08:00
不存在你想的那个问题,设备上报的数据是通过 decoder 是 ChannelInbound 的 handler,你下发的数据 write 是通过 ChannelHandlerContext 写入 ChannelOutbound。下面是官方的图

I/O Request
via Channel or
ChannelHandlerContext
|
+---------------------------------------------------+---------------+
| ChannelPipeline | |
| \|/ |
| +---------------------+ +-----------+----------+ |
| | Inbound Handler N | | Outbound Handler 1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler N-1 | | Outbound Handler 2 | |
| +----------+----------+ +-----------+----------+ |
| /|\ . |
| . . |
| ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
| [ method call] [method call] |
| . . |
| . \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 2 | | Outbound Handler M-1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 1 | | Outbound Handler M | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
+---------------+-----------------------------------+---------------+
| \|/
+---------------+-----------------------------------+---------------+
| | | |
| [ Socket.read() ] [ Socket.write() ] |
| |
| Netty Internal I/O Threads (Transport Implementation) |
+-------------------------------------------------------------------+
xzg
2019-12-20 16:54:29 +08:00
算了 这个排版贼鸡儿恶心
wysnylc
2019-12-20 17:52:08 +08:00
把 HashMap 换成 ConCurrentHashMap 或者 ConCurrentSkipListMap
JYDXL
2019-12-20 19:52:31 +08:00
没太看懂要表达的意思,如果说的是请求-响应模式,tcp 这种全双工的原本就不是一一对应的,一般是在协议里放一个请求序号字段,对应的返回用同一个序号来区分。
Jimmy2Angel
2019-12-20 20:04:51 +08:00
先把问题搞清楚,什么叫“该怎么判断在 RequestDecoder 收到的消息是我刚刚发出的消息”。简单来说,你 write 的数据会经过 encoder 编码后下发给设备,设备上传的数据先经过 decoder 解码成你要的格式数据,然后信息均是从设备上传的数据报文中解析出来的,包括设备 ID (哪个设备的数据)、消息 ID (什么数据)等
MoHen9
2019-12-20 21:07:15 +08:00
一般 TCP 连接建立后会在自己的线程读写消息,所以你直接将连接的设备信息放在 handler 中即可,只要 handler 不共享,就是每个 TCP 对应一个 handler
ZiLong
2019-12-22 18:04:12 +08:00
给消息一个标志符如 Id?

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

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

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

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

© 2021 V2EX