Node基础模块 - Net ( 网络模块 )
网络模块提供了我们在互联网上面通信能力。
我们可以调用客户端的方法以及创建服务器进行数据交换。
网络模型
七层网络模型 ( OSI ) :应用层、表现层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP 五层模型:应用层、传输层、网络层、数据链路层、物理层
我们在网络应用这块,应用的是 TCP/IP 模型,所以是五层模型。
较于 OSI 模型,TCP/IP 模型将应用层、表现层、会话层合并成了应用层。
应用层:主要给应用计算机的用户提供了一些网络服务功能,用户实现相对的协议和接口来来完成网络通信
传输层:传输层包括了两种协议(TCP/UDP),其主要是完成对上层数据的封装,将其封装成数据报文或者用户数据报(用于两个主机端口通信)
网络层:将上面的已经封装好的报文和数据报再次处理,得到对应的分组和包(主要连接两个主机)。
数据链路层:将上面的数据封装成帧数据(帧头/帧尾,用于差错),在各个网络节点间传输。(常见设备:交换机、路由器、集线器、适配器[网卡]等)
物理层:数字电路和模拟电路转换以及在线路上传输。(常见设备:中继器、调制解调器等)
TCP 网络中模型
客户端向服务端发送连接请求:syn = 1、req = x
服务端响应客户端并表示就绪:syn = 1、ack = x+1、req = y
客户端也响应服务端表示就绪:ack = y+1、req = z
端口连接完成,可以通过 socket 进行通信。
Net 模块
net 模块主要应用渔创建服务器、IPC 通道服务器传输以及客户端创建 socket 进行交互
主要分类
net.Server 类 :用于创建服务器
net.Socket 类 :用于创建客户端 socket 进行通信
net.Server 类
1、创建服务器,供客户端连接
const server = new net.Socket() server.listen(3000)
const server = new.createServer() server.listen(3000)
2、net.Server 句柄和方法
主要事件句柄:
close:关闭
connection:当有 socket 连接时候触发
主要方法:
linsten:监听某个端口或者 IPC
getConnections:获得链接数
close:关闭
address:获取一些 IP 地址信息
net.Socket 类
1、创建 socket 实例
const socket = new net.Socket()
const socket = net.connect()
2、net.Socket 事件句柄、方法
net.Socket 是一个双工流,可读可写。
主要事件句柄:
conncet:连接时候触发
data:有数据写入触发
d'rain:数据满了清楚后触发
end:结束触发
主要方法:
conncet:连接某个服务器
write:写入数据
end:结束
address:获取地址信息
实例
服务器端:
const { Server } = require('net'); const server = new Server() server.on('connection',(socket)=>{ socket.on('data',(data)=>{ console.log(data); scoket.end('结束'); }) }) server.on('error',()=>{ server.close(); })
客户端:
const net = require('net'); const socket = new net.Socket() socket.connect(port,host,()=>{ socket.write('start'); }) socket.on('data',(data)=>{ console.log(data) }) socket.on('end',(data)=>{ console.log(data) })
http 和 net 关系
http 是在 net 的基础上进行了封装。将双工流封装成了可读流 request 和可写流 response
http 在 socket 上面对数据进行了约定,也就是 http 协议。
http 协议( 数据格式 )
请求 request 的数据格式:
请求方法(get/post) 请求地址(http://localhost) 协议版本(HTTP/1.1) 头部信息1(Host: 127.0.0.1) 头部信息2(user-agent:....) 空一格 数据( body )
例子:
const {Socket} = require('net') const socket = Socket() socket.connect(3000, 'localhost', () => { socket.end(`POST http://localhost:3000/ HTTP/1.1 Host: 111.206.250.138 Connection: keep-alive Content-Length: 1347 Accept: application/json content-type: application/json Origin: http://localhost:8877 Referer: http://localhost:8877 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 {"test":"test"} `) }) socket.on('data', (data) => { console.log(data.toString('utf8')) })
响应 response 的数据格式
协议版本(HTTP/1.1) 状态码(200 ok) 头部信息(data:...) 头部信息(content-type:...) 空一格 数据( body )
例子:
const {createServer} = require('net') const server = createServer() server.on('connection', socket => { socket.end(`HTTP/1.1 200 OK Server: nginx/1.9.15 Date: Thu, 23 Apr 2020 02:54:40 GMT Content-Type: application/json;charset=UTF-8 Connection: close Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:8877 Vary: Origin Access-Control-Expose-Headers: Set-Cookie X-Content-Type-Options: nosniff 返回的内容 `) }) server.listen(3000, (rst) => { console.log(rst) console.log(`监听端口号3000`) })