IO模型
基本说明
- io模型就是数据的发送与接收,这个直接决定了程序之间通信的效率
- Java的网络编程常见三种Io分别是:bio,nio,aio
- Bio:阻塞并且同步,服务器实现一个连接对应一个线程,如果这个连接阻塞,那么就芭比扣了,别的事都没做了。

Nio:非阻塞并同步,服务器实现多个连接对应一个线程,采用了轮询的方式复用io,如果这个连接阻塞,问题不大,线程还能去做别的事情。

aio:异步非阻塞
BIO
BIO工作原理

基本流程
服务端启动一个socket -> 对每一个客户启动一个线程 -> 工作,如果没有响应就会被阻塞。
bio案例
编写一个伪服务器,端口号8888。当有客户端来的时候,启动一个线程去处理。
public class BioDemo {public static void main(String[] args) throws Exception{ExecutorService executorService = Executors.newCachedThreadPool();// ServerSocketServerSocket serverSocket = new ServerSocket(8888);System.out.println("------服务器已经启动------");while (true){// 阻塞式System.out.println("------等待客户端连接------");Socket socket = serverSocket.accept();System.out.println("------已经连接到客户端------");System.out.println("------");executorService.submit(()->{try {doSomething(socket);} catch (IOException e) {e.printStackTrace();}finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}});}}public static void doSomething (Socket socket) throws IOException {System.out.println(Thread.currentThread().getName() + "..." + Thread.currentThread().getId());byte[] bytes = new byte[1024];InputStream inputStream = socket.getInputStream();while (true){int read = inputStream.read(bytes);if(read != -1){System.out.println(new String(bytes,0,read));}}}
}
案例中我们发现,每telnet一次,就会新建一个线程。当一个线程暂时没事做,就会堵在哪里。啥也不做。
结果分析
1、每一个客户端都会独立开辟一个线程就行操作。
2、如果请求的客户端多,那么造成的系统资源开销是特别大的。
3、当一个线程暂时没事做,就会堵在哪里,造成线程资源浪费。
结束语
这就是bio我们认识到了,Bio还是挺不讲武德的,你给人家一人建一个,系统资源浪费不说,还占着茅坑不拉*,造成了茅坑的浪费。这很不好,当然了,在人流量小,厕所大的情况下,并没有什么问题。比较咱们人少。随便浪费。
再见再见再见再见。

















