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();
// ServerSocket
ServerSocket 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还是挺不讲武德的,你给人家一人建一个,系统资源浪费不说,还占着茅坑不拉*,造成了茅坑的浪费。这很不好,当然了,在人流量小,厕所大的情况下,并没有什么问题。比较咱们人少。随便浪费。
再见再见再见再见。