3

Javaクライアントが画像を送信する単純なNodeJSTCPサーバーを作成しました。

encodedImage = <a base64 encoded image>
out.write("IMG;" + encodedImage);
out.flush();

私のNodeJSサーバーは次のとおりです。

net.createServer(function(TCPSocket){
        TCPSocket.on("data", function(data){
            console.log("TCP Recieved: " + data.length);    
        });
}).listen(5000);

ただし、すべてのデータを送信してすぐにフラッシュしても、出力は次のようになります。

TCP Recieved: 13
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1472
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1344
TCP Recieved: 1344

単純なチャンクで受信したいのですが、NodeJSのイベント処理メカニズムが原因で発生していると思います。単一のチャンクとして送信されるデータに対して、単一のデータチャンクを実現するための最良の方法は何ですか?私の知る限り、TCPウィンドウは1344バイトのデータよりもはるかに大きくなる可能性があります。ヘッダー値をHTTPとして使用することを考えたので、必要なオブジェクトを構成する長さの広告がわかりました。

4

1 に答える 1

8

正解です。ノードでは、データはチャンク化されて表示されます。入ってくるすべてのブロックを連結してバッファーを保持する必要があります。次に、ソケットが閉じられたら、データをファイルシステムに書き込みます。画像を受信できた例を次に示します。

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

net.createServer(function(socket){
  var buffer = new Buffer(0, 'binary');

  socket.on("data", function(data){
    buffer = Buffer.concat([buffer, new Buffer(data,'binary')]);
  });

  socket.on("end", function(data) {
    fs.writeFile("image.jpg", buffer, function(err) {
      if(err) {
        console.log(err);
      } else {
        console.log("Socket[" + socket.name + "] closed, wrote data out to sinfo.data");
      }
    }); 

  });

}).listen(5000);

console.log('ready');

netcatを使用して画像を送信しました:

$ netcat localhost 5000 < input.jpg
于 2012-11-07T23:31:42.103 に答える