《node.js权威指南》(四)node创建http服务器及客户端

在Node.js中,提供了http模块与https模块,专用于创建HTTP服务器,HTTP客户端,以及HTTPS服务器和HTTPS客户端,同事实现这些服务器端与客户端之中所需要进行的处理。

http服务器

引用http模块,调用http模块中的createServer方法,在createServer的回调函数中处理用户请求
创建http服务器

var http = require('http');
// 调用http模块中的createServer方法
// 在createServer的回调函数中处理用户请求
var server = http.createServer(function(req,res){
    // 第一个参数是客户端的请求对象,
    // 第二个参叔代表服务器相应对象
    // 接受客户端请求时的其他他处理
});
server.listen(3000,"127.0.0.1");

request事件

// 可以监听http.createServer方法创建的服务器对象的request时间
// request表示接受到客户端请求时所需要处理
server.on('request',function(request,response){
    // 第一个参数是客户端的请求对象,
    // 第二个参叔代表服务器相应对象
    console.log('')
})

listening事件

// 当对http服务器指定了需要监听的地址和端口后,服务器将立即开始监
// 听来自改地址及端口的客户端链接,这时触发该服务器的listening事件
// 可以通过监听http服务器对象的listening事件,并且指定该时间触发时
// 调用的回调函数的方法来指定http服务器开始监听时所需执行的处理
server.on('listening',function(){
    // 回调函数为可选参数
    console.log('服务器端开始监听')
});

close事件

// 这段代码中由于没有关闭http服务器,因此该服务器将一直监听来自于
// 指定地址及端口的客户端链接,应用程序将不会退出,当http服务器被关闭时
// 如果服务器尚未与任何客户端建立链接,应用程序将正常退出。
// 当http服务器被关闭后,将不再接受来自listen方法中指定的地址及端口号
// 的客户端链接。
// 可以使用客户端的close方法关闭该服务器
server.on('close',function(){
    // 回调函数为可选参数
    console.log('服务器已关闭')
})

error事件

// 在对HTTP服务器指定需要监听的地址及端口时,如果该地址及端口已被占用
// 将产生错误,触发服务器的error事件,可以通过对error事件设置回调函数
// 的方法来指定该错误产生时所需要执行的处理
server.on('error',function(e){
    // 回调函数为可选参数
    console.log(e)
    console.log('服务器链接失败')
})

connection事件

// 当客户端与服务器端建立链接时,触发http服务器对象 connection事件
// 可以监听该事件并在该事件触发时调用的回调函数中指定当连接建立时所需要
// 执行的处理
server.on('connection',function(socket){
    console.log('客户端连接已建立')
})
// 客户端会输出两次"客户端连接已建立",这是因为在浏览器访问http服务器时,
// 浏览器会发出两次客户端请求,一次是用户发出的请求,另一次是浏览器为页面在收藏夹
// 中显示图标(favicon.ico)而自动发出的请求

timeOut事件

// 在node中,将http服务器的默认超时时间设置为2分钟
// 当服务器超时时,触发该服务器对象的timeout事件
server.on('timeout',function(socket){
    // socket为服务器端用于监听客户端请求的socket对象
})

setTimeout服务器超时事件

// 可以使用http服务器的setTimeout方法来设置服务器的超时时间
// 当该超时时间超过之后,客户端不可继续利用本次与HTTP服务器建立链接
// 下次向该服务器发出请求时必须重新建立连接
server.setTimeout(60*1000,function(socket){
    console.log('服务器超时')
})
console.log(server.timeout) //可以查看服务器的超时时间

获取客户端信息

《node.js权威指南》(四)node创建http服务器及客户端_第1张图片
获取客户端信息

如下

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
    if(req.url !== '/favicon.ico'){
        var out = fs.createWriteStream('./request.log');
        out.write('客户端请求方法'+req.method+'\r\n');
        out.write('客户端请求url'+req.url+'\r\n');
        out.write('客户端请求头对象'+JSON.stringify(req.headers)+'\r\n');
        out.end('客户端请求所用http版本'+req.httpVersion)
    }
    res.end();
})
server.listen(3000,"127.0.0.1");

运行代码,在应用程序的根目录下将创建一个request.log文件,打开该文件,显示如下


《node.js权威指南》(四)node创建http服务器及客户端_第2张图片
案例效果

转换URL字符串与查询字符串

在node中,提供了一个url模块与Query String模块,分别用来转换完整URL字符串与URL中的查询字符串。

querystring.parse(str, [sep], [eq], [opaction])

我们用的时候,基本上后三个参数用默认的就好
这样当我们参数为username=luckFine & age=14 & sex = boy
那么当调用parse方法时querystring.parse(username=luckFine & age=14 & sex = boy)
结果就是

{
  username : luckFine,
  age : 14,
  sex : boy
}

当客户端提交表单数据时,且表单中存在复选框时,提交的查询字符串存在类似username=luckFine & username=xiaoFan 这种形式的字符串,在使用parse方法后,这种形式的字符串将转化为对象中的一个数组。

{
  username : [luckFine, xiaoFan],
  age : 14,
  sex : boy
}

反过来,querystring.stringify(obj) 可以将对象转化为一个查询字符串,例如
querystring.stringify({username : luckFine,age : 14,
sex : boy})
那么运行结果为 username=luckFine & age=14 & sex = boy

那么基于这个,在node中的url模块,专门于对完整的URL字符串进行转换。
在url模块中可以使用parse方法将url字符串转换为一个对象,根据URL字符串中的不同内容,该对象中可能具有的属性及含义如下

《node.js权威指南》(四)node创建http服务器及客户端_第3张图片
《node.js权威指南》(四)node创建http服务器及客户端_第4张图片

案例如下

《node.js权威指南》(四)node创建http服务器及客户端_第5张图片
运行结果

相反,可以使用url模块中的format方法将URL字符串经过转换后的对象还原为一个URL字符串。
url.format(urlObj)

《node.js权威指南》(四)node创建http服务器及客户端_第6张图片
屏幕快照 2018-01-02 下午10.20.37.png

我们看一下在http服务器中解析url字符串的代码示例

var http = require('http');
var url = require('url');
var server = http.createServer(function(req,res){
    if(req.url !== '/favicon.ico'){
        res.write('')
        var url_parts = url.parse(req.url);
        switch (url_parts.pathname) {
            case '/':
            case '/index.html':
                res.write('

您正访问的是首页

') break; default: res.write('

您正访问的是'+url_parts.pathname+'

') break; } } res.end(); }) server.listen(3000,"127.0.0.1");

发送服务器端响应流

在发送请求的时候,我们需要发送响应头
response.writeHead(statusCode,[reasonPhrase],[headers])

statusCode为一个三位的http状态码 例如200
reasonPhrase参数值为一个字符串,用于指定对于该状态码的描述信息
headers为一个对象,用于指定服务器创建的响应头对象

《node.js权威指南》(四)node创建http服务器及客户端_第7张图片
响应头对象

如下

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
    if(req.url !== '/favicon.ico'){
        res.writeHead(200,{'Content-Type':'text/plain;charset=UTF-8',
            'Access-Control-Allow-Origin':'http://localhost'});
        res.write("你好")
    }
    res.end();
})
server.listen(3000,"127.0.0.1");

也可以用http.ServerResponse对象的setHeader方法来设置响应头

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
    if(req.url !== '/favicon.ico'){
        res.setHeader('Content-Type','text/plain;charset=UTF-8');
        res.setHeader('Access-Control-Allow-Origin','http://localhost');
        res.write("你好ma")
    }
    res.end();
})
server.listen(3000,"127.0.0.1");

用setHeader设置响应头信息之后,可以用getHeader获取响应头的某个字段
response.getHeader(name)
或者用removeHeader(name) 移除某个响应头,但是用removeHeader(name)移除某个响应头的时候,必须在ServerResponse对象的write方法发送数据之前被调用。

通过示例来看响应头的发送时机

var http = require('http');
var server = http.createServer(function(req,res){
    if(req.url !== '/favicon.ico'){
        console.log(res.headersSent)
        if(res.headersSent){
            console.log('响应头已发送')
        }else{
            console.log('响应头未发送')
        }
        res.writeHeader(200,{'Content-Type':'text/html'});
        if(res.headersSent){
            console.log('响应头已发送0')
        }else{
            console.log('响应头未发送0')
        }
        res.write("你好")
    }
    res.end();
})
server.listen(3000,"127.0.0.1");
《node.js权威指南》(四)node创建http服务器及客户端_第8张图片
查看响应头

在使用setHeader方法时,当http.ServerResponse对象的write方法被第一次调用时及发送响应头。

HTTP客户端

在node中,可以用request任何网站发送请求并读取该网站的相应数据


《node.js权威指南》(四)node创建http服务器及客户端_第9张图片
《node.js权威指南》(四)node创建http服务器及客户端_第10张图片

向其他网站请求数据
假设我向百度请求数据
示例如下

var http = require('http');
// 设置请求信息
var options = {
    hostname:'www.baidu.com',
    post:80,
    path:'/',
    method:'GET'
};
var req = http.request(options,function(res){
    console.log('状态码'+res.statusCode);
    console.log('响应头'+JSON.stringify(res.headers));
    // res.setEncoding() 用来指定用如何编码该字符串
    res.setEncoding('utf-8');
    // 当请求到数据的时候,对数据进行操作
    res.on('data',function(chunk){
        console.log('相应内容'+chunk)
    })
    // 当请求超时调用req.setTimeout函数
    req.setTimeout(1000,function(){
        // req.about()终止本次请求
        req.about();
    })
    // 当请求失败时,查看失败原因
    req.on('error',function(err){
        console.log('请求数据发生错误,错误代码'+err.code);
    })
})

req.end();

由于请求结果过多,那么我截取其中一小部分


《node.js权威指南》(四)node创建http服务器及客户端_第11张图片
请求百度

同志们,点赞不花钱~给程序媛一个小谷粒噻

你可能感兴趣的:(《node.js权威指南》(四)node创建http服务器及客户端)