Node-RED作为TCP服务器时如何处理入站消息并回发响应
Node-RED TCP服务器模式下入站消息处理与存活检测实现方案
完全可以实现,Node-RED原生TCP节点本身就支持服务器模式下同时处理入站、出站流量,不需要额外安装自定义节点,具体实现逻辑如下:
- 基础节点配对配置
不要单独部署TCP out节点,需要搭配同配置的TCP in节点共同使用:- 新建一个TCP配置项,连接模式选择
Listen on(即服务器模式),填写你要监听的端口号 - 将TCP in、TCP out两个节点都关联到这个新建的配置项,同时两个节点都勾选「共享连接」选项,确保两个节点绑定到同一组客户端连接,不会出现端口占用问题
- 配置TCP in的数据拆分规则(按字符拆分、固定长度、流模式都可以,根据你的业务报文格式选择即可)
- 新建一个TCP配置项,连接模式选择
- 被动响应式存活检测实现
所有客户端发来的入站消息都会从TCP in节点输出:- 消息载荷
msg.payload为客户端发送的实际内容 msg._session字段为当前连接的唯一会话标识,用来区分不同的客户端连接
你只需要在TCP in节点后接一个switch节点,匹配msg.payload等于is alive?的消息,匹配通过后将响应内容(比如200 alive)赋值给msg.payload,再把消息流接到TCP out节点即可。TCP out节点会自动根据消息自带的msg._session标识,把响应精准发回对应发起请求的客户端,不会串流到其他已连接的客户端。
- 消息载荷
- 主动探活的补充实现
如果你需要服务端主动发起心跳检测,不用等客户端上报,可以加个定时注入节点配合上下文变量实现:- 每次TCP in收到任意客户端的消息,就把当前时间戳存到流上下文里,key对应
msg._session的值,作为该客户端的最后活跃时间 - 定时注入节点每30秒触发一次,遍历上下文里存的所有会话记录,给每个会话发心跳探测包,同时对比当前时间和最后活跃时间,如果某客户端超过90秒没有任何消息响应,就可以触发连接断开逻辑,清理僵尸连接。
- 每次TCP in收到任意客户端的消息,就把当前时间戳存到流上下文里,key对应
踩坑提示:不要给TCP in和TCP out分别创建两个同端口的服务器模式配置,会直接触发端口占用报错,两个节点必须复用同一个TCP配置条目。
内容的提问来源于stack exchange,提问作者Pol Rodoreda
相关产品推荐
相关产品推荐

