我创建了一个简单的NodeJS TCP服务器,Java Client发送一个图像:
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,所以我知道ad构造我想要的对象的长度。
答案 0 :(得分: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