我试图用node.js / io.js实现的是通过代理将文件从一个服务器发送到另一个服务器。为了避免内存缓冲,我想使用流。
代理应该能够动态连接到多个目标。应该在filedata之前发送代理的目标连接信息。
通过正常的套接字通信和缓冲,这不是问题。但是如何或通常可以用流来完成?
var net = require('net');
var fs = require('fs');
//create readstream from file
var myFile = fs.createReadStream('E:/sample.tar.gz');
// Proxy server
//####################################################################################################
var proxy = net.createServer(function (socket) {
// Create a new connection to the TCP server
var client = net.connect('9010');
// 2-way pipe between client and TCP server
socket.pipe(client).pipe(socket);
}).listen(9000);
// Targetserver
//####################################################################################################
var server = net.createServer(function (socket) {
// create filestream to write data into file
var destfile = fs.createWriteStream('E:/sample_copy.tar.gz')
socket.on('data', function (buffer) {
console.log('Get data on targetserver...');
// write buffer to file
destfile.write(buffer);
});
socket.on('end', function () {
// release file from writestream
destfile.end();
});
}).listen(9010);
// Client
//####################################################################################################
// Send file to proxy
var client = new net.Socket();
// connect to proxy
client.connect('9000', '127.0.0.1', function () {
console.log('Connection to proxy opened');
});
// send data to proxy
myFile.pipe(client);
// read response from taget
client.on('data', function(data) {
console.log('Response: ' + data);
// close the client socket completely
client.destroy();
});
// Add a 'close' event handler for the client socket
client.on('close', function() {
console.log('Connection to proxy closed');
});
也欢迎任何关于好教程的提示。
TMOE
答案 0 :(得分:0)
socket.write()
已经在引擎盖下使用了流,因此您无需做任何特别的事情。只需向它发送通常的Buffer对象或字符串,它就会使用一个流。
从io.js的当前源代码,这是使用socket.write()
时会发生什么:
Socket.prototype.write = function(chunk, encoding, cb) {
if (typeof chunk !== 'string' && !(chunk instanceof Buffer))
throw new TypeError('invalid data');
return stream.Duplex.prototype.write.apply(this, arguments);
};
并且流声明如下:
const stream = require('stream');
如果我误解了你的问题/要求,请道歉!通过各种方式,澄清我是否误解了你,我会再试一次(或删除这个答案,这不是分心)。