黄小华的个人网站
熬过无人问津的日子才有诗和远方!
IO底层实现原理

BIO

BIO B指的是blocking的意思,就是阻塞。服务端开发使用ServerSocket绑定端口号后,
程序就会监听该端口,等待accept事件,accept方法会阻塞当前主线程
当服务端收到accept事件时,程序就会拿到一个客户端与当前服务端连接的Socket。
通过该Socket服务端可以进行读写,不过Socket读写方法都会阻塞当前线程,为了能继续
等待其他客户端连接,所以BIO为每个Socket开启一个线程单独处理Socket读写。但难以支持过多的连接,
1万个客户端连接就需要1万个线程,这样CPU就爆了,线程的上下文切换也会把机器负载拉飞。
服务端:
  1.通过ServerSocket创建监听,并创建线程池
  2.当ServerSocket通过accept方法接受到请求时,线程池将会分出一个线程来执行所要进行的操作
  3.(分出的线程会)等待客户端输入完成(即客户端安排做的事),客户端输入完成,则将会执行自己
的处理并返回相应的结果(需要服务端来进行的运算,取数等一些操作,本例中是更改字符串)
  4.服务端处理完成,则将数据返回客户端,等待客户端的下次输入事件,循环3,4,直至客户端释放连接

客户端:

  1.通过Socket创建客户端,在接受到键盘输入后,将输入信息写入OutputStream流中,并等待客户端返回信息,

  2.接受到返回信息后,则接着往下执行,若不需输入,则释放连接

NIO

在操作系统noblockingIO,在Java中叫newIO
NIO可以使用一个线程去解决客户端连接问题,socket设置为非阻塞,accept()方法就不再会阻塞,有就绪socket就会返回 一个有多少个已就绪的文件描述符 没有数据就立即返回null。如果不是null就遍历一遍得到就绪的那些文件描述符去处理。