一、BIO是什么
- bio全名为Bloking IO,也就是阻塞io
- bio是传统的java io, 包名–java.io
- bio实现模式:服务端为每一个请求的客户端都去创建一个线程来处理业务逻辑。
二、BIO简单架构模式以及优缺点
架构模式
在客户端去与服务端建立连接之后,服务端会为每一个客户端都创建一个新的线程,去处理业务逻辑
在服务器中,我们能创建的线程是有限制的。并且大量的线程用来处理客户端的连接以及其他操作是很耗费服务器的资源的。并且bio是阻塞io,也就是客户端没有发送数据的时候,服务端会一直阻塞等待,造成线程资源的浪费
三、BIO使用方法
服务端
public class BIOServer {
public static void main(String[] args) throws Exception{
//使用线程池去提交线程任务
ExecutorService pool = Executors.newCachedThreadPool();
//创建server,绑定端口
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动~");
//循环监听
while (true){
System.out.println("监听等待客户端连接");
//获取客户端的连接 如果没有客户端连接,这个方法会一直阻塞
final Socket socket = serverSocket.accept();
System.out.println("连接到一个客户端");
pool.submit(() ->{
//处理客户端发送的数据
handler(socket);
});
}
}
//与客户端通讯
private static void handler(Socket socket){
try{
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));
}else{
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
从上面的代码中可以看到
服务端等待客户端连接是一个阻塞的操作
serverSocket.accept()
从客户端读取数据也是一个阻塞的操作
inputStream.read(bytes)
所以这种阻塞是毫无意义的阻塞,会造成大量的资源浪费。进而引入了我们的新的io也就是非阻塞io—NIO