2

ストリーム ファイル ストリーミング用にノード js、socket.io、および fs を使用した簡単な帯域幅テストがあります。私の目標は、私が行ったギガビットの速度に到達することですが、私の問題は、データを非常に速くストリーミングしているため、クライアント側でブラウザーをクラッシュさせていることです。(FF と Chrome) 何かが足りないのか、非効率的なコードを書いているだけなのかわかりません。

クライアント側のデータには関心がないので、データを /dev/null に直接送信して問題を解決するのに相当する JavaScript があるかどうかは疑問ですが、そのようなことは知りません。

誰か提案がありますか、似たようなものに遭遇しましたか?

サーバ側:

var io = require('socket.io').listen(81), fs = require('fs');
var connectedsocketlist = []; 

io.sockets.on('connection', function (socket) {
    connectedsocketlist.push(socket);
    var readStream = fs.createReadStream("2Gig.txt", {
            'encoding': 'base64', 
            mode: 0666, 
            autoClose: true,
            bufferSize: 1024});

    console.log(io.sockets.manager.rooms);
    io.set('log level', 2, 'transports', ['websocket']); // reduce logging

    readStream.on('data', function(data) {
            socket.volatile.send(data);
    }); 
});

クライアント側:

<html>
<script type="text/javascript" src="js/socket.io.js"></script>
<script type="text/javascript" src="js/jquery-2.0.1.min.js"></script>
<script>
    var SPEED = {};
    var startTime;
    SPEED.bCount = 0;

    var socket = io.connect('http://10.0.1.22:81',{resource:'socket.io', 'force new     connection':false});

    socket.on('message', function (data) {
            SPEED.bCount = SPEED.bCount + data.length;
            SPEED.bitsPerSecon = Math.floor( (SPEED.bCount * 8)  / Math.floor(($.now() -  SPEED.startTime) / 1000)*100/100); 
            $("#speed").text(Math.floor (SPEED.bitsPerSecon /1000 /1000 ) * 100 /100 );
    });
</script>
<body>
<div style="solid #ccc" id="speed">&nbsp;</div>
</body></html>

スクリーンショット 2013 年 8 月 16 日午前 10 時 58 分 20 秒

4

1 に答える 1

2

スクリプトのいくつかの論理エラーを修正し、デフォルトの高速サーバーにラップした後、サーバーからクライアントに 2.2 GB のファイルを転送している間、メモリに大きな増加は見られませんでした。

socket.volatile.send() と socket.volatile.emit() の両方で実行しましたが、速度に違いはありませんでした。

Server: node.js v0.8.6 on Fedora release 11 (Leonidas)
Client: Google Chrome Version 28.0.1500.95 m

サーバー ソース: app.js

/**
 * Module dependencies.
 */

var express=require('express'),
    app=express(),
    http=require('http'),
    server=http.createServer(app),
    io=require('socket.io').listen(server),
    routes=require('./routes'),
    user=require('./routes/user'),
    path=require('path'),
    fs=require('fs');

// all environments -- express defaults
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.errorHandler());

app.get('/', routes.index);
app.get('/users', user.list);

var connectedsocketlist=[];

io.sockets.on('connection', function (socket) {

    console.log('socket connected');

    connectedsocketlist.push(socket);

    var readStream=fs.createReadStream("./public/2Gig.txt", {
        'encoding': 'base64',
        mode:       0666,
        autoClose:  true,
        bufferSize: 1024
    });

     console.log(io.sockets.manager.rooms);

     io.set('log level', 2, 'transports', ['websocket']); // reduce logging

     readStream.on('data', function(data) {
         //socket.volatile.send(data);
         socket.volatile.emit('message',data);
     });

     readStream.on('end',function(){
        console.log('DATA COMPLETE');
        socket.volatile.emit('data_complete');
     });

 });

// start it up...
server.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

クライアント ソース: test.html

<html>
<head>
</head>
<body>
    <div>Elapsed Seconds:<span style="color:#ccc;background-color:#000;" id="seconds">&nbsp;</span></div>
    <div>Bits per second:<span style="color:#ccc;background-color:#000;" id="bitSpeed">&nbsp;</span></div>
    <div>Bytes per second:<span style="color:#ccc;background-color:#000;" id="byteSpeed">&nbsp;</span></div>
    <div id="msg">&nbsp;</div>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>
    <script>
        var socket=io.connect()
            SPEED={
                startTime:Date.now(),
                elapsedSeconds:0,
                totalBits:0,
                totalBytes:0,
                bitsPerSecond:0,
                bytesPerSecond:0
            };

        socket.on('message', function (data) {
            var numBytes=data.length,
                now=Date.now();

            SPEED.totalBytes=SPEED.totalBytes+numBytes;
            //console.log('received %s bytes of data (%s bytes total)',numBytes,SPEED.totalBytes);

            SPEED.elapsedSeconds=Math.floor((now-SPEED.startTime)/1000);
            $('#seconds').text(SPEED.elapsedSeconds);

            SPEED.totalBits=SPEED.totalBits+(numBytes*8);
            SPEED.bitsPerSecond=Math.floor(SPEED.totalBits/SPEED.elapsedSeconds);
            $('#bitSpeed').text(SPEED.bitsPerSecond);

            SPEED.bytesPerSecond=Math.floor(SPEED.totalBytes/SPEED.elapsedSeconds);
            $('#byteSpeed').text(SPEED.bytesPerSecond);
        });

        socket.on('data_complete',function(){
            $('#msg').text('DATA IS COMPLETE');
        });

    </script>
</body>
</html>

サーバー出力

> node app.js
   info  - socket.io started
Express server listening on port 3000
GET /test.html 200 4ms - 1.45kb
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized SgL8H5FaXzGGZdmuBebk
   debug - setting request GET /socket.io/1/websocket/SgL8H5FaXzGGZdmuBebk
   debug - set heartbeat interval for client SgL8H5FaXzGGZdmuBebk
   debug - client authorized for
   debug - websocket writing 1::
socket connected
{ '': [ 'SgL8H5FaXzGGZdmuBebk' ] }
DATA COMPLETE
^C
>

クライアントの結果

Request: http://hostname:3000/test.html

Response:
    Elapsed Seconds:353
    Bits per second:84686466
    Bytes per second:10585808
    DATA IS COMPLETE
于 2013-08-16T22:00:15.703 に答える