2011-08-17 33 views
0

我有以下Node.js的代碼:的NodeJS:內容編碼誤差

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

var reqHash={}; 
var resHash={}; 

var server = net.createServer(function(soc){ 

    soc.on('data', function(data){ 
    //sys.puts(data); 
    var requestData=data; 

    var conn = net.Socket(); 
    conn.connect(80,"www.xlhi.com",function(){ 
     conn.write(data); 
    }); 
    conn.on("connect",function(){ 
     //sys.puts("connected"); 
    }); 
    conn.on("data",function(x){ 
     var responseData=x.toString(); 
     //sys.puts(responseData); 
     var f=50; 
     var toTransmit=""; 

     if(responseData!=undefined){ 
     var N=responseData.length; 
     if(N>f){ 
      var p=Math.floor(N/f); 
      var p_rem=N%f; 

      var hash=""; 
      var chunk=""; 
      for(var i=0;i<p;i++){ 
      chunk=responseData.substr(f*i,f); 
      hash=DJBHash(chunk); 
      toTransmit+=chunk; 
      if(hash<0){ 
       hash=hash*-1; 
      } 
      if(resHash[hash]!=undefined){ 
       //sys.puts("***Hit"+resHash[hash]); 
       //toTransmit=toTransmit+"***EOH"+hash+"EOH***"; 
      }else{ 
       resHash[hash]=chunk; 
       //toTransmit+=chunk; 
      } 
      } 
      //remainder: 
      //toTransmit+="***"; 
      //sys.puts(f*p+" "+p_rem); 
      chunk=responseData.substr(f*p); 
      //sys.puts("EOH"+chunk+"\n"); 
      hash=DJBHash(chunk); 
      toTransmit+=chunk; 
     }else{ 
      toTransmit=responseData; 
     } 
     //sys.puts(x.toString().substr(0,50)); 
     //sys.puts(toTransmit.substr(0,50)); 
     sys.puts(toTransmit); 
     sys.puts(x); 
     soc.write(toTransmit); /*This line causes content encoding error!*/ 
     } 
    }); 
    }); 
}); 

server.on('error', function (err){ 
    // Error processing i just pass whole object 
    console.log(err); 
}); 

server.listen(8080,"172.16.1.218"); 
console.log('Server is listening %d\n', 8080); 


function DJBHash(str) { 
    var hash = 5381; 
    for(var i = 0; i < str.length; i++) { 
    hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff; 
    } 
    return hash; 
} 

具體而言,我無法與上述標記的行。當我將soc.write(toTransmit);更改爲soc.write(x)時,一切正常,當我在瀏覽器中進行刷新時,我沒有收到任何內容編碼錯誤。

如您所見,toTransmit是responseData=x.toString();的分塊版本。我猜我需要一些轉換爲適合寫入套接字的格式的傳輸方式。我不知道該怎麼做。

任何幫助非常感謝。

提前許多感謝,

+0

您使用的是什麼版本的節點? – CuriousMind

+0

非常感謝您的回覆。我正在使用v0.4.10 – Eamorr

+0

我已經想通了... soc.write(new Buffer(toTransmit)) – Eamorr

回答

1

根據文檔:http://nodejs.org/docs/v0.4.10/api/http.html#response.write

response.write需要字符串或緩衝區。如果它是一個字符串,它也需要一個編碼,默認編碼是utf-8

所以編碼問題來自於你給他一個UTF-8字符串,並且你的瀏覽器被設置爲另一種編碼。

在此代碼中,您也不寫任何標題,瀏覽器必須猜測它是否是您要發送給他的text/plaintext/html