Node.js TCP 客户端的行为与 Netcat/Telnet 不同

Posted

技术标签:

【中文标题】Node.js TCP 客户端的行为与 Netcat/Telnet 不同【英文标题】:Node.js TCP client behaving differently from Netcat/Telnet 【发布时间】:2012-05-30 08:31:57 【问题描述】:

我正在向自定义协议 TCP 服务器发出换行符分隔的文本命令。在下面的示例中,我发出 2 个命令并收到回写的响应。它在 telnet 和 netcat 中按预期工作:

$ nc localhost 1234
command1
command2
theresponse

使用 Node.js 连接时,相同的工作流程不起作用:

var net = require('net');
var client = net.connect(1234, 'localhost');

client.on('data', function(data) 
    console.log('data:', data.toString());
);

client.on('error', function(err) 
    console.log('error:', err.message);
);

client.write('command1\n');
client.write('command2\n');

我希望在运行这个程序后我会看到“数据:响应”写入控制台,但是,什么都没有打印出来。我也尝试过在“连接”回调中执行写入,但结果相同。奇怪的是,当我在 Node REPL 中尝试这个时......它可以工作:

$ node
> var net = require('net')
undefined
> var client = net.connect(1234, 'localhost')
undefined
> client.on('data', function(data)  console.log('data:', data.toString()); )
 ... 
> client.write('command1\n')
true
> client.write('command2\n')
true
> data: theresponse

有人对这种奇怪的行为有想法吗?

谢谢。

-斯科特

【问题讨论】:

根据您的描述,如果两个或多个命令在一个数据包中到达,听起来您的 TCP 服务器会出现问题。你能显示服务器代码吗? 我无权访问服务器代码,但我相信您是正确的。服务器可能假设到达的每个“数据”缓冲区都是一个命令。谢谢。 我一定遗漏了一些东西,但如果是服务器的错,为什么它在 Node.js REPL 中工作? 与它在 Netcat 中工作的原因相同 - 键入下一行需要一点时间。在那段时间里,第一个命令大概被刷新到了服务器。 【参考方案1】:

在不测试代码的情况下,我推测是 Node.js 的异步特性让您感到厌烦。在 REPL 中,连接发生在您输入另一个命令之前。在上面的代码中,您是在连接之前编写的。

把上面的代码改成这样:

var net = require('net');
var client = net.connect(1234, function()
   client.on('data', function(data) 
     console.log('data:', data.toString());
   );

   client.on('error', function(err) 
     console.log('error:', err.message);
   );

   client.write('command1\n');
   client.write('command2\n');
);

【讨论】:

我尝试在“连接”回调中执行写入,但结果相同。

以上是关于Node.js TCP 客户端的行为与 Netcat/Telnet 不同的主要内容,如果未能解决你的问题,请参考以下文章

Node.js的net模块

Node.js实现WebSocket客户端

Node.js之HTTP请求与响应

Node.js Heroku 应用程序上的 TCP 连接

Node.js 网络编程(下)实现TCPUDPWebSocket的创建

多台机器上的 Node.js tcp 套接字服务器