详解Node.js的http模块之HTTP服务器的创建

 2015年08月30日    1019     声明


http.createServer方法创建HTTP服务器后,就可以使用http的服务端功能。Node的HTTP服务端,主要涉及http.Serverhttp.ServerResponsehttp.IncomingMessage三个对象,这些对象在前面两篇文章有详细的介绍,本文会创建一个HTTP服务器介绍这些对象的使用。

创建一个http.Server

创建http.Server使用http.createServer()方法,为了处理客户端请求,需要在服务端监听来自客户的'request'事件。'request'事件的回调函数中,会返回一个http.IncomingMessage实例和一个http.ServerResponse

var http = require('http');
  
/**
 * @param {Object} req 是一个http.IncomingMessag实例
 * @param {Object} res 是一个http.ServerResponse实例
 */
var server = new http.Server();
server.on('request', function(req, res){
    res.writeHeader(200, {'Content-Type':'text/plain'});
    res.end('hello world - 来自itbilu.com');
});

http.ServerResponse实例是一个可写流,所以可以将一个文件流转接到res响应流中。下面示例就是将一个mp4文件流传送到HTTP响应中:

server.on('request', function(req, res){
    res.writeHeader(200, {'Content-Type':'video/mp4'});
    var rs = require('fs').createReadStream('./test.mp4');
    rs.pipe(res);
});

通过http.IncomingMessage实例req,我们可查看一些客户端请求信息。如:查看请求的headers头信息。

server.on('request', function(req, res){
    //查看请求头信息
    console.log(req.headers);
    res.writeHeader(200, {'Content-Type':'text/plain'});
    res.end('hello world - 来自itbilu.com');
});


http.Server中的事件处理

在HTTP服务端,除'request'事件外,还监听其它事件。下面是一些常用事件的处理:

/**
 * 关闭服务器时,'close'事件将被触发
 */
server.on('close', function(){
    console.log('服务器已关闭');
});
 
/**
 * 客户端发起connect请求时'connect'事件会被触发。如果服务器端没有监听,那么于客户端请求的该连接将会被关闭
 */
server.on('connect', function(req, socket, head){});
/**
 * 客户端连接触发了 'error' 事件, 该事件会在这里处理
 */
server.on('clientError', function(exception, socket){
    //打印错误信息
    console.log(exception);
});


http.Server一些设置

有时我们对服务器进行相关参数的设置,如:连接超时时间、最大请求头数等,通过http.Server对象提供的方法或属性可设置这些内容。

//最大请求头数目限制
server.maxHeadersCount = 1000;
//设置套接字超时时间
server.setTimeout(1000, function(){});


启动服务器

服务器创建后,需要通过server.listen()方法启动服务器,服务器才可以接受客户端连接。server.listen()方法可以从指定的主机名(hostname)端口(port)启动,或从一个UNIX Socket套接字路径启动。

/**
 * 从localhost和3000端口开始接收连接
 */
server.listen(3000, function(){
   console.log('在端口3000启动了服务器');
});
//从 UNIX 套接字所在路径 path 上监听连接
/**
server.listen('path/to/socket',function(){
    console.log('从socket路径启动了服务器');
})
*/