http模块

109 阅读6分钟

http模块

http模块是用来创建服务器

1.如何写一个简单的本地的http服务器

image.png

前端的客户端和后端的服务器本质上都是计算机,IP地址是访问计算机的标志,计算机中可以运行很多程序而端口就可以进入计算机的具体哪一个程序

现在控制台运行这个js文件,然后就可以用浏览器输入电脑的IP地址加上端口号就可以访问这个网页,网页中就会渲染然后显示从后端接收到的数据(前提:要在同一个局域网中才能访问),localhost表示当前电脑的Ip地址。

每一次修改了js文件中的代码,需要重新在后端运行该文件,输入中文会显示乱码。

image.png

此时需要在头部设置编码和数据包格式,设置字符集为utf8才能解析中文。响应类型Content-Type,在http协议中,Content-Type就是用来告知对方我给你发送的数据内容是什么类型,不同的资源对应的Content-Type是不一样的,图片不需要指定编码,一般只为字符数据指定编码(uft-8)。

//引入node自带的http模块,这个模块可以调用函数来创建后端服务器
let http=require("http");
//调用函数创建服务器
let app=http.createServer((req,res)=>{
    //配置返回给用户的数据包的数据格式和编码类型utf8
    res.setHeader("content-Type","text/html;charset=utf8");
    //给前端最后一次发送数据包,并断开连接
    res.end("<h1>平凡天使angel</h1>");//该方法发送的数据类型是string buffer(二进制数据)
});
//监听端口
app.listen(8081);//端口

端口:在网络技术中,端口(Port)大致有两种意思:

1、物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等;

2、逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。

创建服务器对象中的回调函数不会直接运行,会在用户每次访问当前计算机的IP下的对应的端口都会运行这个回调函数,用户网络请求访问一次就调用一次,IP和端口缺一不可,IP正确而端口不对应就访问到了其他程序,这个回调函数也不会运行。

总结:

1.var app=http.createServer((req,res)=>{})表示创建一个服务器,用户每次访问当前计算机的IP下的对应的端口都会运行这个回调函数。req,res是一个对象,表示客户端发送到后端的数据包,res表示后端发送给客户端数据包的相关设置配项。

2.app.listen(81)表示监听计算机的端口。

3.res.setHeader( ' Content-Type ' , 'text/plain; charset=utf8 ')表示设置编码和数据包格式,设置在传输数据代码之前任何地方都可以。

4.res.write("")它可以多次调用,代表给前端传输数据。

5.res.end()它可以传输数据传输的数据只能是string字符串和buffer二进制包也可以不传输,是当前这一次网络请求结束的标志,一旦执行了就断开连接后面的代码不会再运行,相当于函数中的return。

6.req.url表示前端给后端发送网络请求的网址http://ip:port/后面的部分字符串 其解析url来做出不同页面的网址和不同参数传不同数据网址。

2.客户端输入不同的网址返回不同的网页

通过req.url来判断用户访问的不同的网址,服务器多网址,前面的IP地址和端口号都相同,根据后面部分的字符串来传输不同的数据。

image.png

image.png

image.png

//引入node自带的http模块,这个模块可以调用函数来创建后端服务器
let http=require("http");
//调用函数创建服务器
let app=http.createServer((req,res)=>{
    //配置返回给用户的数据包的数据格式和编码类型utf8
    if(req.url=="/angel"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>平凡天使angel</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else if(req.url=="/gem"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>启示录</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else{
        res.end("<h1>404 Not Found</h1>");
    }; 
});
//监听端口
app.listen(8081);//端口

此时相当于只要输入IP地址和端口号以及后面部分的字符串随便输入都可以访问该服务器,这样该服务器有无数个网址可以访问,但是只有两个网址是有效的可以得到数据。端口号后面没有字符串就相当于http加上IP地址和端口号再拼接/。

//引入node自带的http模块,这个模块可以调用函数来创建后端服务器
let http=require("http");
//调用函数创建服务器
let app=http.createServer((req,res)=>{
    //配置返回给用户的数据包的数据格式和编码类型utf8
    if(req.url=="/angel"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>平凡天使angel</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else if(req.url=="/gem"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>启示录</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else if(req.url=="/"){
        res.end("Gloria");
    }else{
        res.end("<h1>404 Not Found</h1>");
    }; 
});
//监听端口
app.listen(8081);//端口

image.png

1.当后端没有数据返回时,客户端就会一直处于连接状态,会一直转圈,当时间久了都没有连接上,客户端会自动断开连接

2.或者后端给客户端最后一次发送了数据也就运行了res.end()这个函数,后端就自动断开了连接。

//引入node自带的http模块,这个模块可以调用函数来创建后端服务器
let http=require("http");
//调用函数创建服务器
let app=http.createServer((req,res)=>{
    //配置返回给用户的数据包的数据格式和编码类型utf8
    if(req.url=="/angel"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>平凡天使angel</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else if(req.url=="/gem"){
        res.setHeader("content-Type","text/html;charset=utf8");
        //给前端最后一次发送数据包,并断开连接
        res.end("<h1>启示录</h1>");//该方法发送的数据类型是string buffer(二进制数据)
    }else if(req.url=="/"){
        res.end("Gloria");
    }else{
        
        console.log("成功连接");
    }; 
});
//监听端口
app.listen(8081);//端口

image.png

image.png

/favicon.ico:表示浏览器自己进行了一次网络请求,浏览器会自发请求当前页面所在的网址的小图标,后端没有设置也就不会请求到小图标就会返回这个字符串,而浏览器不会渲染这个字符串判断不是图片后就会渲染浏览器自带的小图标。如图所示

image.png