`
zhouxy1123
  • 浏览: 6132 次
文章分类
社区版块
存档分类
最新评论

客户端 nio bio 的比较

阅读更多

   换完工作有三四个月了,发现一直都在忙,也好久不来这里,写下点什么了。今天就来分析下java Nio 和 Bio 应用于客户端的情况。

   Nio 是 new IO 的缩写,这个新是相对于Bio 而言。对于IO,大体上有两种分类,同步,异步;阻塞,非阻塞之分。Bio 自然是阻塞io,但Nio 不一定就是非阻塞,也可以是阻塞的。所以Nio 体现在新上。 还有阻塞和非阻塞与同步,异步没有太大的对照性。不要以为同步就是用了阻塞IO的,异步就是非阻塞。同步,异步是和你用的线程有关。阻塞的也可用与异步情况,怎不用呢,业务内使用future模式,通信使用线程,也可有异步效果。仔细想想Nio 没出来之前,岂不是java就不能异步通信了,这当然是不可能了的嘛。非阻塞用于同步的就不说了。

   这里看出来同步,异步要看线程。

   这里比较Nio 和Bio 当然是把Nio 用于非阻塞的情况,阻塞的情况又有什么可比的呢?

   我们可以可以看看mina和async http client 的Nio异步的实现方式。大部分是一个acceptor 或connector 线程专门管理建立链接相关的io事务,多个(cpu 核数加一)processor 线程处理数据传输。这里不得不吐槽下这个核数加一的设定,系统的并非处理能力和cpu核数当然是正相关的,但是认为设定个核数加一就算调到最优了,不能不说太傻太天真了。不知道一个进程里可能还有很多其它线程吗,其它进程还有线程吗?怎么能保证在一个分片时间里,处理掉所有的请求事件,尤其是大并发下。所以processor的个数核数加一是个下限而已。

  在比较下,客户端通信与服务器通信之间的不同,一般总压力表现为,并发量*频率*单次压力,前两个不用废话,后一个对于io和计算就有点不同,业务越复杂,这个对于一次的计算压力越大,数据量越大,io压力越大。当然大部分都是一项或一两项高。

  如果是小数据,并发,频率高,用mina 类的处理方式是非常不错的,保证每一个processor在自己的时间分片里处理完所以请求事件即可,如果处理不完呢?那只有加线程了,不行就加机器,就像公司里一样,活多人少,那可是不行的。而且服务端好处是io 可以和业务分离,io 有io 线程,业务有业务线程。这个对于客户端就不是太好了,这个在后面分析。所以如果是小数据量,io线程能保证快速处理io事件即可,对于业务,业务少,tps 达标,当然可以在io 线程里把业务也做了,如果太多,那加个线程池来处理也是可以的,如果还不够,妹的,esb,服务化加消息走起,先给你个简单回复,例如“容哥三思”,做完了,通过消息中间件发连接通知服务器,再发通知,如“哥想过了,这个可以有”云云。可谓玩法多多。

  但是对于客户端,要发请求等响应,这就比较麻烦,因为请求和响应要对的起来,就像你同时像A和B要钱(非阻塞请求),那么A给你的钱,你得记在A上,B给你的要记在B上。现实情况可能比较简单,但对于同一个服务器,请求和响应要能绑定,那么顺序就要保证,这就不能简单的处理事件了。(对于服务器是不需要的,从哪来的请求,我给谁响应就行)。除非在协议上有规定,那么请求和响应就要有原子性。一个链路上就是一个请求一个响应的顺序。这个和Bio 区别就不大了。

   所以很多客户端还是Bio的形式,如mongo,redis,c3p0等链接池还是bio 的形式

  

分享到:
评论

相关推荐

    bio nio aio demo

    在Java世界中,I/O(输入/输出)是任何应用程序不可或缺的部分。为了处理与外部世界的交互,Java提供了三种不同的I/O模型:BIO( Blocking I/O...这个"bio nio aio demo"项目是学习和比较Java I/O模型的一个宝贵实践。

    Socket 之 BIO、NIO、Netty 简单实现

    在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...

    基于java的BIO、NIO、AIO通讯模型代码实现

    Java作为一门广泛使用的开发语言,提供了多种I/O(Input/Output)通信模型,包括传统的阻塞I/O(BIO)、非阻塞I/O(NIO)以及异步I/O(AIO)。这些通信模型在不同的场景下有着各自的优势,理解和掌握它们对于优化...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输能力,尤其适合于高并发、低延迟的网络应用,如聊天服务器。在这个场景下,...

    JAVA NIO 异步通信客户端

    NIO代表“非阻塞输入/输出”,与传统的I/O模型(BIO,阻塞I/O)相比,它提供了更好的性能和更高的并发性,特别适用于高并发的网络应用程序,如服务器端处理大量连接的情况。 在描述中提到的"JAVA NIO 异步通信...

    一般Socket客户端与Mina NIO Socket客户端对比示例

    首先,普通Socket客户端基于BIO(Blocking I/O)模型,它在等待数据读写时会阻塞线程,直到I/O操作完成。这意味着如果服务器响应较慢或者网络延迟较高,客户端线程会被占用,无法处理其他请求,降低了系统的并发能力...

    nio异步长连接服务端与客户端

    Java NIO(非阻塞I/O)是一种在Java中实现高效I/O操作的方式,相比于传统的BIO(阻塞I/O),NIO提供了更强大的数据传输能力,尤其适用于高并发、低延迟的网络应用,如服务器长连接场景。在这个主题中,我们将深入...

    BIO,NIO,AIO实现的demo

    这里我们主要探讨三种不同的I/O模型:BIO( Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)。这三种模型各有特点,适用于不同的场景。 BIO(阻塞I/O)是Java早期的标准I/O模型,它基于流...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    全面理解 Java 网络编程 - BIO、NIO、AIO 本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO...

    java socket Bio Nio example

    在Java中,Socket主要分为两种模式:BIO(Blocking I/O)和NIO(Non-blocking I/O)。这两个模式分别有不同的应用场景和优缺点。 **一、Java Socket BIO** BIO,即阻塞I/O模型,是Java最初提供的网络通信方式。在...

    java BIO NIO AIO

    Java BIO NIO AIO Java BIO、NIO、AIO是 Java 中的三种 I/O 模式,每种模式都有其特点和应用场景。下面对每种模式进行详细解释。 Java BIO Java BIO( Blocking I/O)是一种同步阻塞式的 I/O 模式,即服务器实现...

    nio 服务器/客户端模式

    在Java编程领域,NIO(New Input/Output)是一种非阻塞I/O模型,与传统的BIO(Block I/O)模型相比,它提供了更高效的数据处理方式。NIO主要用于提高服务器处理大量并发连接的能力,特别适合于高并发、低延迟的网络...

    nio、bio、netty的一些案例

    本资源主要涵盖了三种不同的I/O模型:BIO( Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是Java平台上的重要网络编程技术。下面将详细介绍这些概念及其在实际应用中的案例。 首先,BIO(阻塞I/O)是最...

    nio+bio+netty+fx.zip

    在Java世界中,网络编程是不可或缺的一部分,而`BIO`( Blocking I/O)、`NIO`(Non-blocking I/O)以及`Netty`框架都是处理I/O操作的关键技术。本项目通过`JavaFX`创建了一个可视化的聊天室,演示了这三种I/O模型在...

    BIO、NIO、AIO、Netty 、TCP全网最全解析!Netty中提供了哪些线程模型?

    本文将深入探讨BIO( Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架中的线程模型,并与TCP网络协议相结合,为您提供全网最全面的解析。 首先,让我们从基础开始,了解这些I/O...

    BIO,NIO,AIO,Netty面试题.pdf

    ### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都通过流的方式被串行化处理。串行化的含义在于数据必须按顺序输入输出。Java中的IO操作...

    传统BIO编程模型及NIO编程模型源码

    在Netty中,BIO和NIO的源码分析可以帮助我们深入了解底层的I/O机制,理解如何通过Java API实现高效的网络通信。学习这些源码不仅可以提高我们的编程能力,还能让我们在设计和优化网络服务时做出更明智的决策。

    aio_bio_nio.rar

    Java网络通信中,AIO(Asynchronous Input/Output)、BIO(Blocking I/O)和NIO(Non-blocking I/O)是三种不同的I/O模型,它们各自有着不同的特性和适用场景。下面将详细介绍这三个概念以及它们在Java中的实现。 *...

    SocketIO-BIO-NIO-AIO.zip

    SocketIO-BIO-NIO-AIO.zip是一个压缩包文件,它包含了一个关于Java中三种不同的I/O模型——BIO( Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)的深入讲解。这些I/O模型是Java进行网络编程时的...

    Java通讯模型-BIO、NIO、AIO综合演练

    虽然描述中没有提供具体的代码,但通常在实际演练中,开发者会创建一个简单的服务器,分别用BIO、NIO和AIO的方式处理客户端连接,比较它们的性能和编程难度。这通常涉及到服务器端的监听、接收连接、读取数据、处理...

Global site tag (gtag.js) - Google Analytics