通过 TCP 向 Node.js 发送文件

Ste*_*afa 3 node.js

我正在努力加快 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);
    });


});
Run Code Online (Sandbox Code Playgroud)

为了简单起见,我还在 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);
});
Run Code Online (Sandbox Code Playgroud)

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

TIA

BFr*_*ree 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')
    })
});
Run Code Online (Sandbox Code Playgroud)

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

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);
        });
    })
});
Run Code Online (Sandbox Code Playgroud)

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