2010-07-26 33 views
10

我想使用Nodejs實現簡單的客戶端 - 服務器連接。 但我遇到以下問題。Nodejs streaming

考慮代碼

server.js:

var net = require('net'), 
    sys = require('sys'); 

    net.createServer(onConnection).listen(8124); 

    function onConnection(socket) { 
    socket.setNoDelay(true); 

    socket.addListener("connect", function() { 
     sys.puts('client connected: ' + this.remoteAddress); 
    }); 

    socket.addListener("data", function (data) { 
     sys.puts("message: \n" + data + "\n - end of msg."); 
    }); 

    socket.addListener("end", function() { 
     sys.puts('end of connection'); 
     this.end(); 
    }); 
    } 

    sys.puts('Server running at 127.0.0.1:8124'); 

client.js:

var net = require('net'), 
sys = require('sys'); 

var stream = net.createConnection(8124); 
stream.addListener("connect", function(){ 
sys.puts('connected'); 

stream.write('a'); 
    stream.flush(); 
stream.write('b'); 
    stream.flush(); 

}); 

stream.addListener("data", function(data){ 
sys.puts("Message: \n" + data + "\n - end of msg."); 
}); 

當我運行client.js我有時會只有一個消息 'AB',而不是兩個消息'a'和'b'。

有沒有一些「正確的方法」來解決這個問題?

+0

你甚至可能會收到'ba'!!沒有受讓人按照您發送的順序接收數據。 – 2011-07-25 10:43:19

+4

@MortezaM。實際上TCP/IP *保證*數據將按照它發送的順序被接收,所以在這種情況下,它將始終是'ab'。 – Kornel 2013-06-17 21:38:55

回答

10

TCP是協議。管道一端的單個write可能導致另一端有多個「讀取」,反之亦然。你必須通過在消息中包含長度來明確地告訴對方多少個字節;或提供容易識別的消息分隔符。無論如何,你需要閱讀一個循環。

+0

所以,唯一的'正確的方法'是連接傳入的數據並將其解析爲一個整體?我想到了這一點,只是想確保沒有其他方法:) – Dan 2010-07-26 13:49:14

+2

你必須把它當作一個流。解析字節,當發現完整的消息時作出反應。 – 2010-07-26 14:16:09