一、http服务器

  我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器。例如,下面的代码就是使用Nodejs搭建了一个简易的服务器:

/**
*main.js
*在终端输入node main.js,打开浏览器在地址栏输入localhost:3000
*浏览器显示Hello Nodejs
*/ //获取http模块
var http = require("http");
//获取http.Server对象
var server = new http.Server(); //创建服务器,并监听3000端口
server.on("request",function(req,res) {
res.writeHead(200,{
"content-type":"text/plain"
});
res.write("Hello Nodejs");
res.end();
}).listen(3000);

  http模块中封装了一个HTTP服务器和一个简易的HTTP客户端:使用http.Server类创建一个基于事件的HTTP服务器,而使用http.request()和http.get()方法则可以作为HTTP客户端向服务器发起请求。

  上面的示例代码创建了一个http.Server对象,然后为其添加request事件监听,这个事件会在每次接收到请求时触发。text/plain的意思是将文件设置为纯文本格式,浏览器在获取到这种文件时并不会对其进行处理,如果将content-type设置为text/html,浏览器在获取到这种文件时会自动调用HTML的解析器对文件进行相应的处理。另外,也可以使用createServer()方法简化这一过程:

var http = require("http");

//createServer()方法创建的http.Server对象默认添加了一个request事件监听
http.createServer(function(req,res) {
res.writeHead(200,{
"content-type":"text/plain"
});
res.write("Hello Nodejs");
res.end();
}).listen(3000);

  上面说到了http.Server类的事件,http.Server类最常用的事件是"request"事件。在"request"事件中,传入回调函数的参数req和res分别是http.IncomingMessage类(它实现了可读流的接口)和http.ServerResponse类(它实现了可写流的接口)的实例。

  1、IncomingMessage对象包含了从客户端发来的http请求信息,它可以用来访问响应状态、消息头、以及数据等,例如:

var http = require("http");

http.createServer(function(req,res) {
console.log(req.httpVersion);//http协议版本,可能的值有"1.1"或"1.0"
console.log(req.method);//请求的方法,例如"GET"、"POST"等
console.log(req.statusCode);//http响应状态码
console.log(req.statusMessage);//http响应状态消息
console.log(req.headers);//请求头或响应头的对象
console.log(req.url);//发送http请求的客户端的url
}).listen(3000);

  

  IncomingMessage对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_incomingmessage

  2、http.ServerResponse类是返回给客户端的信息,它有三个重要的方法,用于返回响应头、响应内容以及结束请求:
  writeHead(statusCode[, statusMessage][, headers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头。statusCode是一个三位数的http状态码,如“200”表示请求成功、“404”表示请求的资源不存在;statusMessage是一个字符串,用来描述状态;headers是一个对象,即响应头。
  write(chunk[, encoding][, callback]):向请求的客户端发送响应体,在end()方法被调用前可以多次调用。chunk是一个buffer或者字符串,如果chunk是字符串,则在第二个参数需要指定编码方式,默认为utf-8。
  end([chunk][, encoding][, callback]):该方法会通知服务器,所有响应头和响应主体都已被发送,每次响应都必须调用end()方法来结束。
  ServerResponse对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_serverresponse

http.Server类的事件参考手册:http://nodejs.cn/api/http.html#http_class_http_server

二、http客户端

  http模块提供了http.request()和http.get()两个方法,功能是作为客户端向http服务器发起请求。

  1、关于http.request(options[, callback])
  options是一个对象,包含了请求的相关参数:http://nodejs.cn/api/http.html#http_http_request_options_callback

  可选参数callback会作为单次监听器被添加到”response“事件,即当请求的响应被接收到时就会调用该回调函数。它在被执行时带有一个参数res,该参数是一个 http.IncomingMessage类的实例
  返回值是一个http.ClientRequest 类的实例,它表示着一个正在处理的请求

例如:

/**
*c.js
*HTTP客户端,发送HTTP请求
*控制台输出返回的响应内容
*/
var http = require("http");
var options = {
host: "localhost",
port: 3000
} var req = http.request(options,function(res) {
res.on("data",function(chunk) {
console.log(chunk.toString("utf-8"));
});
res.on("end",function() {
console.log("----请求结束!----");
});
}); req.on("error",function(err) {
console.log(err.message);
}); req.end();
/**
*s.js
*HTTP服务器
*/
var http = require("http"); http.createServer(function(req,res) {
res.writeHead(200,{
"content-type":"text/plain"
});
res.write("Hello Nodejs");
res.end();
}).listen(3000);

  如果请求过程中遇到任何错误,则在返回的请求对象中会触发"error"事件;
  使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入请求体;

  2、关于http.get(options[,callback])方法
  http.get()方法是http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end()。

三、总结

  Nodejs的http模块常用的类和方法:

  1、http.Server 类:用于创建HTTP服务器,使用时需要先实例化;

  2、http.ClientRequest 类:该对象在 http.request() 内部被创建并返回。它表示着一个正在处理的请求;

  3、http.IncomingMessage 类:IncomingMessage对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别传递给 'request' 和 'response' 事件。 它可以用来访问响应状态、消息头、以及数据。它实现了可读流接口;

  4、http.ServerResponse 类:ServerResponse对象由http.Server创建,并作为第二个参数传递给 'request' 事件。它实现了可写流接口;

  5、http.createServer( [callback] )方法:返回一个http.Server对象,callback会被自动添加到 'request' 事件中;

  6、http.request( options[, callback] )方法:作为http客户端,向服务器发送请求,可选参数callback会被自动添加到 'response'事件中;

  7、http.get( options[, callback] )方法:http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end();

Nodejs的http模块的更多相关文章

  1. 关于Nodejs的多进程模块Cluster

    关于Nodejs的多进程模块Cluster   前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...

  2. Nodejs中cluster模块的多进程共享数据问题

    Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...

  3. nodejs的require模块及路径

    在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文 ...

  4. 使用nodejs的net模块创建TCP服务器

    使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...

  5. 使用nodejs的http模块创建web服务器

    使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...

  6. node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)

    第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  7. nodeJS里面的模块

    this 打开cmd,执行如下命令 nodeconsole.log(this); 输出如上信息,表示this是global,每个电脑的配置信息不一样的话,可能会有所差别的. 然后新建一个文件,写下如下 ...

  8. nodejs 使用 js 模块

    nodejs 使用 js 模块 Intro 最近需要用 nodejs 做一个爬虫,Google 有一个 Puppeteer 的项目,可以用它来做爬虫,有关 Puppeteer 的介绍网上也有很多,在这 ...

  9. nodeJS之crypto模块md5和Hmac加密

    nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...

随机推荐

  1. Excel基本操作1

    Excel的基本操作之二,录入及快速填充.不足之处,欢迎补充

  2. arcgis属性选取like用法

    查询对象为ArcInfo coverage,shapefile, INFO table,dBASE table,ArcSDE data,ArcIMS 要素类,或者 ArcIMS image servi ...

  3. TP5.0 PHPExcel 数据表格导出(原)

    今天看的是PHPExcel这个扩展库,Comporse 下载不下来,最后只能自己去github里面手动下载,但有一个问题就是下载下来的PHPExcel没有命名空间,所以框架里面的use根本引入不进去, ...

  4. Python函数之lambda,内置函数,yield生成器等

    lambda 1,用于处理简单逻辑 2,自动返回数据(return) 单参数 >>> func2 = lambda a: a+1>>> result = func2 ...

  5. 使用WebGL加载Google街景图

    我们要实现的功能比较简单:首先通过坐标定位.我的位置.地址搜索等方式,调用google map api获取地址信息.然后根据地址信息中的全景信息获取当前缩放级别的全景信息.最终把这些全景信息通过Web ...

  6. SSO单点登录的研究

    一.单点登录的概述       单点登录(Single Sign On),简称为 SSO,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 用以解决同一公司不同子产 ...

  7. Socket中的异常和参数设置

    1.常见异常 1.java.net.SocketTimeoutException . 这个异 常比较常见,socket 超时.一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 ...

  8. 全国各省市GeoCoord SQL文件(不包括区县)

    /* Navicat MySQL Data Transfer Source Server : 192.168.0.234 Source Server Version : 50543 Source Ho ...

  9. 【原创】JQWidgets-TreeGrid 2、初探源码

    已知JQWidgets的TreeGrid组件依赖于jqxcore.js.jqxtreegrid.js,实际上它还依赖于jqxdatatable.js.我们先通过一个例子,来探索本次的话题. 需求: 图 ...

  10. Editplus配置java运行环境以及其他需求的简单设置

    java配置 首先,打开"工具"(tools)选项,选择"配置自定义工具组"(英文版 是倒数第二个)然后按照上面第二幅图片来配置javac环境,其中命令一栏是j ...