BIO就是传统的java io编程,其相关的类和接口在java.io 上。
BIO(Blocking I/O): 同步阻塞IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就会新起一个线程进行处理,如果这个线程不做任何事情会造成不必要的线程开销,可以通过线程池机制改善。
BIO适用于连接数较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用,JDK1.4 以前的唯一选择。

1. BIO 简单流程

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

2.应用实例

1》使用BIO模型监听一个服务器端,监听6666端口,当有客户端连接时,就启动一个线程与之通讯
2》要求使用线程池机制改善,可以连接多个客户端
3》服务器端可以接收客户端发送的数据(telnet 方式即可)

package cn.qlq;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOServer {public static void main(String[] args) throws IOException {// 1. 创建线程池ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();// 2. 创建ServerSocketServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动了====");while (true) {final Socket socket = serverSocket.accept();System.out.println("接收到一个客户端连接");newCachedThreadPool.execute(new Runnable() {@Overridepublic void run() {handle(socket);}});}}public static void handle(Socket socket) {System.out.println("threadId: " + Thread.currentThread().getId() );try {byte[] bytes = new byte[1024];// 通过sockets读取输入流InputStream inputStream = socket.getInputStream();// 循环读取数据while (true) {System.out.println("threadId: " + Thread.currentThread().getId() + " 等待read");int read = inputStream.read(bytes);if (read != -1) {String readStr = new String(bytes, 0, read);System.out.println("threadId: " + Thread.currentThread().getId() + "\t" + readStr);} else {break;}}} catch (IOException e) {e.printStackTrace();} finally {System.out.println("关闭和客户端的连接");try {socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

启动服务端使用Telnet测试:
1. telnet连接

telnet 127.0.0.1 6666

查看服务器日志

服务器启动了====
接收到一个客户端连接
threadId: 12
threadId: 12 等待read

2. CTRL + ] 键进入命令行,然后发送字符串命令

Escape 字符为 'CTRL+]'
Microsoft Telnet> send 456789
发送字符串 456789
Microsoft Telnet> send hello china!
发送字符串 hello china!
Microsoft Telnet>

3. 查看服务器控制台

服务器启动了====
接收到一个客户端连接
threadId: 12
threadId: 12 等待read
threadId: 12    456789
threadId: 12 等待read
threadId: 12    hello china!
threadId: 12 等待read

4. 新启动一个telnet窗口查看

欢迎使用 Microsoft Telnet Client
Escape 字符为 'CTRL+]'
Microsoft Telnet> send 868655
发送字符串 868655
Microsoft Telnet>

5. 查看服务器控制台日志

服务器启动了====
接收到一个客户端连接
threadId: 12
threadId: 12 等待read
threadId: 12    456789
threadId: 12 等待read
threadId: 12    hello china!
threadId: 12 等待read
接收到一个客户端连接
threadId: 13
threadId: 13 等待read
threadId: 13    868655
threadId: 13 等待read

6. 断开一个

Microsoft Telnet> quit

控制台日志

关闭和客户端的连接

4. BIO问题

1》 每个请求都需要创建独立的线程,与对应的客户端进行Read,业务处理,数据Write
2》当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大
3》连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在Read操作上,造成线程资源浪费

解决类似的问题就需要用NIO技术。

BIO基本介绍以及使用相关推荐

  1. BIO与BIO的区别介绍详解

    1.BIO基本介绍 BIO是传统的Java IO编程,其基本的类和接口在java.io包中 BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端 ...

  2. Java BIO编程

    I/O 模型 1.I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. (比如客户端和服务器端进行通信用的是单通道还是双通道,异步通信还是同步通信,是阻塞的 ...

  3. 二、JAVA BIO

    NIO 目录 文章目录 二.JAVA BIO 1. Java BIO基本介绍 2. java BIO工作机制 3.传统的BIO编程实例回顾 3.1.客户端案例如下 3.2.服务端案例如下 3.3.输出 ...

  4. 从前慢-BIO、NIO、AIO

    BIO.NIO.AIO 1 BIO.NIO.AIO 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不 同系统或者不同进程之间的数据交互,或者在高并发下的通信场景 下都需要用到网络通信相关 ...

  5. BIO、NIO、AIO 详解和基于BIO模式下即时通信

    第一章 BIO.NIO.AIO课程介绍 身边同学写的,没发布出来,我算是转载 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者 ...

  6. Netty入门之BIO,NIO和AIO编程

    Netty简介 Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发 ...

  7. ​纽约伊坎医学院房刚组诚聘博士后: 表观基因组, 宏基因组, 精准医疗

    纽约伊坎医学院房刚组诚聘博士后: 表观基因组, 宏基因组, 精准医疗 实验室介绍 美国西奈山伊坎医学院(Icahn School of Medicine at Mount Sinai, US News ...

  8. Netty专题-(1)初识Netty

    写在前面 最近对Netty这一块进行了一下学习,因为之前不是很了解.这里在学习的过程中也跟着做了一些笔记,特意整理在这里,希望对想学习的小伙伴有一定的帮助.这里是从最开始的基础进行学习,所以对于想入门 ...

  9. (二)Netty之IO模型

    IO模型 I/O模型的简单理解: 就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能 JAVA共支持三种网络编程模型IO模式:BIO.NIO.AIO JAVA BIO:同步并阻塞( ...

最新文章

  1. java中怎么固定间距_java中的GridBagLayout是怎么调组件间距的...
  2. mock()java,关于java:@ Mock,@ MockBean和Mockito.mock()之间的区别
  3. mysql error 1130 hy000:Host ‘localhost‘ is not allowed to connect to this mysql server 解决方案
  4. C++ ------------------------- 文件的复制
  5. SqlServer2005海量数据存储过程分页(上)
  6. noip2016题解
  7. html闹钟设置,闹钟的设置.html
  8. 【随笔】Linux drop_caches
  9. 电路方案分析(十三)采用 CAN 的汽车分立式 SBC 预升压、后降压参考设计方案
  10. REST-assured简介
  11. 龙芯平台的播放器和浏览器硬解1080和4k视频
  12. 世界时间UT和协调世界时间UTC
  13. 基本组件之botton
  14. 【AIOT】Python语音处理
  15. 2020年终总结——走在代码公益的路上
  16. openstack-iass搭建 二
  17. Android 翻牌动画 实现
  18. MEMS传感器中的小型化_凯利讯半导体
  19. 【文献管理】Zotero插件QuickLook || 让Zotero具备文献预览功能
  20. 对于软件工程的疑惑以及三款软件的特点

热门文章

  1. bga封装扇出过孔,用Allegro软件如何实现BGA封装的扇出?
  2. 清华大学胡事民是计算机视觉,清华团队将Transformer用到3D点云分割上后,效果好极了丨开源...
  3. 4 支付宝手机网站支付demo讲解
  4. ESD9X5VU-2/TR瞬态电压抑制器WILLSEM ESD9X5VU 1线单向超低电容
  5. 带你走进微博背后的大数据原理:微博推荐算法
  6. svn在本地搭建服务器,自己可以访问,局域网的其他电脑不可以访问
  7. python实操案例_Python数据分析基础实操案例
  8. 深入正则表达式(0):正则表达式概述
  9. 多款功能强大的chrome谷歌浏览器插件推荐
  10. 单电源运放全波整流电路