I/O模型之BIO

基本介绍

  • Java BIO 就是传统的 Java IO 编程,其相关的类和接口再 java.io 包下
  • BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,但是如果新启动的这一个线程不做任何事情就会造成不必要的开销,可以通过线程池机制改善
  • BIO 模型适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发性能差,JDK1.4以前使用

BIO编程的流程

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

应用实例

实例说明

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

实例代码:

public class BIOServer {
public static void main(String[] args) throws Exception {
//1、创建一个线程池
ExecutorService threadPool = Executors.newCachedThreadPool(); ServerSocket serverSocket = new ServerSocket(6666); System.out.println("服务器启动了!!!");
while (true){
//监听,等待客户端连接
final Socket socket = serverSocket.accept();
System.out.println("连接到一个客户端");
//2、如果有客户端连接了,就创建一个线程,与之通讯(单独写一个方法)
threadPool.execute(new Runnable() {
public void run() {
//与客户端进行通讯
handler(socket);
}
});
} } //编写一个与客户端通讯的handler方法
public static void handler(Socket socket){
//用于接收数据
byte[] bytes = new byte[1024];
//通过socket获取输入流
InputStream inputStream = null;
try {
System.out.println("线程id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());
inputStream = socket.getInputStream(); //循环读取客户端发送的数据
while(true){
int read = inputStream.read(bytes);
if (read!=-1){
//输出客户端发送的数据
System.out.println(“收到信息:”+new String(bytes,0,read));
}else{
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
System.out.println("关闭与客户端的连接......");
try {
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

测试结果:

服务器启动了!!!
连接到一个客户端
线程id=12名字=pool-1-thread-1
收到消息:nihao

一、I/O模型之BIO的更多相关文章

  1. Java IO模型:BIO、NIO、AIO

    Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...

  2. I/O模型之四:Java 浅析I/O模型(BIO、NIO、AIO、Reactor、Proactor)

    目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...

  3. IO模型之BIO代码详解及其优化演进

    一.BIO简介 BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口.由于传统IO读数据的时候如果数据没有传达,IO会一直等待输入传入,所以当有请求过来的 ...

  4. Netty学习(1):IO模型之BIO

    概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...

  5. 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO

    前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...

  6. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...

  7. Java I/O模型从BIO到NIO和Reactor模式(转)

    原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 ...

  8. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  9. Java Se : Java NIO(服务端)与BIO(客户端)通信

    Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中 ...

随机推荐

  1. Vue中router路由异步加载组件-优化性能

    何时使用异步加载组件 当首页app.js文件太大时,可以拆分组件异步加载,如果app.js文件很小时,不建议使用异步加载组件,因为异步加载组件时每次都要发送一个HTTP请求,这样的代价远比首页一次性加 ...

  2. 图片验证码推导逻辑,Image.new,ImageDraw, ImageFont.truetype的用法

    #一, 创建图片并在图上添加文本 from PIL import Image,ImageDraw,ImageFont a = '我们不一样' # 定义文本 font = ImageFont.truet ...

  3. 《Java基础知识》Java 泛型详解

    JDK 1.5 之后,Java 通过泛型解决了容器类型安全这一问题,而几乎所有人接触泛型也是通过Java的容器.那么泛型究竟是什么? 泛型的本质是参数化类型:也就是说,泛型就是将所操作的数据类型作为参 ...

  4. C# 控制台输入和输出

    目录 从控制台获取输入 将输出写入控制台 Console.Write() Console.WriteLine() 格式字符串 多重标记和值 格式化字符串 索引 对齐说明符 格式字段 标准数字格式说明符 ...

  5. Windows系统下解决PhPStudy MySQL启动失败

    报错 Apache\Nginx服务正常启动了,但是MySQL却一直启动失败. 解决流程 查看端口是否被占用 打开系统自带的资源管理器,查看监听端口3306是不是被占用,下图中3306端口被mysqld ...

  6. java打字游戏-一款快速提升java程序员打字速度的游戏(附源码)

    一.效果如图: 源码地址:https://gitee.com/hoosson/TYPER 纯干货,别忘了留个赞哦!

  7. 最短路径之Dijsktra算法(python)

    定义: 起始位置:A 终止位置:F 持久集合:permanent = set() 暂时集合:temporary = set() 首先将起始位置A加入永久集合,并将A的距离设为0, 此时遍历A的邻接节点 ...

  8. 2019icpc银川站 复现赛

    打了计蒜客上的银川重现赛,总体感觉难度上确实比平时区域赛要低上一些. 这里补一下F题和G题的思路和代码. upd:I题也补了,理解差不多都在注释里. F题        做法,玩一下n=10的样例就出 ...

  9. xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml

    xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...

  10. 死磕 java线程系列之线程池深入解析——构造方法

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能 ...