Java网络编程知识要点(二)

125 阅读3分钟

Socket是啥?

  • TCP/IP协议族通信的中间软件抽象层,是一组接口即使门面模式。TCP用注解的ip+端口号,作为TCP连接的端点,这个端点叫做套接字socket。

BIO

  • 同步阻塞式IO,ServerSocket负责绑定ip,启动监听端口,起一个线程让socket负责发起连接。

image.png

image.png

NIO

  • 非阻塞IO,客户端和服务器通过channe通讯、实现多路复用
  • 什么是IO事件?
    • 表示通道某种IO操作已经就绪、或者说已经做好了准备。一个Channel通道如果有数据可读,就会发生一个IO事件,代表该连接数据已经准备好,这个IO事件叫做“读就绪”事件。
    • SelectionKey.OP_CONNECT
    • SelectionKey.OP_ACCEPT
    • SelectionKey.OP_READ
    • SelectionKey.OP_WRITE
  • IO多路复用?
    • 是指一个线程/进程 可以同时监视多个文件描述符(含socket连接),一旦其中的一个或者多个文件描述符可读或者可写,该监听进程/线程能够进行IO事件的查询。怎么对多个文件描述符进行监听呢?elector选择器
  • Selector选择器
    • 事件订阅器、轮询代理器、channel容器管理机
  • IO多路复用的实现
    • 1、是把通道注册到选择器中
    • 2、通过选择器提供的事件查询(select)方法,查询这个注册的通道是否已经有就绪的IO事件。
    • 3、由于一个选择器只需要一个线程进行监控,所以只要一个简单的线程去管理多个连接通道

image.png

image.png

  • 优点 相比NIO,不必为每一个网络连接创建一个线程。一个线程负责多个连接通道的IO处理。

  • Channel管道

    • Channel和Stream的一个显著的不同是:Stream是单向的,譬如InputStream是单向的只读流,OutputStream是单向的只写流;而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。

buffer缓冲区

  • buffer的子类会拥有一块内存作为数据的读写缓冲区,具体实现是 byte数组
  • capacity 、position、limit

image.png

  • allocate()创建缓冲区,比如IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(20),创建了一个Intbuffer实例对象,并且分配了20*4个字节的内存空间
  • put()写入到缓冲区 创建了一个Intbuffer实例对象,并且分配了20*4个字节的内存空间
  • flip() 模式转换
  • get()从缓冲区读取
  • rewind()倒带,已经读完的数据,如果需要再读一遍,可以调用rewind()方法。
  • clear( )清空缓冲区

buffer类的基本步骤

  • 创建子类实例对象的allocate,创建一个buffer类的 实例对象
  • 调用put写入缓冲区
  • buffer.flip 切为读模式
  • get 拿数据
  • 读完之后clear或者compact

Channel 管道

(1)FileChannel文件通道,用于文件的数据读写;

(2)SocketChannel套接字通道,用于Socket套接字TCP连接的数据读写;

(3)ServerSocketChannel服务器套接字通道(或服务器监听通道),允许我们监听TCP连接请求,为每个监听到的请求,创建一个SocketChannel套接字通道;

(4)DatagramChannel数据报通道,用于UDP协议的数据读写。

文件IO、TCP IO 、UDP IO

获取 读取 写入 关闭

image.png