Node基础模块

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

  

博客园小结巴巴: https://www.cnblogs.com/jiebba

原文地址:https://www.cnblogs.com/jiebba/p/12759521.html