zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    React——JSX语法【三】
    React——虚拟DOM创建的两种方式【二】
    Nginx——虚拟主机简介
    Linux——Centos8虚拟机添加网卡未显示
    React——React简介和基本使用【一】
    Linux——删除系统python导致yum无法使用
    SonarQube——Docker搭建SonarQube服务
    Linux——配置SSH免密登录
    Jumpserver——如何替换多因子认证
    GitLab——如何快速部署GitLab仓库
  • 原文地址:https://www.cnblogs.com/jiebba/p/12759521.html
Copyright © 2011-2022 走看看