网络编程@Socket网络编程

  • 传统的同步阻塞式IO编程、伪异步IO实现
    • Socket
      • Socket即套接字,通过TCP3次握手,4次挥手实现,建立连接的过程分为4个步骤
        • 服务器监听
          • 服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络的状态
        • 客户端请求服务器
          • 客户端的套接字提出连接请求,要连接的目标是服务端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字所在的IP和端口号,然后就向服务器套接字发送连接请求
        • 服务器确认
          • 当服务器套接字监听到(接收到)客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务端套接字的描述发送给客户端
        • 客户端确认
          • 一旦客户端确认了此描述,连接就建立好了。双方开始进行通信,而服务端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
      • 传统Socket的缺点
        • 每次建立了连接,都会起一个新的线程对这个连接进行通信处理,那么,当连接的数量增大的时候,会消耗很大的性能,而且连接的建立也是非常有限的
    • 伪异步IO实现
      • 解决了每次建立连接都要建立线程的问题
      • 解决方式:线程池+队列
  • 基于NIO的同步非阻塞式编程(Non-Block IO)
    • 阻塞和非阻塞:
      • 阻塞:程序在获取网络数据的时候,如果网络数据还没有完全发送完毕,那么程序会一直等待着,知道传输完成才进行进一步处理
      • 非阻塞:程序直接获取已经准备就绪的网络数据,无需等待
    • 同步和异步:
      同步和异步一般是面向操作系统与应用程序对IO操作的层面上来区别的
      • 同步:同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某个方法上,直到数据准备就绪,或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据
      • 异步:异步时,则所有的IO读写操作就给操作系统处理,与我们的应用程序没有直接关系,我们的程序不需要关心IO读写,当操作系统完成了IO读写操作时,会给我们的应用程序发送通知,我们的应用程序直接拿走数据即可
        ** 同步和阻塞 **
      • 同步说的是Server服务端的执行方式
      • 阻塞说的是具体的技术,接收数据的方式、状态(NIO/IO)
    • IO和NIO的区别:
      • 本质:IO是阻塞式的,NIO是非阻塞式的
    • Buffer缓冲区
      • Buffer是一个对象,实际上是一个数组,通常它是一个字节数组(ByteBuffer),它包含了一些要写入或者读取的数据,并提供了访问和操作数据的API
      • 除了Boolean,每一个基本数据类型都对应了一个缓冲区,但是最常用的还是ByteBuffer
        ByteBuffer/CharBuffer/ShortBuffer/IntBuffer/LongBuffer/FloatBuffer/DoubleBuffer
      • 在NIO类库中加入Buffer对象,体现了新库与原IO的一个重要区别
        • 在面向流的IO中,可以将数据直接写入或读取到stream对象中
        • 在NIO库中,所有数据都是用缓冲区读写的
    • Channel管道/通道
    • Selector选择器/多路复用器
    • NIO本质
      • 避免原始的TCP建立连接使用3次握手的操作,减少连接的开销
  • 基于NIO2.0的异步非阻塞式(AIO)编程
    • AIO不需要通过多路复用器对通道进行轮询操作即可实现读写,因此是异步的,简化了NIO编程模型

原文地址:https://www.cnblogs.com/qq438649499/p/12111964.html