2015-05-05 3 views
1

То, что я пытался достичь с помощью node.js/io.js, - это отправить файл с одного сервера на другой через прокси. Чтобы избежать буферизации памяти, я хочу использовать потоки.Отправить файл через сокет tcp через прокси с потоками

Прокси-сервер должен иметь возможность динамически подключаться к нескольким объектам. Информация о целевом соединении для прокси должна быть отправлена ​​до 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

socket.write() уже использует потоки под капотом, так что вам не нужно делать ничего особенного. Просто отправьте его обычным буфером или строкой, и он будет использовать поток.

Из текущего исходного кода 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'); 

Извинения, если я неправильно понял ваш вопрос/требования! Во что бы то ни стало, уточните, неправильно ли я вас понял, и я попробую еще раз (или удалю этот ответ, чтобы это не было отвлечением).

+0

Спасибо за ответ. До сих пор управлял потоками. Проблема связана с обработкой соединений, например, ограждением их друг от друга на прокси. Обычно я бы делал это с отдельными потоками, где каждый протектор представляет собой цепочку между исходным -> прокси -> цель и обратно. Но в узле это кажется невозможным. – tmoe

Смежные вопросы