2012-11-07 33 views
3

我做了這一個Java客戶端發送的圖像的簡單的NodeJS TCP服務器:的NodeJS TCP服務器,昂達小塊

encodedImage = <a base64 encoded image> 
out.write("IMG;" + encodedImage); 
out.flush(); 

我的NodeJS服務器如下:

net.createServer(function(TCPSocket){ 
     TCPSocket.on("data", function(data){ 
      console.log("TCP Recieved: " + data.length);  
     }); 
}).listen(5000); 

然而,即使我發送的所有數據,並立即進行沖洗,輸出如下:

TCP Recieved: 13 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1472 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 

我希望它接受她在一個簡單的塊,但我假設由於NodeJS的事件處理機制而發生這種情況,爲單個塊發送的數據實現單塊數據的最佳方式是什麼?據我所知,TCP窗口可能比1344字節的數據大得多。我想使用標頭值作爲HTTP,所以我知道長度廣告構建我想要的對象。

+0

這是向TCP作品。不僅在節點上,而且在任何地方。你無法控制這一點。你不應該嘗試。在編寫tcp服務器時,總是假定數據以隨機大小的塊進入。 – 2013-05-02 00:18:44

+0

是的,我知道TCP是一個流媒體協議,但我想知道是否有一種方法來觸發事件時接收特定數量的數據,如Java的套接字讀取,但我需要做一個緩衝機制 – Mustafa

回答

7

你是對的,在Node中數據會分塊。您需要保留一個緩衝區,連接所有進入的塊,然後在套接字關閉時將數據寫入文件系統。下面是能夠接收圖像的例子:

net = require('net'); 
fs = require('fs'); 

net.createServer(function(socket){ 
    var buffer = new Buffer(0, 'binary'); 

    socket.on("data", function(data){ 
    buffer = Buffer.concat([buffer, new Buffer(data,'binary')]); 
    }); 

    socket.on("end", function(data) { 
    fs.writeFile("image.jpg", buffer, function(err) { 
     if(err) { 
     console.log(err); 
     } else { 
     console.log("Socket[" + socket.name + "] closed, wrote data out to sinfo.data"); 
     } 
    }); 

    }); 

}).listen(5000); 

console.log('ready'); 

我發送的圖像用它來netcat

$ netcat localhost 5000 < input.jpg 
+4

爲什麼你會不會在收到它們時將這些塊寫入磁盤?將整個圖像緩衝在內存中然後寫入磁盤是浪費資源。 – josh3736

+1

@ josh3736:你的評論正是我想要的。 我將一個base64編碼的套接字流從客戶端發送到服務器。服務器應該從傳入的塊中寫入一個映像文件。 你知道如何正確地將這些塊寫入writestream來保存ram嗎? 這是我的問題:stackoverflow.com/questions/22214267/write-base64-chunks-into-writestream – Flexer

+1

我錯過了什麼嗎?你不能只用管道嗎? socket.pipe(fs.createWriteStream(filePath)); – CharlesTWall3