nodejs 写一个服务器,别人能够访问到;
http 协议:浏览器 和 服务器 遵守的规范;
http 服务器 和 浏览器 之间的通信,都是通过 http 实现的
我们的服务器,最重要的一环,监听,也就是说,http 向服务器发送请求,那么服务器就应该接收到这样的请求,这就是监听;
// 1. 导入http模块
const http = require("http");
// 2. 创建一个web服务器对象
const server = http.createServer();
// 3. 监听请求事件
server.on("request", (req, res) => {
//req-->request 请求对象, res-->response 响应对象
// 通过响应头设置返回前台数据格式及编码。(解决中文乱码的问题)
res.setHeader('Content-Type', 'text/html;charset=utf-8');
//res.write()表示向客户端输出的方法
res.write("hello world,你好nodejs")
//res.end()每次响应完,需要调用此方法 来结束响束
res.end();
})
// 4. 监听端口,为了避免端口冲突,这里给一个本机端口3000
server.listen(3000, () => {
console.log("服务器启动成功");
})
第二步:启动服务器
以上就是初步创建的服务器文件,接下来让我们在server.js
所在的目录下打开dos
终端窗口,执行如下指令:
node server.js
第三步:访问服务器
打开任意浏览器,地址栏中输入 http://127.0.0.1:3000
或者http://localhost:3000
便可访问服务器。
req
参数指得是request 请求对象,凡是浏览器发送请求相关的信息,都可以从该对象中找到。例如:
req.url
用户请求的路径req.headers
请求头{
//请求报头域主要用于指定被请求资源的Internet主机和端口号
host: 'localhost:3000',
//Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
//例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
connection: 'keep-alive',
// 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下
//Cache-Control:Public 可以被任何缓存所缓存()
//Cache-Control:Private 内容只缓存到私有缓存中
//Cache-Control:no-cache 所有内容都不会被缓存
'cache-control': 'max-age=0',
'upgrade-insecure-requests': '1',
//告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
// 浏览器端可以接受的媒体类型,通配符 * 代表任意类型例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
//浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
'accept-encoding': 'gzip, deflate, br',
//浏览器申明自己接收的语言
'accept-language': 'zh-CN,zh;q=0.9'
}
3.req.method
:请求类型 如:get 、post 等
4.req.httpVersion
:http协议版本 ,目前我们使用的是HTTP/1.1 版本
res.setHeader()
//设置响应头 ,例如 res.setHeader(‘Content-Type’, ‘text/html;charset=utf-8’);res.wtire()
// 向浏览器输出res.end()
// 向浏览器 响应结束res.statusCode
// 设置响应状态码res.statusMessage
//设置响应 状态信息res.writeHead()
// 综合写法: 状态码,信息,响应头,如下 res.writeHead(404, 'Not Found', {
'Content-Type': 'text/plain;charset=utf8'
})
//加载http模块
var http=require('http');
// 加载fs模块 文件的读取,写入。。。
var fs=require('fs')
//创建服务器对象
//每当有人 访问了app,function就会执行一次。
var app=http.createServer(function(req,res){
//req 请求对象
//req.url 表示用户的请求路径。
// 请求路径1: 127.0.0.1:3000/ 我们自己发送的
// 请求路径2: 127.0.0.1:3000/favicon.ico 浏览器的请求。(请求图标)
if(req.url=='/'){
fs.readFile('./index.html',function(err,data){
//data -buffer类型数据 (底层二进制数据)
if(!err){
// console.log(data.toString());
res.write(data);
res.end();
}
});
}else if(req.url=='/favicon.ico'){
fs.readFile('./logo.png',function(err,data){
if(!err){
res.write(data);
res.end();
}
})
}
})
//监听端口
// 参数一:指定服务器运行的端口号 , 端口号有取值范围 0-65535, 0-1024系统保留端口
// 参数二:指定服务器运行的域名(ip)。本地域名:localhost, 本地ip 127.0.0.1
// 参数三:回调函数。 当node server
app.listen(3000,'127.0.0.1',function(err){
//err 错误对象, 默认值:null,
// 只有app.listen 出现错误, err={err:'xxxx'}
if(err){
throw err;
}else{
console.log('服务器运行在127.0.0.1:3000上')
}
})
1. 首先目录要安装如下结构创建
js
img
css
server.js
index.html
2. server.js代码如下:
//定义服务器的文件
var http=require('http');
var fs=require('fs');
var app=http.createServer(function(req,res){
console.log(req.url)
if(req.url=='/'){
fs.readFile('./index.html',function(err,data){
if(!err){
res.end(data);
}
})
}else if(req.url=='/favicon.ico'){
fs.readFile('./img/logo.png',function(err,data){
if(!err){
res.end(data);
}
})
}else{ // req.url== /css/a.css, /img/3zhe.jpg, /img/4zhe.jpng
fs.readFile('.'+req.url,function(err,data){
if(!err){
res.end(data);
}
})
}
})
app.listen(4000,'localhost',function(err){
if(!err){
console.log('您的服务器成功运行在localhost:4000上')
}
})
/*
1. 用户访问 localhost:4000/ -----> 返回 index.html
2. 浏览器自动访问 localhost:4000/favicon.ico -----> 返回 ./img/logo.png
3. 页面中会引入 css, localhost:4000/css/a.css -----> 返回 ./css/a.css
4. 我们页面,不只要引入一个css,或一个js,或一个img,
我们要引入的事多个 css,js,img,总不能一个一个去判断,req.url 然后做出响应。
-------》 封装一个 能返回静态资源的通用服务器。
1. 归类所有请求可以分为 几类。 / , /favicon.ico /css/a.css /img/3zhe.jpg /js/a.js
3. 初步分析,可以分为3类 : 第一类: /
第二类: /favicon.ico
第三类: /css/..., /js/... , /img/...
*/