3

私はNode.jsの速度を上げようとしていますが、達成しようとしていることの1つは、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でもクライアントのハックを作成しました。

クライアント:

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

チェックサムが異なる理由はわかりませんが、試してみましたが、私には等しいようです。2 番目の質問については、このhttp://nodejs.org/api/events.html#events_emitter_setmaxlisteners_nを確認してください。API は次のように述べています。

于 2013-03-26T09:37:26.720 に答える