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

NodeJS Net模块发送的TCP消息未被Delphi服务端读取如何解决?

问题原因

  • Delphi 中 Indy 组件的 ReadLn 方法是按行读取逻辑,默认会一直阻塞等待,直到接收到换行终止符(默认匹配\n或者\r\n)才会返回读取到的完整行内容。你当前 Node.js 代码发送的消息末尾没有追加换行符,所以服务端认为消息还没有传输完成,一直处于等待状态,无法返回读取结果。
  • TCP 是流式传输协议,本身没有内置消息边界,业务层必须自行约定消息分隔规则,ReadLn 就是基于换行符作为分隔规则的实现。

解决方案

方案一(推荐,改动最小)

修改 Node.js 发送逻辑,在消息末尾追加服务端期望的换行终止符,示例代码如下:

var enviarMensagemTCP = function (mensagem, port, host) {
  const Net = require("net");

  const client = Net.createConnection({ port: port, host: host });

  console.log(`enviar mensagem TCP para ${host}:${port}`);
  client.on("connect", function () {
    // 末尾追加 \r\n 适配Delphi ReadLn的默认换行规则
    client.write(`${mensagem}\r\n`, () => {
      client.destroy();
    });
  });

  client.on("error", function (error) {
    client.destroy();
  });
};

方案二

如果业务场景不允许在消息末尾追加换行符,可以修改Delphi服务端的读取逻辑,不使用ReadLn,改用ReadBytes、ReadBuffer等按长度读取的方法,需要提前在Node.js和Delphi两端约定好消息长度规则(比如前4个字节存储消息体长度,服务端先读4字节拿到长度再读对应长度的内容)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:05