创建http服务器

什么是http?这里就不详解了,感兴趣的可以通过各种途径找到相关知识,这里要主要讲解的是通过node.js建立http服务器和http客户端。

先开发个http服务器,然后让浏览器访问。

var http = require("http");
var server = http.createServer(
    function(incomingMsg,response){
        response.write("hello");
        response.end();
    }
);
server.listen(8080);

ok,运行这个http服务器,浏览器访问 localhost:8080 会在浏览器中显示 hello。

看起来没任何作用,但如果用net.createServer建立个服务器,浏览器就无法显示hello,因为http模型可以处理http的请求和响应,而net是很低级的数据的传输,而这些复杂的http协议的解析,node.js都已封装好,只要用就可以了。

这个例子虽然没什么功能,但可以分析出几个对象,server服务器对象,incomingMsg是传入的信息(请求信息),response响应对象。

server对象是http.Server实例,incomingMsg对象是http.IncomingMessage实例,response对象是http.ServerResponse实例。

下面对着三个类进行详解。

http.Server类

http.Server是net.Server的子类。

server对象可产生的事件

'request'事件,但有客户访问请求数据库资源时,会产生这个事件,这个事件的监听器可接收两个参数,incomingMessage和response。前面的http.createServer(function(incomingMsg,response)...) 也是加入一个监听器。

server.on("request",function(msg,response){
    ... ...
})

'connection'事件和net.Server的一致,可参阅。监听器会接收到一个socket,和net.Server一致,也可通过incomingMessage.socket得到。

server.on("connection",function(socket){ ... })

'close'事件是当服务器关闭时产生

server.on("close",function(){ ... })

'checkContinue' 事件,是当客户端发送 Expect:100-continue 请求时产生的事件,客户之所以这么做,是先要请求一下服务器是否同意继续发送主体内容,这个一般不会用到,有兴趣的可以搜索一下 Expect:100-continue 相关资料。

'connect'事件,是当客户请求方法是"CONNECT"时,会产生的事件,下面写个例子:

// 服务器
var http = require("http");
var server = http.createServer();
server.on("connect",function(req,socket,head){
   ......
})
server.listen(8080)

// 客户端
var http = require("http");
var req = http.request({
port:8080,
method:"CONNECT"
},function(res){
    ......
})
req.end();

当然CONNECT方法并不是浏览器支持的,所以浏览器访问就不会被接收到。

'upgrade' 事件,是当请求头部信息有 upgrade 属性时产生这个事件。例如的html5 websocket协议,请求时就会产生这个事件。

'clientError'事件,是客户端出现异常时抛出,这里的异常并不能通过request.destory来模拟,只能通过throw抛出异常来模拟,看例子:

// 服务器
var http = require("http");
var server = http.createServer();
server.on("clientError",function(exception,socket){
   console.log("客户端有错误")
})
server.listen(8080)

// 客户端
var http = require("http");
var req = http.request(8080)
setTimeout(function(){
   throw new Error(); // 抛出异常
},1000);

exception是异常原因,socket是抛出异常的socket。

server.listen(port, [hostname], [backlog], [callback])

port 参数,是打开一个服务器端的监听端口,如果是0,表示由系统分配一个随机端口。

host[可选]参数,表示主机名,如果设置localhost那么就拒绝通过127.0.0.1访问服务器的客户端。

backlog[可选]参数,表示同时访问的最大数,默认511。

callback[可选]参数,回调函数,http server已经准备妥当时会调用它。

server.close([callback])

参看上一节“创建socket服务器”

server.setTimeout(msecs,callback)

设置客户端空闲超时的监听器。注意,这个不是设置服务器超时,而是指客户端与服务器建立的socket超时。msecs以毫秒为单位,callback(socket) 是超时监听器,监听器会获得一个socket参数。server.timeout值默认是120000毫秒。

第一种写法

var http = require("http");
var Socket = require("net").Socket;
var server = http.createServer();
server.on("request",function(req,res){
    //res.end();这里不调用res.end从而模拟超时
})
server.timeout = 3000;
server.on("timeout",function(s){
    console.log(s instanceof Socket) // true
})
server.listen(8080);

第二种写法

var http = require("http");

var Socket = require("net").Socket;
var server = http.createServer();
server.on("request",function(req,res){
    //res.end();
})
//server.timeout = 3000;
server.setTimeout(5000,function(s){
    console.log(s instanceof Socket) // true
})
server.listen(8080)
【小结】

本节开始做了一个简单的http服务器,通过浏览器访问,然后通过这个例子分析出3个主要的对象,Server,IncommingMessage,ServerResponse, 本节对Server类进行了讲解,下一节将对IncommingMessage讲解。