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`)
})