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

Sockets Node.js TCP客户端的行为与Netcat/Telnet不同,sockets,node.js,tcp,telnet,netcat,Sockets,Node.js,Tcp,Telnet,Netcat,我正在向自定义协议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)

我正在向自定义协议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');
我希望在运行这个程序之后,我会看到写入控制台的“data:theresponse”,但是,没有任何内容被打印出来。我也尝试过在“connect”回调中执行写操作,但得到了相同的结果。奇怪的是,当我在节点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
有人对这种奇怪的行为有想法吗

谢谢


-Scott

在不测试代码的情况下,我认为是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');
});

从您描述的情况来看,如果一个数据包中有两个或多个命令到达,您的TCP服务器似乎有问题。你能出示服务器代码吗?我没有访问服务器代码的权限,但我相信你是正确的。服务器可能假设到达的每个“数据”缓冲区都是一个命令。谢谢。我肯定遗漏了什么,但如果是服务器的故障,为什么它在Node.js REPL中工作?原因与它在Netcat中工作的原因相同-键入下一行需要一点时间。在这段时间里,第一个命令可能被刷新到服务器上。我尝试在“connect”回调中执行写入操作,但得到了相同的结果。