Java网络编程概念

53 阅读1分钟

阻塞I/O

早期的Java API只支持由本地系统套接字库(Socket)提供的阻塞函数,下面是一个简单的 Socket API 示例:

image.png

该示例是Socket API的基本模板之一,有以下几个重点:

  1. ServerSocket上的accept()方法会一直阻塞,直到有连接建立后会返回一个socket用于客户端和服务端之间的通信,而ServerSocket会继续监听传入的连接。
  2. BufferReader(读取字符串输入流) 和 PrintWriter(打印对象的格式化到文本输出流) 都衍生自 Socket的输入输出流。
  3. readLine()方法会阻塞直到读取到换行符/回车符

缺点

这种方式一个线程只能管理一个客户端,每个客户端的Socket需要新建一个Thread

image.png

对于这种阻塞IO方案,有可能有大量的线程处于休眠状态等待输入/输出,造成大量资源的浪费,其次每个占用的线程都需要在调用栈为其分配内存,这也会占用很大的资源,并且JVM在大量的线程来回切换带来的开销也是很大的。

Java NIO

概念

Java 对于非阻塞I/O的支持是在2002年引入的(JDK1.4的 java.nio)

-NIO最开始是新的输入/输出(New Input/Output)的英文缩写,阻塞I/O则是(Old Input/Out,OIO)
但在其API出现很久后就不再是"新的"了,因此很多用户认为 NIO 代表非阻塞I/O(Non-Blocking I/O)、阻塞I/O代表普通IO(plain I/O)

NIO主要由三大组件组成:Channel、Buffer、Selector

后续待更新.....