4. 同步阻塞BIO

作者: 童伯虎 | 来源:发表于2019-07-18 10:58 被阅读0次

在同步阻塞模型(BIO)中,ServerSocket负责绑定IP地址,启动监听端口,Socket负责发起连接操作。连接成功之后,双方通过输入和输出流进行同步阻塞式通信。

阻塞操作有:

  1. connect():客户端发送请求,建立连接
  2. accept():服务器接受请求,建立连接
  3. inputStream/outputStream:同步阻塞读写

BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这是典型的一请求一应答通信模型。

一请求一应答
  • Server

监听逻辑:

// 线程池处理客户端请求
ExecutorService executorService = Executors.newFixedThreadPool(3);

// 启动服务器
ServerSocket serverSocket = new ServerSocket(8000);

while (true) {
    // 阻塞直到成功建立连接
    Socket socket = serverSocket.accept();
    // 在另一线程处理
    executorService.submit(() -> handle(socket));
}

serverSocket.close();

处理逻辑:

void handle(Socket socket) {
    // 向客户端发送当前时间
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        socket.getOutputStream(), "UTF-8"));
    writer.write(new Date().toString());
    writer.flush();

    // 休眠1s后关闭连接
    Thread.sleep(1000);
    socket.close();
}
  • Client

通信逻辑:

void request(String host, int port) {
    // 阻塞直到成功建立连接
    Socket socket = new Socket(host, port);

    // 通过输入流读取服务器消息
    BufferedReader reader = new BufferedReader(new InputStreamReader(
        socket.getInputStream(), "UTF-8"));
    StringBuilder sb = new StringBuilder();
    while (true) {
        // 阻塞直到服务器消息到达
        String line = reader.readLine();
        if (line == null) {
            break;
        }
        sb.append(line);
    }
    System.out.println("服务器消息:" + sb.toString());

    // 关闭连接
    socket.close();
}

并发逻辑:

String host = "127.0.0.1";
int port = 8000;
int num = 5;

Runnable runnable = () -> request(host, port);
for (int i = 0; i < num; i++) {
    new Thread(runnable).start();
}
  • 结果

同时发送5个请求,而服务器只有3个处理线程,则有2个请求需要等到处理线程释放后才能被处理。

Thread-1:服务器消息:Thu Jul 18 10:45:26 CST 2019
Thread-2:服务器消息:Thu Jul 18 10:45:26 CST 2019
Thread-0:服务器消息:Thu Jul 18 10:45:26 CST 2019
Thread-3:服务器消息:Thu Jul 18 10:45:27 CST 2019
Thread-4:服务器消息:Thu Jul 18 10:45:27 CST 2019

相关文章

  • 4. 同步阻塞BIO

    在同步阻塞模型(BIO)中,ServerSocket负责绑定IP地址,启动监听端口,Socket负责发起连接操作。...

  • 百万架构师精心要养育IO三兄弟,来听听他的“辛苦经历”

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、同步阻塞的BIO 在JDK...

  • 谈论:同步异步阻塞非阻塞.md

    同步/异步:关注的方式(是否主动) 阻塞/非阻塞: 同步阻塞BIO: 同步非阻塞NIO: 异步非阻塞: 异步阻塞:

  • BIO NIO AIO

    BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。 io操作分...

  • BIO与NIO、AIO的区别(这个容易理解)

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来...

  • IO笔记

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来...

  • Java中BIO、NIO和AIO的区别和应用场景

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来...

  • 分布式理论架构设计

    IO模型 BIO 同步阻塞 NIO 同步非阻塞 AIO 异步非阻塞 NIO核心组件 Selector Channe...

  • [笔记]BIO、NIO、AIO

    简述 BIO为同步阻塞BlockingIO,BIO适用于连接数小,结构固定的场景。NIO为同步非阻塞NoBlock...

  • 网络模型

    网络模型 BIO(同步阻塞IO) 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式。 同步并阻塞,服务...

网友评论

    本文标题:4. 同步阻塞BIO

    本文链接:https://www.haomeiwen.com/subject/bwhyhctx.html