本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。

http模块概览

大多数nodejs开发者都是冲着开发web server的目的选择了nodejs。正如官网所展示的,借助http模块,可以几行代码就搞定一个超迷你的web server。

在nodejs中,http可以说是最核心的模块,同时也是比较复杂的一个模块。上手很简单,但一旦深入学习,不少初学者就会觉得头疼,不知从何入手。

本文先从一个简单的例子出发,引出http模块最核心的四个实例。看完本文,应该就能够对http模块有个整体的认识。

一个简单的例子

在下面的例子中,我们创建了1个web服务器、1个http客户端

  • 服务器server:接收来自客户端的请求,并将客户端请求的地址返回给客户端。
  • 客户端client:向服务器发起请求,并将服务器返回的内容打印到控制台。

代码如下所示,只有几行,但包含了不少信息量。下一小节会进行简单介绍。

var http = require('http');// http server 例子
var server = http.createServer(function(serverReq, serverRes){var url = serverReq.url;serverRes.end( '您访问的地址是:' + url );
});server.listen(3000);// http client 例子
var client = http.get('http://127.0.0.1:3000', function(clientRes){clientRes.pipe(process.stdout);
});

例子解释

在上面这个简单的例子里,涉及了4个实例。大部分时候,serverReq、serverRes 才是主角。

  • server:http.Server实例,用来提供服务,处理客户端的请求。
  • client:http.ClientReques实例,用来向服务端发起请求。
  • serverReq/clientRes:其实都是 http.IncomingMessage实。serverReq 用来获取客户端请求的相关信息,如request header;而clientRes用来获取服务端返回的相关信息,比如response header。
  • serverRes:http.ServerResponse实例

关于http.IncomingMessage、http.ServerResponse

先讲下 http.ServerResponse 实例。作用很明确,服务端通过http.ServerResponse 实例,来个请求方发送数据。包括发送响应表头,发送响应主体等。

接下来是 http.IncomingMessage 实例,由于在 server、client 都出现了,初学者难免有点迷茫。它的作用是

在server端:获取请求发送方的信息,比如请求方法、路径、传递的数据等。
在client端:获取 server 端发送过来的信息,比如请求方法、路径、传递的数据等。

http.IncomingMessage实例 有三个属性需要注意:method、statusCode、statusMessage。

  • method:只在 server 端的实例有(也就是 serverReq.method)
  • statusCode/statusMessage:只在 client 端 的实例有(也就是 clientRes.method)

关于继承与扩展

http.Server

  • http.Server 继承了 net.Server (于是顺带需要学一下 net.Server 的API、属性、相关事件)
  • net.createServer(fn),回调中的 socket 是个双工的stream接口,也就是说,读取发送方信息、向发送方发送信息都靠他。

备注:socket的客户端、服务端是相对的概念,所以其实 net.Server 内部也是用了 net.Socket(不负责任猜想)

// 参考:https://cnodejs.org/topic/4fb1c1fd1975fe1e1310490b
var net = require('net');var PORT = 8989;
var HOST = '127.0.0.1';var server = net.createServer(function(socket){console.log('Connected: ' + socket.remoteAddress + ':' + socket.remotePort);socket.on('data', function(data){console.log('DATA ' + socket.remoteAddress + ': ' + data);console.log('Data is: ' + data);socket.write('Data from you is  "' + data + '"');});socket.on('close', function(){console.log('CLOSED: ' +socket.remoteAddress + ' ' + socket.remotePort);});
});
server.listen(PORT, HOST);console.log(server instanceof net.Server);  // true

http.ClientRequest

http.ClientRequest 内部创建了一个socket来发起请求,代码如下。

当你调用 http.request(options) 时,内部是这样的

self.onSocket(net.createConnection(options));

http.ServerResponse

  • 实现了 Writable Stream interface,内部也是通过socket来发送信息。

http.IncomingMessage

  • 实现了 Readable Stream interface,参考这里
  • req.socket --> 获得跟这次连接相关的socket

Node进阶:核心模块http简介相关推荐

  1. (14)Node.js 核心模块—http

    一.核心模块 - http模块介绍 • http 模块可以发布 web 服务,在没有学习http模块之前,我们都是用tomcat,nginx等服务器. • 使用之前,通过 require 引入 • 官 ...

  2. 前端基础-Node.js核心模块的使用

    第2章 核心模块的使用 2.1.1 FS模块 node核心模块之一,用于操作文件: 中文手册 : http://nodejs.cn/api/fs.html 文件读写 // 引入模块 var fs = ...

  3. nodejs(五)node引入核心模块fs

    前面我们说ndoe引入自己的模块,相对路径要加 './',否则就会根据名字去引入核心模块,nodejs文件读写的核心模块是fs(file-system),引入方法: var fs = require( ...

  4. (12)Node.js核心模块fs—实现文件复制和压缩

    一.文件复制 将src目录下的style.css文件复制一份,到dist目录下. 二.文件压缩 文件压缩就是把我们书写的代码中的空格和注释进行删除,这样我们体积会变小,当我们上线到服务器时,给服务器造 ...

  5. (10)Node.js核心模块—fs文件系统之目录操作

    一.创建目录 // 引入fs模块 const fs = require('fs') //创建目录(文件夹) //语法:fs.mkdir('目录路径',回调函数) fs.mkdir('./d1', (e ...

  6. (11)Node.js 核心模块fs – 同步函数( synchronization )

    一.介绍图 再执行程序1时,把1.1和1.2丢到事件队列中,去异步执行,这样提高了效率,让执行速度更快. 如果使用同步,需要等待程序1完全执行完成后,才能去执行程序2. 二.同步函数 • 在主程序中自 ...

  7. node.js学习笔记5——核心模块1

    node.js学习笔记5--核心模块1 Node.js核心模块主要内容包括:(1)全局对象 (2)常用工具 (3)事件机制 (4)文件系统访问 (5)HTTP服务器与客户端 一: 全局对象 Node. ...

  8. 【Node】Node核心模块

    Node的核心模块 os模块 util模块 path模块 url模块 querystring模块 os模块 os模块提供一些操作系统相关的实用方法. 导入模块: const os = require( ...

  9. node中模块系统及核心模块、执行node文件

    node中模块系统: 1.模块系统:核心模块.第三方模块. 自己写的模块. 2.网页中所有的路径都是URL,而不是文件路径. 3.node偏底层开发,开启的服务器完全是一个黑盒子,所有的资源默认都是不 ...

最新文章

  1. LeetCode简单题之生成每种字符都是奇数个的字符串
  2. java 线性的排序算法_077-线性查找分析和实现
  3. opencv的K近邻算法
  4. Python基础入门一(2)
  5. 前端学习(1185):数据响应式
  6. java des加密类_java的DES加密解密辅助类
  7. python词云图_人生苦短我用Python——词云图的绘制
  8. 笔记本电脑黑屏但还在运作怎么办
  9. atitit.元编程总结 o99
  10. 电影院售票系统html页面,电影院网上订票系统(全套).doc
  11. 点云数据的类型主要分为_点云数据处理方法概述
  12. python实战——密码生成器
  13. PDF文件怎么旋转保存
  14. 如何创建水晶报表模板
  15. 屏幕正中间浮窗html,HTML 纯css浮窗居中和打开or关闭
  16. TFN全新推出的全功能 手持式频谱分析仪 RMT系列 不仅可干扰定位 还可路测
  17. 微信提示已连接到服务器失败,微信提示无法连接到服务器如何解决
  18. 排查maven中可以从远程下载下来jar包,但是却报错Failure to find was cached in the local repository, resolution will not
  19. 用计算机无法解决打印所有,解决打印机无法打印的10种方法
  20. vue实现组件双向绑定

热门文章

  1. 原型模式(Prototype) 1
  2. Android开发之异步消息处理机制AsyncTask
  3. Dynamips 7200
  4. Koding VM 配置nginx 小记
  5. 从“救火”到“井然有序”
  6. 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
  7. 左边工具栏 隐藏_203 【Ps基础】 工具栏
  8. 数据分析在商业中的作用
  9. Cannot find class [***] for bean with name '***' defined in file[***]
  10. python工作目录_python获取当前工作目录