3

我正在尝试加快 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

4

2 回答 2

6

我认为你在滥用服务器。当您调用 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);
        });
    })
});

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

于 2013-02-13T22:25:32.007 回答
0

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

于 2013-03-26T09:37:26.720 回答