BIO 阻塞式IO

BIO 阻塞式IO

  • Java BIO 就是传统的 Java I/O 编程,其相关的类和接口在 java.io

  • BIO(BlockingI/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。【后有应用实例】

  • BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,程序简单易理解。

Java BIO 工作机制

  1. 服务器端启动一个 ServerSocket
  2. 客户端启动 Socket 对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯。
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
  4. 如果有响应,客户端线程会等待请求结束后,再继续执行。

Java BIO 应用实例

  1. 使用 BIO 模型编写一个服务器端,监听 6666 端口,当有客户端连接时,就启动一个线程与之通讯。
  2. 要求使用线程池机制改善,可以连接多个客户端。
  3. 服务器端可以接收客户端发送的数据(telnet 方式即可 win + R 输入CMD 在客户端输入telnet 127.0.0.1 6666)。
  4. 代码演示:
/**
 * @Author:jiangdw7
 * @date: 2023/8/8 10:07
 */
public class bio {

    public static void main(String[] args) throws Exception{

        ExecutorService executorService = Executors.newCachedThreadPool();

        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动");
        while (true){
            System.out.println("等待接收...");
            final Socket accept = serverSocket.accept();
            System.out.println("接收到了一个连接。");
            executorService.execute(new Runnable() {
                public void run() {
                    try {
                        handle(accept);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    static void handle(Socket socket) throws Exception{
       try {
           InputStream inputStream = socket.getInputStream();
           while (true) {
               byte[] bytes = new byte[1024];
               int read = inputStream.read(bytes);
               if (read != -1) {
                   System.out.println("["+Thread.currentThread().getId()+"_"+Thread.currentThread().getName()+"]:" +new String(bytes));
               } else {
                   break;
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           System.out.println("关闭连接");
           socket.close();
       }
    }
}
  1. 每个请求都需要创建独立的线程,与对应的客户端进行数据 Read,业务处理,数据 Write
  2. 当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大。
  3. 连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上,造成线程资源浪费。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值