- 引入http模块
var http = require("http");
http服务端
- 创建服务器
var server = http.createServer([callback]); #callback为接收到客户端请求时触发的回调函数,原型为: #req:http.IncommingMessage对象,代表一个客户端请求 #res:http.ServerResponse对象,代表一个服务器端响应对象。 function(req,res){}
当服务端接收到客户端请求时,触发request事件,所以可以使用监听request事件的方式来代替createServer中的回调函数:
``` server.on('request',function(req,res){ //处理代码 }); ```
监听客户端连接
server.listen(port,[host],[backlog],[callback]);
port:监听的端口号,0表示为服务器随机分配一个端口号。
host:监听的地址,默认为本机(localhost)
backlog:指定位于等待队列中的客户端连接的最大数量。超过此数量,则服务器拒绝新的客户端请求。
callback:开启监听后触发的回调函数。当服务器开启监听后会触发listening事件,可以通过监听listening事件来代替callback回调函数。
server.on('listening',function(){ //代码 });
无任何功能的http服务器:
var http = require("http"); var server = http.createServer(); server.on('request',function(req,res){ //接收到客户端请求的连接后代码部分 }); #服务器监听1337端口 server.listen(1337); server.on('listening',function(){ console.log("服务器端正在监听1337端口,等待连接..."); });
注: 默认情况下,客户端与服务器每进行一次HTTP交互,都将建立一次连接,交互通信完成后就断开连接。在HTTP1.1中增加了长连接支持:客户端发送请求头信息中或服务器发送的响应头信息中包含“Connection:keep-alive”信息,则HTTP连接将继续保持。
当客户端与服务器建立连接时,会触发服务器对象的connection事件,可以通过监听connection事件来处理连接后的事情,此时回调参数为socket对象。
server.on("connection",function(socket){ });
- request事件与connection事件的区别
客户端与服务器建立连接时会触发connection事件,如果消息头中包含“Connection:keep-alive”信息,建立连接后将保持连接。否则每次客户端发送请求时,都会重新创建连接。客户端每次发送请求都会触发request事件,发送请求是建立在双方已经成功连接的接触之上,connection事件是对HTTP底层协议的封装,而request是对双方通信时对客户端请求服务器路径的抽象。
- 获取客户端信息
当客户端与服务器建立好连接后,服务器可以通过http.IncomingMessage对象(createServer方法中回调函数的第一个参数)的一些属性和方法或事件来获取客户端的请求信息或读取客户端请求的数据。
method:客户端请求的方式,值为GET/POST/PUT/DELETE
url:客户端请求时的URL参数字符串信息。
- headers:客户端发送的请求头信息。
- httpVersion:客户端发送的HTTP版本(1.0/1.1)
- trailers:客户端发送的trailers对象信息。只有IncommingMessage对象的end事件触发后才能读取到该信息。
- socket:服务器端监听客户端请求的socket对象。
- data事件:当服务器接收到客户端发送的请求数据时触发data事件。
- end事件:当客户端发送给服务器数据执行完毕时触发end事件。
示例代码:
var http = require("http"); var server = http.createServer(function(req,res){ //当接收到客户端发送的数据时触发 req.on("data",function(data){ console.log("接收到的数据:"+decondeURIComponent(data)); }); req.on("end",function(){ console.log("数据接收完毕"); }); }); server.listen(1337); server.on("listening",function(){ console.log("服务器监听中..."); });
- 响应客户端信息
利用http.ServerResponse对象(createServer方法或request事件处理方法的第二个参数)向客户端发送数据。
发送响应头信息
response.writeHead(statusCode,[reasonPhrase],[headers]);
statusCode:HTTP状态码(404)
reasonPhrase:对HTTP状态吗的描述信息。
headers:响应头对象:常用字段如下:
1、content-type:指定内容类型
2、location:将客户端重定向到另一个URL地址。
3、content-disposition:指定一个被下载的文件名。
4、content-length:指定响应内容的字节数。
5、set-cookie:在客户端创建的cookie。
6、content-encodinig:指定服务器响应的内容的编码格式。
7、Cache-Control:用于开启缓存机制。
8、Expires:指定缓存过期时间。
9、Etag:指定服务器响应内容没有变化时不重新下载数据。
10、Access-Control-Allow-Origin: 设定允许跨域操作,值为允许想服务器请求数据的域名+端口号使用setHeader方法可以单独设置响应头信息:
//name: 响应字段名 value:响应字段对象的值(通过数组可以指定多个字段值)。 response.setHeader(name,value);
获取已设置的响应头信息
response.getHeader(name)
移除已设置的响应头信息
response.removeHeader(name);
响应正文数据
# data为一个Buffer对象或字符串,当为字符串时,encoding参数指定如何编码该字符串(和"该字符串的编码格式"意思不一样),默认字符串的编码格式为"utf8",当时用write方法发送数据时,如果之前没有调用writeHead方法,则Node.js会隐式调用该方法。 response.write(data,[encoding]); #停止向客户端响应数据,结束响应数据时必须调用此方法,否则客户端接收不到数据。 response.end([data],[encoding]);
注:response.write方法返回一个布尔类型值:当Node.js直接将数据发送到操作系统的内核缓存区中时,返回true(网络较好的情况时,服务器和客户端收发数据比较流畅),当先把数据缓存到Node.js设置的缓存区中时返回false(适用于服务器和客户端的收发速度不一致的情况,一般指客户端接收数据跟不上服务器的发送速度。这样Node.js先把数据缓存起来,等客户端接收完之前缓存在操作系统内核缓存区的数据时,再将数据发送到操作系统内核缓存区。)
服务器设置超时时间
如果服务器在指定时间内没有做出响应,则触发http.ServerResponse对象的timeout事件。# 设置服务器的响应时间,msec单位为毫秒 response.setTimeout(msec,[callback]); #处理服务器的响应超时事件 response.on("timeout",function(){ //超时处理代码 });
连接中断
当服务器在结束响应数据之前(调用end方法之前),如果此时客户端与服务器的连接中断了,则会触发http.ServerResponse对象的close事件response.on("close",function(){ //连接中断处理事件 });
http客户端
使用http模块的request方法可以向其他服务器发送请求。方法原型为:
# req为http.ClientRequest对象,代表一个客户端,可以通过此对象和服务器进行数据通信。 var req = http.request(options,callback);
options:对象或者字符串,如果为字符串的话,表示要请求的URL地址。如果为对象的话,对象的属性包括以下信息:
host:要请求的域名或主机IP地址。
hostname:同host,优先级高于host(同时存在host和hostname会优先使用hostname)。
port:目标服务器的端口号。
localAddress:用于网络连接的本地接口。
socketPath: 指定目标Unix域端口。
method:请求方式。
path:请求路径及查询字符串,默认为/
header:请求时发送的庆丘头对象。
auth: 认证信息部分。callback:获取目标网站所返回的响应流时调用的回调函数,原型为:
#response:http.IncomingMessage对象 function(response){}
当获取到服务器响应的数据流时会触发response事件,所以可以通过监听response事件来代替使用request方法中的回调函数方式。
- 向服务器发送数据
发送方式同http服务器端的发送方法:
req.write(chunk,[encoding]); req.end(chunk,[encoding]);
简单http客户端示例代码:
var http = require("http"); var options = { hostname:'localhost', port:1337, path:'/', method:'GET' }; var req = http.request(options,function(res){ console.log("状态码:"+res.statusCode); //当目标网站有响应数据时触发data事件 res.on('data',function(chunk){ console.log(chunk.toString()); }); });
- 使用get方式向服务器发送数据
get方式和request方式区别为:request请求方式需要指定请求方式为get方式,并且数据发送结束后需要调用end方式终止响应,get方式结束数据发送时不需要调用end方法,Node.js默认调用。函数原型为:
#options和callback参数同request方法的参数 var req = http.request(options,callback);
- 向服务器发送数据