在 Nodejs 中从套接字接收大量二进制数据
Receive large binary data from socket in Nodejs
我想从 tcp 套接字接收二进制数据(如 .pdf 或 .doc),代码如下:
发送文件:
fs.readFile(path, function (err, data) {
var client = new net.Socket();
client.connect(user_port, user_ip, function () {
client.write(data, 'binary');
client.destroy();
});
});
接收文件:
net.createServer(function(socket){
socket.setEncoding('binary');
socket.on('data', function (data) {
var file_data = new Buffer(data, 'binary');
fs.appendFile(utils.getUserDir() + '/my_file.doc', file_data);
});
socket.on('error', function(err){
console.log(err.message);
})
}).listen(utils.getPort(), utils.getExternalIp());
由于文件对于只有一个 tcp 套接字来说太大了,它们是用多个数据包发送的,实际上同一个文件有多个 'data' 事件。
我认为可以将每个 Buffer()
数据附加到一个文件中,但是当我打开 .doc 时,他已损坏或其中包含二进制文件。
PS:我无法使用 Buffer().concat
并在之后保存文件,因为我不知道哪个数据包是最后一个...
谢谢
对于发送这样的文件,最好将它们流式传输而不是将其全部缓冲到内存中然后发送。 (此外,您不需要 'binary'
编码参数,因为 fs.readFile()
默认为您提供一个缓冲区)
例如:
var client = new net.Socket();
client.connect(user_port, user_ip, function() {
fs.createReadStream(path).pipe(client);
});
// ...
net.createServer(function(socket){
socket.pipe(fs.createWriteStream(utils.getUserDir() + '/my_file.doc'));
socket.on('error', function(err){
console.log(err.message);
});
}).listen(utils.getPort(), utils.getExternalIp());
我想从 tcp 套接字接收二进制数据(如 .pdf 或 .doc),代码如下:
发送文件:
fs.readFile(path, function (err, data) {
var client = new net.Socket();
client.connect(user_port, user_ip, function () {
client.write(data, 'binary');
client.destroy();
});
});
接收文件:
net.createServer(function(socket){
socket.setEncoding('binary');
socket.on('data', function (data) {
var file_data = new Buffer(data, 'binary');
fs.appendFile(utils.getUserDir() + '/my_file.doc', file_data);
});
socket.on('error', function(err){
console.log(err.message);
})
}).listen(utils.getPort(), utils.getExternalIp());
由于文件对于只有一个 tcp 套接字来说太大了,它们是用多个数据包发送的,实际上同一个文件有多个 'data' 事件。
我认为可以将每个 Buffer()
数据附加到一个文件中,但是当我打开 .doc 时,他已损坏或其中包含二进制文件。
PS:我无法使用 Buffer().concat
并在之后保存文件,因为我不知道哪个数据包是最后一个...
谢谢
对于发送这样的文件,最好将它们流式传输而不是将其全部缓冲到内存中然后发送。 (此外,您不需要 'binary'
编码参数,因为 fs.readFile()
默认为您提供一个缓冲区)
例如:
var client = new net.Socket();
client.connect(user_port, user_ip, function() {
fs.createReadStream(path).pipe(client);
});
// ...
net.createServer(function(socket){
socket.pipe(fs.createWriteStream(utils.getUserDir() + '/my_file.doc'));
socket.on('error', function(err){
console.log(err.message);
});
}).listen(utils.getPort(), utils.getExternalIp());