你的浏览器不支持canvas

Enjoy life!

nodeJs - HTTP服务器 - 上篇

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

其他链接:

以下内容全部源于: 《Node.js权威指南》

一、创建HTTP服务器

1.1 http.createServer()

  • 调用http模块中的createServer()方法即可。
  • createServer()接受一个可选的参数:回调函数—–用于指定当接收到客户端请求时所需执行的处理。回调函数里有两个参数:
    • request:实际上是http.IncomingMessage对象,代表一个客户端的请求
    • response:实际上是http.ServerResponse对象,代表服务器端的响应对象
  • createServer()返回被创建的服务器对象
// 引入http
var http = require('http');
var server = http.createServer(function(request, response) {
  //...
})
  • 如果不在createServer()中使用参数,可通过监听该方法创建的服务器对象的request事件【该事件在接收到客户端请求时触发】。以下代码的效果其实与上面的代码的效果是等价的。
var http = require('http');
var server = http.createServer();
server.on('request', function(request, response) {
  //...
})

1.2 server.listen()

  • 在创建HTTP服务器后,需指定该服务器所需监听的地址和端口。方法如下:
  • server.listen(port, [host], [backlog], [callback])
    • port:端口号。【值为0时将会为HTTP服务器分配一个随机端口号】
    • host:(可选),监听的地址。【省略该地址,服务器将监听来自于任何IPv4地址的客户端连接】
    • backlog:(可选),整数值,默认值为511,指定位于等待队列中的客户端连接的最大数量。【一旦超过这个长度,HTTP服务器将开始拒绝来自新客户端的连接。】
    • callback:(可选),建立客户端连接后,会触发该服务器的listening事件,而该参数就是来指定listening事件触发时调用的回调函数
  • 不使用callback参数,也可按如下:
server.on('listening', function() {
  //...
})

1.3 server.close()

  • server.close():用来关闭服务器。
  • 当服务器被关闭时,触发close事件,可通过监听该事件并callback指定当服务器被关闭时所需执行的处理:
server.on('close', function() {
  //...
})

1.4 error事件

  • 在对HTTP服务器指定需要监听的地址及端口时,如果该地址及端口已被占用,将产生一个错误码“EADDRIUSE”,表示用于监听的地址及端口已被占用。同时触发了HTTP服务器的`error事件
server.on('error', function(e) {
  if(e.code == 'EADDRINUSE') {
      //...
  }
})
  • 实例 【先运行 app1.js,再运行 app2.js
  • app1.js
var http = require('http');

var server = http.createServer(function (req, res) {
  console.log('app1.js');
});

server.listen(8080, "127.0.0.1", function () {
  console.log('开始监听');
});
  • app2.js
var http = require('http');

var server = http.createServer(function (req, res) {
  console.log('app2.js');
});

server.on('error', function (e) {
  if (e.code === 'EADDRINUSE') {
    console.log('监听的地址及端口被占用!');
  }
})

server.listen(8080, "127.0.0.1", function () {
  console.log('开始监听');
});
  • 运行过程

relationship-map

1.5 connection事件

  • 默认下,客户端和服务器没进行一次HTTP操作,都将建立一次连接,客户端与服务器端之间的交互通信完成后该连接就中断。
  • HTTP 1.1中,支持长连接。
    • 如果客户端发出的请求头信息或服务器端发出的响应头信息中添加”Connection:keep-alive“,则HTTP连接将继续保持,客户端可以继续通过相同的连接向服务器端发出请求。
  • 当客户端和服务器端建立连接时,触发HTTP服务器对象的connection事件
    • 回调函数中的参数socket:服务器端用于监听客户端请求的socket端口对象
server.on('connection', function(socket) {
  console.log('客户端已连接。。。')
})
  • 补充:控制台会输出两次“客户端已连接。。。”,原因如下
  • 因浏览器中访问HTTP服务器时,浏览器会发出两次客户端请求
    1. 用户发出的请求
    2. 浏览器为页面在收藏夹中的显示图标(默认为:favicon.ico)而自动发出的请求

1.6 server.setTimeout()

  • server.setTimeout(msecs,callback):设置服务器的超时时间。当超过该超时时间后,客户端不可继续利用本次与HTTP服务器建立的连接,下次向该HTTP服务器发出请求时需重新建立连接。
    • msecs:整数,设置服务器的超时时间,单位:毫秒。【设为0时取消服务器的超时处理】
    • callback:回调函数,其参数socket—-服务器端用于监听客户端请求的socket端口对象
  • 当服务器超时时,触发服务器对象的timeout事件,可不使用callback参数
server.on('timeout', function(socket) {
  //...
})
  • HTTP服务器拥有的一个属性:timeout,整数值,单位毫秒,用于查看/修改服务器的超时时间
server.timeout = 1000;
console.log(server.timeout);
  • 实例
var http = require('http');

var server = http.createServer(function (req, res) {
  res.end();
});

server.setTimeout(6 * 1000, function () {
  console.log('服务器超时!!!');
})

server.listen(8080, "127.0.0.1", function () {
  console.log('开始监听');
});
  • 运行过程 (过6秒超时)

relationship-map


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。