bio

I/O通信模型(BIO,NIO,AIO)

我是研究僧i 提交于 2019-12-21 18:13:32
一、传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。 在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口,Socket负责发起连接操作,连接成功之后,双方通过输入和输出流进行同步阻塞式通信。 1.1、BIO通信模型图 首先,我们通过下面的通信模型图来熟悉下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这就是典型的一请求一应答通信模型。   该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,由于线程是JAVA虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。 它的弊端有很多: 1.性能问题

java整理 io和nio区别

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

深入了解Netty【一】BIO、NIO、AIO简单介绍

こ雲淡風輕ζ 提交于 2019-12-10 03:06:20
引言 在Java中提供了三种IO模型:BIO、NIO、AIO,模型的选择决定了程序通信的性能。 1.1、使用场景 BIO BIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高。 NIO NIO适用于连接数目多、连接时间短的应用,比如聊天、弹幕、服务器间通讯等应用。 AIO AIO适用于连接数目多、连接时间长的应用,比如相册服务器。 1.2、BIO 同步并阻塞模型,服务器会为每一个连接建立一个线程,如果连接过多,且线程不做任何事情,会极大的浪费资源,示意图如下: 1.2.1、机制 流程: 服务器端启动ServerSocket。 客户端启动Socket对服务器进行通信,服务器会为每个客户端建立一个线程与之通信。 客户端发送请求,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。 如果有响应,客户端线程会等待请求结束后,再继续执行。 1.2.2、问题 服务端对于每个请求都要建立独立的线程。 并发数大时,要创建大量的线程,系统资源占用大。 连接建立之后,如果当前线程暂时没有数据可读,则线程就阻塞再Read上,造成线程资源浪费。 1.3、NIO 同步非阻塞模型,服务器端用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理: NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,如果目前没有可用的数据

Java IO:BIO和NIO区别及各自应用场景

旧巷老猫 提交于 2019-12-09 23:00:06
引言 BIO和NIO是两种不同的网络通信模型,现如今NIO已经大量应用在Jetty、ZooKeeper、Netty等开源框架中。 一个面向流、一个面向缓冲区 一个是阻塞式的、一个非阻塞 一个没有io多路复用器、一个有 下面通过一个例子解释两者区别: 假设当前服务端程序需要同时从与多个客户端建立的连接读取数据。 使用BIO 如果采用阻塞式IO, 单线程 情况下,处理者线程可能阻塞在其中一个套接字的read上,导致另一个套接字即使准备好了数据也 无法处理 ,这个时候解决的方法就是针对每一个套接字,都新建一个线程处理其数据读取。 所以说,在BIO工作模式下,服务端程序要想同时处理多个套接字的数据读取,在等待接收连接请求的主线程之外,还要为每一个建立好的连接分配一个新的线程进行处理。 使用NIO 轮询方式 如果将套接字读操作换成非阻塞的,那么 只需要一个线程 就可以同时处理套接字,每次检查一个套接字,有数据则读取,没有则检查下一个,因为是非阻塞的,所以执行read操作时若没有数据准备好则立即返回,不会发生阻塞。 I/O多路复用 这种轮询的方式缺点是浪费CPU资源,大部分时间可能都是 无数据可读 的, 不必仍不间断的反复执行read操作,I/O多路复用(IOmultiplexing)是一种更好的方法,调用select函数时,其内部会维护一张监听 的套接字的列表

netty 概念篇

有些话、适合烂在心里 提交于 2019-12-09 11:06:44
netty是什么?    Netty是由 JBOSS 提供的一个 java开源 框架。Netty提供异步的、 事件驱动 的网络应用程序框架和工具,用以快速开发高性能、高可靠性的 网络服务器 和客户端程序。   也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、 服务端 应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。   “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 Netty和Tomcat有什么区别?   Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。   有人说netty的性能就一定比tomcat性能高,其实不然,tomcat从6

java I/O 模型简述

安稳与你 提交于 2019-12-07 20:57:39
同步与异步&阻塞与非阻塞 五大I/O模型详解 java I/O模型简述 概述 从同步与异步&阻塞与非阻塞的概念,到具体的I/O模型,再到具体的Java语言实现,都是层层递进,本篇就从Java语言来看I/O模型的大概情况。 整个Java I/O模型,大致可以分为三类 BIO:JDK1.4之前的阻塞IO NIO:JDK1.4及以后的版本非阻塞IO AIO:JDK1.7之后,又叫NIO.2 一、BIO阻塞IO 1、基本概念 BIO,即为Blocking I/O,阻塞IO,大致流程为: 1、服务端建立ServerSocket,以一个端口启动 2、等待客户端建立socket连接,如果没有连接,一直阻塞 3、一个socket建立连接之后,从线程池中去一个线程取处理socket 2、代码分析 public class BlockingIOServer { public static void main(String[] args) throws IOException { int port = 10000; ExecutorService threadPool = Executors.newFixedThreadPool(10); ServerSocket server = new ServerSocket(port); while(true){ Socket client = server

深入了解Netty【一】BIO、NIO、AIO简单介绍

半腔热情 提交于 2019-12-06 03:38:44
引言 在Java中提供了三种IO模型:BIO、NIO、AIO,模型的选择决定了程序通信的性能。 1.1、使用场景 BIO BIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高。 NIO BIO适用于连接数目多、连接时间短的应用,比如聊天、弹幕、服务器间通讯等应用。 AIO AIO适用于连接数目多、连接时间长的应用,比如相册服务器。 1.2、BIO 同步并阻塞模型,服务器会为每一个连接建立一个线程,如果连接过多,且线程不做任何事情,会极大的浪费资源,示意图如下: 1.2.1、机制 流程: 服务器端启动ServerSocket。 客户端启动Socket对服务器进行通信,服务器会为每个客户端建立一个线程与之通信。 客户端发送请求,先咨询服务器是都有线程响应,如果没有则会等待,或者被拒绝。 如果有响应,客户端线程会等待请求结束后,再继续执行。 1.2.2、问题 服务端对于每个请求都要建立独立的线程。 并发数大时,要创建大量的线程,系统资源占用大。 连接建立之后,如果当前线程暂时没有数据可读,则线程就阻塞再Read上,造成线程资源浪费。 1.3、NIO 同步非阻塞模型,服务器端用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理: NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,如果目前没有可用的数据

一、I/O模型之BIO

让人想犯罪 __ 提交于 2019-12-06 00:55:08
I/O模型之BIO 基本介绍 Java BIO 就是传统的 Java IO 编程,其相关的类和接口再 java.io 包下 BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,但是如果新启动的这一个线程不做任何事情就会造成不必要的开销,可以通过线程池机制改善 BIO 模型适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发性能差,JDK1.4以前使用 BIO编程的流程 服务器端启动一个SeverSocket 客户端启动Socket对服务器端进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待或者被拒绝 如果服务器有响应,客户端当前线程会等待请求结束后才继续执行 应用实例 实例说明 使用BIO模型编写一个服务器端,监听6666端口,当有客户连接时,就启动一个线程与之通讯 要求使用线程池机制改善,可以连接多个客户端 服务器端可以接收客户端发送的数据(使用telnet) 实例代码: public class BIOServer { public static void main(String[] args) throws Exception { //1、创建一个线程池 ExecutorService

IO操作-BIO

狂风中的少年 提交于 2019-12-05 17:34:55
BIO:block IO,即同步阻塞IO,主要应用于文件 IO 和网络 IO 这里主要说一下网络IO,以Socket编程为例进行说明 1、先建立Socket服务端 1 //BIO 服务器端程序 2 public class TCPServer { 3 public static void main(String[] args) throws Exception { 4 //1.创建ServerSocket对象 5 ServerSocket ss=new ServerSocket(9999); //端口号 6 7 while (true) { 8 //2.监听客户端 9 Socket s = ss.accept(); //阻塞 10 //3.从连接中取出输入流来接收消息 11 InputStream is = s.getInputStream(); //阻塞 12 byte[] b = new byte[10]; 13 is.read(b); 14 String clientIP = s.getInetAddress().getHostAddress(); 15 System.out.println(clientIP + "说:" + new String(b).trim()); 16 //4.从连接中取出输出流并回话 17 //OutputStream os = s

Tomcat三种运行模式(BIO, NIO, APR)

老子叫甜甜 提交于 2019-12-05 11:05:00
Tomcat三种运行模式(BIO, NIO, APR) 同步:自己亲自出马持银行卡到银行取钱(使用同步IO时,Jave 自己处理IO读写)。 异步:委托一小弟拿银行卡到银行取钱, 然后给你(使用异步IO时,Java将IO读写委托给os处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),os需要支持异步IO操作API)。 阻塞: ATM排队取款,你只能等待(使用阻塞10时, Java调用会一直阻塞到读写完成才返回)。 非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞10时,如果不能读写Java调用会马上返回,当10事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。 Java对BI0、 NIO、 AIO的支持: JavaBIO:同步并阻塞,服务器实现模式为一个连接一 个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。。 同步非阻塞,服务器实现模式为一个请求一个线程, 即客户端发送的连接 ➢Java NIO :请求都会注册到多路复用器上,多路复用器轮询到连接有1/0请求时才启动 个线程进行处理。 异步非阻塞,服务器实现模式为一个有效请求一个线程, 客户端 ➢