2012-05-23 71 views
1

我正在向自定義協議TCP服務器發出換行符分隔的文本命令。在下面的例子中,我發出2個命令,並收到寫回的回覆。它的工作原理如預期telnet和netcat的:Node.js TCP客戶端的行爲與Netcat/Telnet的行爲不同

$ 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'); 

我預計運行這個程序後,我會看到「數據:迴應「寫入控制檯,但是,沒有任何事情是打印出來的。我也試着在「連接」回調中執行寫操作,但是我得到了相同的結果。好奇的是,當我嘗試這樣的節點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 

任何人有這個古怪的動作的想法?

謝謝。

斯科特

+0

從你的描述,是聽起來像你的TCP服務器有問題,如果兩個或多個命令在一個數據包到達。你能顯示服務器代碼嗎? – stewe

+0

我無法訪問服務器代碼,但我相信你是正確的。服務器可能假設每個到達的「數據」緩衝區都是單個命令。謝謝。 – scttnlsn

+0

我必須缺少一些東西,但是如果它是服務器的錯,爲什麼它在Node.js REPL中工作? –

回答

2

未經測試的代碼,我假設它是在咬你的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'); 
}); 
+0

我試圖在「連接」回調中執行寫入,但經歷了相同的結果。 – scttnlsn