2016-10-24 21 views
1

単純なnode.jsコードで1つのhttpサーバーと1つのtcpサーバーがあります。 しかし、httpからtcpにデータを渡すと、正しいファイルが取得できません。 ファイルは常に破損しています。HTTPクライアントから受信したデータは、TCPサーバーに送信する際に失われます。

私はローカルからの画像ファイルを渡してテストしましたが、うまく動作します。 私はupload.jsだと思っていますが、私は自分の間違いを解決できません。

助けてください。

[upload.js] - [HTTPサーバー

var server = http.createServer(function(request, response){ 

    /* my html form is 
     <form method="POST" action="/upload" enctype="multipart/form-data"> 
    */ 

    if(request.url == '/upload') { 

     request.on('data', function(data){ 
      var client = net.createConnection({ port: 1234 }, function(){ 
       client.write(data); 
       client.end() 
      }); 
     }) 

    } 
}); 
server.listen(1000); 

[save.js] - TCPサーバーあなたは全体の予想されるファイルを保存しますが、唯一のチャンクされていないので、これが発生し

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

var server = net.createServer(function(c){ 
     var img = fs.createWriteStream('a.jpg', 
      { defaultEncoding: 'binary' }      
     ); 
     c.on('data', function(data){ 
       img.write(data); 
     }); 

     c.on('end', function(){ 
     }); 
}); 

server.listen(1234); 

答えて

2

それ。チャンクを受信するたびに、実際には新しい接続を作成し、TCPサーバー側で同じファイルを再作成しています。

HTTPサーバー側でグローバルimg varを作成し、内部にチャンクを格納してから、転送が終了したときにのみTCP接続を開始する必要があります。

var img = []; 
var server = http.createServer(function(request, response){ 

    /* my html form is 
     <form method="POST" action="/upload" enctype="multipart/form-data"> 
    */ 

    if(request.url == '/upload') { 

     request.on('data', function(data){ 
      img.push(data); 
     }).on('end', function() { 
      var bytes = Buffer.concat(img); 
      var client = net.createConnection({ port: 1234 }, function(){ 
       client.write(bytes, function() { 
        client.end(); 
       }); 
      }); 
     }); 

    } 
}); 
server.listen(1000); 

TCPサーバーは、あなたはもうそれを必要としないときは、ストリームを閉じる必要があることを除けば、問題ないはずです。

c.on('end', function(){ 
    img.end(); 
}); 
+1

ありがとう。あなたはnode.jsの天使ですか?どうもありがとうございます。私の問題を解決し、それは正常に動作します! –

関連する問題