注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Minary_Acdream

http://f10.moe/

 
 
 

日志

 
 

Node.js学习-第六章-HTTP  

2014-06-11 15:05:08|  分类: node.js |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 前言
    超文本协议(HTTP),是一种Web协议。
    本章介绍如何使用Node.js服务器端和客户端的API,以及如何实现HTTP服务器上层的抽象。

HTTP 结构官方文档:http://nodejs.org/api/http.html
    HTTP协议构建在请求响应的概念上,对应在Node中就是http.ServerRequesthttp.ServerResponse这两个构造器构造出来的对象。
    我们先来创建一个Hello World的HTTP服务器,并监听http://localhost:3000
de>
var http = require("http");

http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.write('Hello '); 
    setTimeout(function() {
        res.end('<b>World</b>');
    }, 500);
}).listen(3000);
de>
    WEB页面会分发许多不同类型的内容,例如,文本(text),HTML,XML,JSON,PNG以及JPEG图片等等。
    发生内容的类型(TYPE)就是在“Content-Type”里面定义的,我们可以从上面个例子里看出,我们用的是‘text/html’。
    Node用chunked传输编码。
    
    在调用end之前,我们可以多次调用write方法来发送数据。为了尽可能快的相应客户端,在首次调用write时,Node就能把所有的响应头信息以及第一块数据(HI)发送出去。
    在执行setTimeout回调函数时,又写入了另一块数据,由于这次是end方法,因此Node会结束响应,并不再允许往这次相应中发送数据。

    
下面这个例子,我们来读取img文件。
de>
require('http').createServer(function(req, res) {
    res.writeHead(200, {'Content-Tye' : 'image/jpg'});
    var stream = require('fs').createReadStream('image.jpg');
    stream.on('data', function(data) {
       res.write(data);
    });
    stream.on('end', function() {
       res.end();
    });
}).listen(3000);
de>

Node.js学习-第四章-HTTP - Minary - Minary_Acdream
 很顺利的就读出来,上面是效果图。
 以一系列的数据块读取图片的好处:
  • 高效的内存分配。要是对每个请求在写入前都完全把图片信息读取完(通过fs.readfile),在处理大量请求时会消耗大量内存。
  • 数据一旦就绪就可以立刻写入。 
实际上我们做的是把一个(stream)(文件系统)接(piping)到了另一个流上(一个http.ServerResponse对象)。
正如前面所介绍的,是Node中很重要的一种抽象,流的对接是很常见的行为。因此,Node提供了一个方法让上面代码更简洁:
de>
require('http').createServer(function(req, res) {
    res.writeHead(200, {'Content-Tye' : 'image/jpg'});
    require('fs').createReadStream('image.jpg').pipe(res);
}).listen(3000);
de>

连接
    对比TCP服务器和HTTP服务器的实现,我们可以发现,它们都调用了createServer方法,并且当客户端连入时都会执行一个回调函数。
    不过,它们本质的区别,也就是回调函数中对象的类型。
    在net服务器中,是个连接(connection)对象,而在HTTP服务器中,则是请求和响应对象。
    之所以会这样的原因有两个。
    第一,HTTP服务器是更高层的API,提供了控制和HTTP协议相关的一些功能。
    例如:我们将req参数中的headers属性打印出来。
de>
require('http').createServer(function(req, res) {
   console.log(req.headers);
   res.writeHead(200, {"Content-Type" : 'text/html'});
   res.end();
}).listen(3000);
de>

   Node.js学习-第四章-HTTP - Minary - Minary_Acdream
 
    可以看出来,Node在内部做了很多的事。它拿到浏览器发送的数据后,对其进行解析,然后构造了一个javascript对象方便我们在脚本中使用。
    
    第二,也是更为重要的原因。浏览器在访问站点的时不会只用一个连接,很多主流的浏览器为了更快的加载网站内容,能向同一台主机打开八个不同的连接,并发送请求。

    默认情况下,Node会告诉浏览器始终保持连接,通过它发送更多的请求。这是通过我们此前看到的connection头信息中的 keep-alive值通知浏览器的。
    
    下一章,我们会使用NODE HTTP API来完成一个切实的任务:处理用户提交的表单。

  评论这张
 
阅读(141)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018