I/O 模型

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

2.Java 共支持 3 种网络编程模型 I/O 模式:BIO、NIO、AIO。

3.Java BIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。【简单示意图】


如果客户端的数量非常多,那么服务器端就要开启特别多的线程,线程的开销比较大。服务器压力过大。势必造成服务器性能下降。并且建立完一个连接之后,并不是一直在通信。有时还可能处于阻塞阶段。造成不必要的开销。

4.Java NIO:同步非阻塞服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理。【简单示意图】


Selector会不停的轮询,它会查看这些请求有哪一个事件发生了,然后选择其中一个进行处理。一个线程可以维护多个连接请求。由于与客户端建立连接之后,并不是一直都处于活动状态,即读写状态,选择器会不停的去轮询,只有需要读写的时候才会分配CPU,进行数据的处理。

5.Java AIO(NIO.2):异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用

我们依次展开讲解。

BIO、NIO、AIO 使用场景分析

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

2.NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,JDK1.4 开始支持。

3.AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK7 开始支持。

Java BIO 基本介绍

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

Java BIO 工作机制


对 BIO 编程流程的梳理

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

Java BIO 应用实例

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

代码演示:

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.创建一个线程池//2.如果有客户端连接,就创建一个线程,与之通讯(单独写一个方法)ExecutorService newCachedThreadPool= Executors.newCachedThreadPool();//创建ServerSocketServerSocket serverSocket=new ServerSocket(6666);System.out.println("服务器启动了");while(true){//监听,等待客户端连接final Socket socket=serverSocket.accept();  //这里会发生阻塞System.out.println("连接到一个客户端");//就创建一个线程,与之通讯newCachedThreadPool.execute(new Runnable() {//重写run方法public void run() {//可以和客户端通讯handler(socket);}});}}//编写一个handler方法,和客户端通讯public static void handler(Socket socket){try {System.out.println("线程信息 id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());byte[] bytes=new byte[1024];//通过socket获取输入流InputStream inputStream=socket.getInputStream();//循环读取客户端输入的数据while(true){System.out.println("线程信息 id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());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("关闭和client的连接");try {socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

运行

以管理员身份运行cmd,启动一个客户端

按住ctrl+]之后,可以收发消息

开启了两个线程

问题分析

1.每个请求都需要创建独立的线程,与对应的客户端进行数据 Read,业务处理,数据 Write。

2.当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大。

3…连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上,造成线程资源浪费
(没有读取,这个线程就无法做其它事情,而NIO就是事件驱动模型)

Java BIO编程相关推荐

  1. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  2. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  3. 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识

    一步一步走来,之前去学习了JUC并发编程知识,现在终于到Java IO网络编程啦,难啊. 一.BIO介绍 引入: 随着技术的发展,两个或以上的程序必然需要进行交互,于是提供了一种端到端的通信,相当于对 ...

  4. Java BIO、NIO、AIO 学习

    2019独角兽企业重金招聘Python工程师标准>>> 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写) ...

  5. JAVA BIO与NIO、AIO的区别

    引用:https://blog.csdn.net/ty497122758/article/details/78979302 IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的A ...

  6. Java 核心编程技术干货

    Java 基础篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具类篇 Java 综合篇 Java基础篇 恕我直言,在座的各位根本写不好Java! 8张图带 ...

  7. Java 异步编程:从 Future 到 Loom

    众所周知,Java 开始方法执行到结束,都是由同一个线程完成的.这种方式虽易于开发调试,但容易因为锁.IO 等原因导致线程挂起,产生线程上下文切换.随着对应用并发能力要求越来越高,频繁的线程上下文切换 ...

  8. Java BIO、NIO、AIO的区别

    一.基础概念 同步:是指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪. 异步:是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特 ...

  9. Java AIO 编程

    转载自 java aio 编程 Java NIO (JSR 51)定义了Java new I/O API,提案2000年提出,2002年正式发布. JDK 1.4起包含了相应的API实现. JAVA ...

最新文章

  1. android上传本地图片到服务器上,Android使用post方式上传图片到服务器的方法
  2. python3.6+pytorch-cpu+Pycharm环境下的PyTorch配置方法
  3. CentOS 7 + MySql 中文乱码解决方案
  4. jsp中out.println()报红
  5. 国家自然科学基金2020年预算减少22亿元
  6. gerber文件怎么导贴片坐标_SMT贴片机在线编程调试
  7. c++ 实现录音并且指定到文件_搜狗发布四款AI录音笔,4大核心功能开启AI录音新时代...
  8. css颜色渐变 移动,CSS颜色渐变
  9. Modern Python Cookbook》(Python经典实例)笔记 2.3 编写长行代码
  10. 阿里P3C自定义规则后本地打包成IDEA插件
  11. php呼叫平台,php – Twilio呼叫转发
  12. JS实现waterfall
  13. SCARA、通用6轴机器人奇异点位置与问题分析
  14. git HEAD切换
  15. 各国家 MCC 和 MNC 列表
  16. 固态硬盘比机械硬盘快的原因(科普篇)
  17. woo语言使用sockets模拟http请求
  18. 观察者模式ApplicationListener异步处理事件
  19. 以user_1用户身份登录mysql_创建MySQL用户帐户和授予权限
  20. Android VideoView播放网络视频

热门文章

  1. 男女薪酬差异扩大 2018年女性薪酬不及男性8成?
  2. 36岁程序员:领导平时称兄道弟,裁员时立刻变脸,看透人性
  3. 基于Linux2.6下的按键驱动开发步骤
  4. 实际项目开发管理流程图
  5. mysql5.6 load_MySQL 5.6 dump/load buffer pool实验
  6. rtp发送h264和h265
  7. 1 数列分块入门_LOJ#6277.数列分块入门1
  8. 让ubuntu开机快一点:记开机出现Waiting for network configuration...
  9. c语言 条件编译注释,c语言的预处理/条件编译,最全整理看这里
  10. 【java】Java -jar 运行的程序如何 本地代码远程调试服务器程序