通过代理使用流在tcp套接字上发送文件

时间:2015-05-05 09:50:24

标签: node.js sockets proxy stream io.js

我试图用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

1 个答案:

答案 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');

如果我误解了你的问题/要求,请道歉!通过各种方式,澄清我是否误解了你,我会再试一次(或删除这个答案,这不是分心)。