node核心内置库3 net(网络) 以及 实现简单的一个http

例子1:实现简单的一个http

//实现简单的一个http
var http = require('http'); // 加载http模块

http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'}); // 200代表状态成功, 文档类型是给浏览器识别用的
    res.write('<meta charset="UTF-8"> <h1>我是标题啊!</h1> <font color="red">这么原生,初级的服务器,下辈子能用着吗?!</font>'); // 返回给客户端的html数据
    res.end(); // 结束输出流
}).listen(3000); // 绑定3ooo, 查看效果请访问 http://localhost:3000

例子2:同上类似,只不过是写入的东西需要先从bb.html读出来,然后再写入res反馈给客户端

//Nodejs的核心内置模块 http
//复制代码 代码如下:
var http = require('http') ; //引入http模块
var fs = require("fs") ;

//createServer该函数用来创建一个HTTP服务器
//createServer 的函数参数 function 是request(请求)事件的监听函数。
//当有请求事件发生时,执行该回调函数.
//req: 请求对象,想知道req有哪些属性,可以查看 “http.request 属性整合”。
//res: 响应对象 ,收到请求后要做出的响应。想知道res有哪些属性,可以查看 “http.response属性整合”。

var server = http.createServer(function(req,res){
    //fs 模块读bb.html文件
    //data是从文件读出来的数据
    fs.readFile("bb.html","utf-8", function(err, data){
        if(err) {
            res.writeHead(500, {'Context-Type': 'text/plain'});
            res.end('specify file not exists! or server error!');
        }
        else{
            res.writeHead(200, {'Context-Type': 'text/html'});
            res.write(data);
            res.end();
        }
    })
}) ;
server.listen(8888) ;
console.log("http server running on port 8888 ...") ;


// 现在我们需要思考一下,如果我们要发送的不是一个单纯的文本文件,
// 而是超媒体文件比如说 Google 2014 IO 大会 的全程高清视频文件。mp4 格式。长度2个多小时1080p。
// 大概4个多GB。已知 "readFile" 的工作方式是将文件读取到内存。
// 那么这么大一个文件显然是不能这么做的。
// 那该怎么办呢?是之后就需要使用 stream 的来做。那么是这样的。
//
//   代码如下像这样:
//
//   复制代码 代码如下:
//     fs.createReadStream(__dirname + '/vedio.mp4').pipe(res) ;
//
//
// 总结:
//
//   这些代码可以实现需要的功能,但是服务在发送文件数据之前需要缓存整个文件数据到内存,如果"bb.html"文件很
// 大并且并发量很大的话,会浪费很多内存。因为用户需要等到整个文件缓存到内存才能接受的文件数据,这样导致
// 用户体验相当不好。不过还好 "(req, res)" 两个参数都是Stream,这样我们可以用fs.createReadStream()代替"fs.readFile()"。
//

bb.html

<!--<!DOCTYPE html>
-->
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style type="text/css">
        div {
              margin-top: 50px;
              width: 100%;
             margin: 0px;
              height:120px;
              line-height:120px;
            color:#fff;
            font-size:22px;
            background:#ff9900;
              text-align: center;
        }
    </style>
</head>
<body>
<div>Hello,大熊!</div>
</body>
</html>
  1. node的网络模块架构是什么样子的?
    参考答案: node全面支持各种网络服务器和客户端,包括tcp, http/https, tcp, udp, dns, tls/ssl等.

2.https 未验证 需要查看文档实践
以下为粗略整理:

//2. node是怎样支持https,tls的?
//    参考答案: 主要实现以下几个步骤即可:
// 1) openssl生成公钥私钥
// 2) 服务器或客户端使用https替代http
// 3) 服务器或客户端加载公钥私钥证书

//https://nodejs.org/api/https.html  可查看官方文档
//  http://nodejs.cn/api/
//https模块与http模块极为类似,区别在于https模块需要额外处理SSL证书。

//在服务端模式下,创建一个HTTPS服务器的示例如下。
var https = require('https');
var fs = require('fs');

var options = {
    key: fs.readFileSync('./keys/server-key.pem'),
    ca: [fs.readFileSync('./keys/ca-cert.pem')],
    cert: fs.readFileSync('./keys/server-cert.pem')
};

https.createServer(options,function(req,res){
    res.writeHead(200);
    res.end('hello world\n');
}).listen(3000,'127.0.0.1');
//可以看到,与创建HTTP服务器相比,多了一个options对象,通过key和cert字段指定了HTTPS服务器使用的私钥和公钥。

//另外,NodeJS支持SNI技术,
// 可以根据HTTPS客户端请求使用的域名动态使用不同的证书,因此同一个HTTPS服务器可以使用多个域名提供服务。
// 接着上例,可以使用以下方法为HTTPS服务器添加多组证书。
server.addContext('foo.com', {
    key: fs.readFileSync('./ssl/foo.com.key'),
    cert: fs.readFileSync('./ssl/foo.com.cer')
});

server.addContext('bar.com', {
    key: fs.readFileSync('./ssl/bar.com.key'),
    cert: fs.readFileSync('./ssl/bar.com.cer')
});


//在客户端模式下,发起一个HTTPS客户端请求与http模块几乎相同,示例如下。
var https = require('https');
var fs = require('fs');

var options = {
    hostname:'127.0.0.1',
    port:3000,
    path:'/',
    method:'GET',
    key:fs.readFileSync('./keys/client-key.pem'),
    cert:fs.readFileSync('./keys/client-cert.pem'),
    ca: [fs.readFileSync('./keys/ca-cert.pem')],
    agent:false
};

var req = https.request(options,function(res){
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);
    res.setEncoding('utf-8');
    res.on('data',function(d){
        console.log(d);
    })
});

req.end();

req.on('error',function(e){
    console.log(e);
})


//但如果目标服务器使用的SSL证书是自制的,不是从颁发机构购买的,默认情况下https模块会拒绝连接,提示说有证书安全问题。
// 在options里加入rejectUnauthorized: false字段可以禁用对证书有效性的检查,
// 从而允许https模块请求开发环境下使用自制证书的HTTPS服务器。

猜你喜欢

转载自blog.csdn.net/baidu_19552787/article/details/87716634
今日推荐