例子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>
- 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服务器。