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
相关产品推荐
相关产品推荐

