【问题标题】:Sending a file to Node.js through TCP通过 TCP 向 Node.js 发送文件
【发布时间】:2013-02-13 20:13:36
【问题描述】:

我正在尝试加快 Node.js 的速度,而我一直在尝试完成的一件事是模仿一个简单的文件传输代理,其中 Node 充当侦听服务器。这需要节点监听 tcp 套接字请求,然后接受二进制数据流并将其存储在系统中。

到目前为止,我所拥有的是,服务器仍然不存储任何内容,只是输出它接收到的数据,或者应该输出。

服务器:

var net = require('net');
var fs = require('fs');
var buffer = require('buffer');

var server = net.createServer(function() {
    console.log('server connected');
});

var HOST = '127.0.0.1';
var PORT = '9001'
var FILEPATH = '/home/steve/Downloads/';


server.listen(PORT, HOST, function() {
    //listening
    console.log('server bound to ' + PORT + '\n');

    server.on('connection', function(){
        console.log('connection made...\n')
    })

    server.on('data', function(data) {
        console.log('data received');
        console.log('data is: \n' + data);
    });


});

为了简单起见,我还在 Node 中编写了一个客户端的 hack。

客户:

var net = require('net');
var fs = require('fs');


var PORT = 9001;
var HOST = '127.0.0.1';
var FILEPATH = '/home/steve/Work/Node.js/FileTransfer/random.fil';

var client = new net.Socket()

//connect to the server
client.connect(PORT,HOST,function() {
    'Client Connected to server'

    //send a file to the server
    var fileStream = fs.createReadStream(FILEPATH);
    fileStream.on('error', function(err){
        console.log(err);
    })

    fileStream.on('open',function() {
        fileStream.pipe(client);
    });

});

//handle closed
client.on('close', function() {
    console.log('server closed connection')
});

client.on('error', function(err) {
    console.log(err);
});

当我运行它们时,我没有收到任何错误,但服务器只是创建服务器,接受连接然后关闭它。除此之外,我似乎无法弄清楚。此外,这对于传输大约 1GB 范围内的大文件来说是一个不错的解决方案,还是 Node 根本不适合这样的事情?

TIA

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我认为您在滥用服务器。当您调用 net.createServer 时,每次建立新连接时都会调用那里传递的回调。传入的参数是您侦听数据事件的连接本身。我认为这更符合您的要求:

    var net = require('net');
    var fs = require('fs');
    var buffer = require('buffer');
    
    var server = net.createServer(function(conn) {
        console.log('server connected');
    
        conn.on('data', function(data) {
            console.log('data received');
            console.log('data is: \n' + data);
        });
    });
    
    var HOST = '127.0.0.1';
    var PORT = '9001'
    var FILEPATH = '/home/steve/Downloads/';
    
    
    server.listen(PORT, HOST, function() {
        //listening
        console.log('server bound to ' + PORT + '\n');
    
        server.on('connection', function(){
            console.log('connection made...\n')
        })
    });
    

    或者,您可以在服务器连接事件中执行此操作。这也传递了一个连接对象:

    var net = require('net');
    var fs = require('fs');
    var buffer = require('buffer');
    
    var server = net.createServer(function(conn) {
        console.log('server connected');
    
    });
    
    var HOST = '127.0.0.1';
    var PORT = '9001'
    var FILEPATH = '/home/steve/Downloads/';
    
    server.listen(PORT, HOST, function() {
        //listening
        console.log('server bound to ' + PORT + '\n');
    
        server.on('connection', function(conn) {
            console.log('connection made...\n')
            conn.on('data', function(data) {
                console.log('data received');
                console.log('data is: \n' + data);
            });
        })
    });
    

    关键是,您在连接上侦听数据,而不是在服务器本身上。

    【讨论】:

    • 祝福你!从一开始就奏效了。那么,如果我继续这个例子,二进制数据到特定文件路径的管道是如何工作的呢?另外,根据您的经验,Node.js 是否适合这样的服务器,或者我应该坚持使用 Python 吗?
    • 好的,所以我已经从 fs 创建了一个可写文件流,并且我已经通过管道连接到 fs: var fileStream = fs.createWriteStream(FILEPATH + 'output.bin'); conn.pipe(fileStream);现在,我注意到了两件事。 1) 两个文件的 MD5sum 不一样,我觉得这很有趣。 2. 我收到关于连接了 11 个发射器的内存泄漏警告。 3. 我需要学习如何回应而不是评论:s
    【解决方案2】:

    我不知道为什么校验和不同,我试过但对我来说似乎是平等的。对于第二个问题,请查看http://nodejs.org/api/events.html#events_emitter_setmaxlisteners_n。 API 说:“如果为特定事件添加超过 10 个侦听器,EventEmitters 将打印警告”和“设置为零表示无限制”。

    【讨论】:

    • 感谢 Matteo,我需要重新检查一下。感谢您的第二个答案,但这引出了一个问题,我在上面的代码中在哪里设置或使用超过 10 个事件侦听器?
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2011-10-02
    相关资源
    最近更新 更多