在Node.js中发送单包HTTP响应

时间:2016-07-01 21:28:45

标签: node.js tcp packet

为了向学生展示他们可以使用Wireshark捕获的简单HTTP请求和响应,我启动了一个简单的Node.js HTTP服务器:

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只是一个数据包,对我的学生来说会更简单。我怎么能改变我的代码才能做到这一点?

2 个答案:

答案 0 :(得分: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套接字时,该文件很可能无法准备好。

我看到你之前想要做的事情......因为缩进,我误读了你的代码。如果此代码段有效,请告诉我。

答案 1 :(得分: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);
});