2016-07-01 33 views
0

一個單包HTTP響應爲了表明我的學生們一個簡單的HTTP請求和響應,他們可以捕捉使用Wireshark的,我掀起了一個簡單的Node.js的HTTP服務器:發送在Node.js的

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

var port = 80; 
var file = process.argv[2]; //This file contains a 42 byte HTML page 

http.createServer(function (req, res) { 
    res.writeHead(200, { 'content-type' : 'text/html' }); // Sends first packet 
    fs.createReadStream(file).pipe(res); // Sends second packet 
}).listen(port); 

不幸,傳輸HTTP頭和HTML的兩條線作爲兩個獨立的TCP數據包發送(儘管它們都很小)。如果HTTP頭和HTML只是一個數據包,我的學生會更容易。我怎麼能改變我的代碼來做到這一點?

回答

0

嘗試使用的東西喜歡 -

var file = process.argv[2]; 
fs.readFile(file, function (err, html) { 
if (err) { 
    throw err; 
}  
http.createServer(function(request, response) { 
    response.writeHeader(200, {"Content-Type": "text/html"}); 
    response.write(html); 
    response.end(); 
}).listen(8000); 
}); 
+0

我很欣賞你的答案,但我試過這種方法,它似乎沒有工作。 – petehern

1
var http = require('http'); 
var fs = require('fs');  
var file = process.argv[2]; 

http.createServer(function(request, response) { 
    response.writeHeader(200, {"Content-Type": "text/html;"}); 
    fs.readFile(file, function (err, html) { 
     if (err) { 
      throw err; 
     }  
     response.write(html); 
     response.end(); 
    }); 
}).listen(8000); 

它不會工作的原因是,Node.js的異步運行的一切。當你加載你的html文件時,服務器創建同時開始。當你準備將你的html寫入你的tcp套接字時,這個文件很可能不會準備好。


我看到你之前想要做的事情......由於縮進,我誤解了你的代碼。讓我知道這個片段是否有效。

+0

謝謝,但我不是說你是對的。如果你是,那麼傳輸一個字符串就可以正常工作(因爲我們不需要等待讀取文件)。 – petehern