bio

【转】深入分析JAVA IO(BIO、NIO、AIO)

牧云@^-^@ 提交于 2020-01-15 08:03:49
IO的基本常识 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否完成 2.异步 用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程继续处理 3.阻塞 当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务 4.非阻塞 当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。 IO事件驱动模式 在IO读写时,把 IO请求 与 读写操作 分离调配进行,需要用到事件分离器。根据处理机制的不同,事件分离器又分为:同步的Reactor和异步的Proactor。 Reactor模型: - 应用程序在事件分离器注册 读就绪事件 和 读就绪事件处理器 - 事件分离器等待读就绪事件发生 - 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(即:可以进行读操作了,开始读) - 读事件处理器开始进行读操作,把读到的数据提供给程序使用 Proactor模型: - 应用程序在事件分离器注册 读完成事件 和 读完成事件处理器,并向操作系统发出异步读请求 - 事件分离器等待操作系统完成读取 - 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作

BIO阻塞式网络编程

笑着哭i 提交于 2020-01-14 05:04:53
目录 BIO网络编程 基本的服务端和客户端,Socket+IO 利用多线程技术,解决socketServer线程阻塞的问题 Http协议 Socket+IO和浏览器进行交互 BIO - 阻塞IO的含义 BIO网络编程 基本的服务端和客户端,Socket+IO。 out.write(msg.getBytes(charset)); // 阻塞,写完成 serverSocket.accept(); //阻塞 reader.readLine(); // 没有数据,阻塞 出现的问题:因为服务端有阻塞线程的操作,所以在没处理完之前,只能阻塞线程,即同时 只能处理一个请求 和 一个请求的数据 。 //客户端 public class BIOClient { private static Charset charset = Charset . forName ( "UTF-8" ) ; public static void main ( String [ ] args ) throws Exception { Socket s = new Socket ( "localhost" , 8080 ) ; OutputStream out = s . getOutputStream ( ) ; Scanner scanner = new Scanner ( System . in ) ; System

Netty快速入门(02)Java I/O(BIO)介绍

て烟熏妆下的殇ゞ 提交于 2020-01-13 17:12:18
BIO简介 Java I/O,也叫Blocking I/O,也就是阻塞式I/O。 BIO的流程比较简单,在服务端创立一个ServerSocket去监听,等待连接。客户端创建一个Socket连接过来,服务器端就能接收到连接请求,建立一个连接。连接建立起来后,服务端和客户端就能通过一个流式API进行一个数据通信,进行一些读写操作。 单线程BIO示例 来看一个BIO的例子,服务端创立一个ServerSocket,然后等待连接(accept就是阻塞的): 连接过来以后,使用IO流方式读取和写入数据,处理的方法如下: 客户端发起Socket连接,然后同样用IO流的方式读取和写入数据: 上面这些代码相信很多人都写过,也都熟悉,可以看到单线程的BIO编程逻辑清晰,内容简单,(可惜效率低。。。),运行结果如下: 程序整个过程就是一个单线程的,如果这个时候再来一个客户端连接,那么新来的客户端就无法建立连接,因为上一个连接已经阻塞在while循环中。 多线程BIO示例 来看一个多线程的BIO例子,同样是服务端创立一个ServerSocket,然后等待连接(accept就是阻塞的),区别是,来一个连接就启动一个新线程去处理: 处理的线程方法如下,操作上和单线程的差不多: 多线程体现在服务端,客户端的写法基本没变,下面我们启动一个服务端和三个客户端,查看效果: 这种方式明显的缺点就是当连接多的时候

【转】JAVA BIO与NIO、AIO的区别

你。 提交于 2020-01-09 22:23:17
Java中IO的模型分为三种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 BIO【同步阻塞】 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 NIO【同步非阻塞】 NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候

BIO与NIO、AIO的区别

夙愿已清 提交于 2020-01-08 22:36:34
BIO与NIO、AIO的区别 名词解释: I/O:输入/输出(Input/Output),分为IO设备和IO接口两个部分 Java 针对I/O设计的三种不同数据传输模式 BIO : 同步阻塞I/O NIO : 同步非阻塞I/O AIO : 异步阻塞I/O 1、区别比较优缺点 2、理解同步与异步区别、阻塞与非阻塞的区别 同步:发送一个请求,等待返回,然后再发送下一个请求 (比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息) 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 (电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息 ) 阻塞 非阻塞 3、适用场景 参考详细的文章 来源: CSDN 作者: 你这名字不好听 链接: https://blog.csdn.net/lizhenyu666/article/details/103898012

从实践模拟角度再议bio nio

微笑、不失礼 提交于 2020-01-07 06:40:54
从实践角度重新理解BIO和NIO https://mp.weixin.qq.com/s/rsvAmmoJiseEmjChI95m6Q 1 bio的2次阻塞与缺陷 服务器端在启动后,首先需要等待客户端的连接请求(第一次阻塞),如果没有客户端连接,服务端将一直阻塞等待,然后当客户端连接后,服务器会等待客户端发送数据(第二次阻塞),如果客户端没有发送数据,那么服务端将会一直阻塞等待客户端发送数据。 BIO会产生两次阻塞,第一次在等待连接时阻塞,第二次在等待数据时阻塞。 当我们的服务器接收到一个连接后,并且没有接收到客户端发送的数据时,是会阻塞在read()方法中的,那么此时如果再来一个客户端的请求,服务端是无法进行响应的。在不考虑多线程的情况下,BIO是无法处理多个客户端请求的。 2 多线程的bio 我们只需要在每一个连接请求到来时,创建一个线程去执行这个连接请求,就可以在BIO中处理多个客户端请求了,这也就是为什么BIO的其中一条概念是服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。 while (true) { System.out.println(); System.out.println("服务器正在等待连接..."); Socket socket = serverSocket.accept(); 【重点阻塞】 new Thread

Java IO模型之BIO、NIO、AIO三大IO模型

百般思念 提交于 2020-01-07 02:56:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、IO模型基本说明 IO模型简单理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。 Java共支持3种IO网络编程模型:BIO、NIO、AIO。 Java BIO: 同步并阻塞(传统阻塞型) ,服务器实现模型为了一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。 Java NIO: 同步不阻塞 ,服务器实现模型为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理。 Java AIO(NIO2.0): 异步非阻塞 ,AIO引入异步通道概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,它的特点是由操作系统完成后才通知服务器程序启动线程去处理,一般适用于连接数比较多且连接时间较长的应用。PS:AIO模型在netty中未使用,AIO也没有得到广泛的运用。 二、BIO、NIO、AIO运用的实际场景 BIO适用于 连接数量比较小且固定 的架构,这种方式对服务器资源要求较高,并发局限于应用中,JDK1.4以前的唯一选择,但是程序简单易理解。 NIO适用于 连接数目多且连接比较长 ( 轻操作 )的架构,比如聊天服务器、弹幕服务器

从实践模拟角度再议bio nio【yetdone】

旧街凉风 提交于 2020-01-05 00:41:46
从实践角度重新理解BIO和NIO https://mp.weixin.qq.com/s/rsvAmmoJiseEmjChI95m6Q 1 bio的2次阻塞与缺陷 服务器端在启动后,首先需要等待客户端的连接请求(第一次阻塞),如果没有客户端连接,服务端将一直阻塞等待,然后当客户端连接后,服务器会等待客户端发送数据(第二次阻塞),如果客户端没有发送数据,那么服务端将会一直阻塞等待客户端发送数据。 BIO会产生两次阻塞,第一次在等待连接时阻塞,第二次在等待数据时阻塞。 当我们的服务器接收到一个连接后,并且没有接收到客户端发送的数据时,是会阻塞在read()方法中的,那么此时如果再来一个客户端的请求,服务端是无法进行响应的。在不考虑多线程的情况下,BIO是无法处理多个客户端请求的。 2 多线程的bio 我们只需要在每一个连接请求到来时,创建一个线程去执行这个连接请求,就可以在BIO中处理多个客户端请求了,这也就是为什么BIO的其中一条概念是服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。 while (true) { System.out.println(); System.out.println("服务器正在等待连接..."); Socket socket = serverSocket.accept(); 【重点阻塞】 new Thread

一个小算法的分析

半城伤御伤魂 提交于 2019-12-28 00:42:35
JavaScript对象有id和all两个属性, 问题1: 找到数组a中元素与数组b中元素id属性不同的元素 1 function f1(a,b) { 2 return _.filter(a, function(ai){ 3 var bio = _.find(b, function(bi){ 4 return ai.id == bi.id; 5 }); 6 return !bio 7 }); 8 } 问题2: 找到数组a中元素的all属性为false的元素 1 function f2(a) { 2 return _.filter(a, function(ai) { 3 return !ai.all; 4 }); 5 } 问题3: 找到数组a中元素与数组b中元素id属性不同,且对应b中all属性为false的元素 1 function f(a,b) { 2 return _.filter(a, function(ai){ 3 var bio = _.find(b, function(bi){ 4 return ai.id == bi.id; 5 }); 6 if(!bio) { 7 return true; 8 } 9 return !bio.all; 10 }); 11 } 给定a、b、c是三个不同的对象数组, 1 a=[{id:1, all:true}, {id:2, all

初识BIO/NIO/AIO

不想你离开。 提交于 2019-12-24 04:12:24
阻塞与非阻塞的概念: 主要指的是访问IO的线程是否回阻塞(等待) 线程访问资源,该资源是否准备接续的一种处理方式 1.当线程去请求资源时如果发生了阻塞,该线程会等待资源就绪,直到可以调用该资资源的行为 2.当线程去请求资源时如果发送了阻塞,该线程不再等待该资源,继续执行其它功能的行为 同步与异步的概念:主要指的是数据的请求方式,同步和异步是指访问数据的一种机制 同步:当数据发送请求进行访问的时候,在获取到返回数据之前会阻塞。 异步:当数据发送请求进行访问的时候,在等待返回数据的同时,可以进行其它操作 同步阻塞IO,Block IO, IO操作时会阻塞线程,并发处理能力低。我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务器不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。 同步非阻塞IO,None-Block IO NIO是对 BIO的改进,基于Reactor模型,我们知道,一个socket连接只有在特定时候才会发送数据传输IO操作, 大部分事件这个“数据传输”是空闲的,但还是占用着线程,NIO做出的改进就是“一个请求,一个线程”,在连接服务端的众多socket中