【问题标题】:Send file over tcp socket via proxy with streams通过带有流的代理通过 tcp 套接字发送文件
【发布时间】:2015-07-14 23:43:03
【问题描述】:

我尝试使用 node.js/io.js 实现的目的是通过代理将文件从一台服务器发送到另一台服务器。为了避免内存缓冲,我想使用流。

代理应该能够动态连接到多个目标。代理的目标连接信息应该在文件数据之前发送。

通过正常的套接字通信和缓冲,这不是问题。但是如何或一般情况下可以使用流来完成?

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

【问题讨论】:

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


    【解决方案1】:

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

    如果我误解了您的问题/要求,我们深表歉意!无论如何,澄清我是否误解了你,我会再试一次(或删除这个答案,以免分心)。

    【讨论】:

    • 感谢您的回复。到目前为止,总体上设法使用流。问题在于连接处理,例如在代理上将它们相互隔离。通常我会使用单独的线程来执行此操作,其中每个线程都是源-> 代理-> 目标和返回之间的链。但是在节点中这似乎是不可能的..
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2020-04-28
    • 2017-03-14
    • 1970-01-01
    • 2015-01-30
    • 2016-02-15
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多