You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS TCP微服务无法接收Python原始Socket数据问题排查

问题原因与解决方案

你的问题核心是:NestJS的TCP微服务并不处理原始TCP套接字数据,它依赖一套内置的消息序列化协议,你的Python脚本直接发送裸文本,不符合NestJS的消息格式要求,所以dataHandler不会触发。

为什么直接发字符串不行?

NestJS的TCP传输层默认使用带长度前缀的JSON序列化格式,每个消息必须包含两部分:

  • 4字节的大端整数:表示后续JSON数据的字节长度
  • JSON字符串:必须包含pattern(对应@MessagePattern的值)和data(要传递的内容)两个字段

你的Python脚本只发了"hello"字符串,既没有长度前缀,也没有符合要求的JSON结构,NestJS无法解析,自然不会触发对应的消息处理器。

修正后的Python脚本

按照NestJS的消息格式,修改Python代码如下:

import socket
import json
import struct

HOST = '127.0.0.1'
PORT = 31123

# 构造符合NestJS要求的消息结构
message = {
    "pattern": "hello",
    "data": "hello from Python"
}
# 转成JSON字符串并编码
json_data = json.dumps(message).encode('utf-8')
# 计算字节长度,转成4字节大端的Uint32
length_prefix = struct.pack('!I', len(json_data))
# 拼接前缀和数据
full_message = length_prefix + json_data

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print(f'Sending: {message}')
    s.sendall(full_message)

验证方法

运行NestJS微服务后,执行上述Python脚本,微服务的dataHandler应该会打印Received: hello from Python。

额外说明

如果你的需求是处理原始TCP数据流(不需要NestJS的消息路由),可以放弃@MessagePattern,改用NestJS的自定义TCP适配器,或者直接使用Node.js的原生net模块创建服务器,但这已经脱离了NestJS微服务的标准消息模式。

内容的提问来源于stack exchange,提问作者piccy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:30:55