`
962685987962685987
  • 浏览: 5171 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java网络编程从入门到精通(31):非阻塞I/O简介

阅读更多

在网络应用中,一般可以采用同步 I/O(阻塞 I/O)和非阻塞 I/O两种方式进行数据通讯。这两种方式并非互相排斥和互相取代。我们可以在平时的应用中单独采用其中一种通讯方式,也可以混合使用这两种通讯方式。在本文中就什么是非阻塞 I/O以及为什么要使用这种通讯方式进行了介绍,在下一篇文章中给出了一个简单的例子来演示在网络应用中如何使用非阻塞 I/O进行通讯。

一、 什么是非阻塞 I/O
我们可以将同步 I/O称为阻塞 I/O,非阻塞 I/O称为异步 I/O。在本书中采用了比较常用的叫法:同步 I/O和非阻塞 I/O。虽然它们的叫法不同,但含义是一样的。读者在阅读其他书时应注意这一点。
在讲解什么是非阻塞 I/O之前,首先应了解什么是同步 I/O,这里的同步指的是什么。同步这个概念在程序设计中主要是指代码按顺序执行的过程。如在 Java程序中的 main方法,如果不使用多线程,这个方法中的代码一定是从前往后按顺序执行的。这就叫做同步。如果使用了多线程,从宏观角度来看会有不同的代码段同时执行,这就叫做异步。在同步 I/O中的同步概念也类似,也就是说,在 I/O通 讯过程中,只要是某一步的通讯未结束,就无法进行其他的通讯。那么这里的同步指的是什么呢?要回答这个问题之前,首先让我们先回忆一下,在网络通讯中有哪 些地方可能会被阻塞。如果读者看了前面的章节就会知道答案。对于客户端来说,有两个地方可能会被阻塞:连接服务器(调用 connect方法时)和读写数据。而在服务端也有两个地方可能会被阻塞:等待客户端请求(调用 accept方法时)和读写数据(在一般情况下,写数据不会被阻塞,但如果网络环境比较差的时候,客户端和服务端的写数据操作也可能发生阻塞现象)。也就是说,可以设置超时时间的地方就可能被阻塞。而同步 I/O中的同步就是指除了以下两种情况外程序会一直处于等待状态:
1. 连接服务器、读写数据或等待客户端请求正常地执行。
2. 在等待超时时间后,抛出了超时异常。
在上面我们了解了什么是同步 I/O。而非阻塞 I/O和同步 I/O最明显的不同就是同步 I/O所有可能被阻塞的地址在非阻塞 I/O中都不会被阻塞。如在读取数据时,如果数据暂时无法被读取。那么在非阻塞 I/O中会立刻返回,以便程序可以执行其他的代码,然后系统会不断侦测这个未完成的读取操作,直到可以继续读数据时再来完成这个操作。
Java JDK1.4及以后版本中提供了一套 API来专门操作非阻塞 I/O,我们可以在 java.nio包及其子包中找到相关的类和接口。由于这套 API JDK新提供的 I/O API,因此,也叫 New I/O,这就是包名 nio的由来。这套 API由三个主要的部分组成:缓冲区 (Buffers)、通道 (Channels)和非阻塞 I/O的核心类组成。这三部分的详细内容将在本章的后面介绍。
二、 为什么要使用非阻塞 I/O
在使用同步 I/O的 网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个 线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储 器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫 痪。
当然,可以使用线程池(将在第三部分讲解)来缓解服务器的压力,但这并不能解决客户端因访问过于密集而造成的服务器拒绝响应的问题。虽然在服务端还有请求缓冲区作为保障,但这个缓冲区的大小是有限的(一般为 50),如果客户端的请求数远超过这个数,客户端还是会收到拒绝服务的信息。
在这种情况下,使用非阻塞 I/O就可以解决这个问题。由于使用非阻塞 I/O的程序一般是单线程的(有时可能将使用非阻塞 I/O的程序段放到一个单独的线程里,而主线程负责处理用户的输入),因此,服务端接收的客户端请求数并不随着工作线程数的增加而增加。所以使用非阻塞 I/O模式就不会受到操作系统对线程总数的限制,也不会占用大量的服务器资源。
非阻塞 I/O虽然可以到达在处理大量客户端请求的同时,又不占用大量的服务器资源的目的。但这种通讯方式并不能完全取代同步 I/O。如非阻塞 I/O并不适合象 FTP服务器那样需要保持连接状态的应用(原因将在以后的章节中说明)。非阻塞 I/O一般应用在服务端比较多一些,因为客户端一般并不需要处理大量的连接(但某些应用除外,如象百度、 Google Web Spider,需要同时下载多个网页,这时就需要在客户端建立大量的连接来满足需求),而服务端程序一般需要接收并处理大量的客户端请求,因此,就需要使用多线程(使用同步 I/O)或非阻塞 I/O来达到这个目的。如果某个服务端应用处理的客户端请求没那么多时,使用多线程和同步 I/O可能会更好一点,因为这种方式要比非阻塞 I/O方式更灵活。

在前面一直将非阻塞 I/O和网络应用放到一起讲。其实非阻塞 I/O并不等于网络。我们也可以将非阻塞 I/O应用到非网络的应用中,如文件复制。由于同步 I/O是基于字节流的,而非阻塞 I/O是基于缓冲区和通道的。因此,从理论上,所操作的文件越大,非阻塞 I/O的优势越能体现出来。而对于比较小的文件操作,这两种方式的效率差不多。根据实验得知,复制一个 4G左右的文件,一般情况下,非阻塞 I/O方式比同步 I/O方式快大约 15%左右

分享到:
评论

相关推荐

    java网络编程从入门到精通

    Java网络编程是开发分布式应用...通过阅读"Java网络编程从入门到精通"这本书,你将系统地学习到以上所有内容,并通过实例和练习加深理解,从而在实际项目中灵活运用这些知识,成为一名精通Java网络编程的专业开发者。

    Java网络编程从入门到精通

    5. **NIO(非阻塞I/O)**:Java NIO(New IO)是自Java 1.4引入的新API,它提供了选择器、通道和缓冲区等机制,可以提高网络编程的效率和性能。 6. **HTTP客户端库**:Java提供了HttpURLConnection来处理HTTP请求,...

    Java并发编程从入门到精通源码.rar

    这个资源包“Java并发编程从入门到精通源码.rar”显然是为了帮助开发者深入理解并掌握这一关键技能。它包含了从基础概念到高级技术的详细讲解,并提供了源码供学习者实践和探索。 在Java并发编程中,首先要了解的...

    JAVA网络编程从入门到精通

    ### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...

    Java开发实战从入门到精通视频教程下载第19章 Java网络编程.zip

    Java开发实战从入门到精通的第19章聚焦于Java网络编程,这是一个至关重要的主题,因为网络编程是现代软件开发中的基石。Java以其强大的网络功能和API,为开发者提供了构建网络应用的强大工具。本章教程将深入讲解...

    魔乐科技:从入门到精通Java全部源码

    4. **输入输出流**:IO流的基本概念,字符流和字节流,缓冲流,以及NIO(非阻塞I/O)的概念。 5. **线程编程**:线程的创建方式,同步机制(synchronized,wait(),notify(),锁),线程池的使用。 6. **反射机制*...

    java技术从入门到精通(孙鑫)学习笔记

    孙鑫老师的《Java技术从入门到精通》是一本深受广大程序员喜爱的教程,它全面覆盖了Java语言的基础到高级特性,旨在帮助读者从零基础快速掌握Java编程。 在Java的入门阶段,你需要了解其基本语法,包括数据类型(如...

    jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)

    在Java编程领域,JDK(Java Development Kit)是开发和运行Java应用程序的...总的来说,"JDK6.0从入门到精通-----chapter5网络编程 新I/O"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中获益良多。

    韩顺平java从入门到精通的教学PPT

    "韩顺平java从入门到精通的教学PPT"是一个专门为初学者和有志于深入理解Java编程的开发者设计的教育资源。韩顺平是一位知名的IT教育专家,他在Java教学方面有着丰富的经验,他的教程往往深入浅出,易于理解,深受...

    java书籍从入门到精通.rar

    - **NIO(New IO)**:Java 1.4引入的新特性,提供了非阻塞I/O操作,提高了并发性能。 4. **多线程** - **Thread类**:学习如何创建和管理线程,包括线程的同步与通信,理解synchronized关键字和wait/notify机制...

    java入门到精通PPT

    11. **IO/NIO**:从传统的 Blocking I/O 转向非阻塞的 New IO,了解NIO和AIO(异步IO)模型。 12. **JVM**:理解Java虚拟机的工作原理,包括内存管理(堆、栈、方法区等)、垃圾回收机制和性能优化技巧。 13. **设计...

    java并发编程从入门到精通

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行任务。本文将深入探讨Java并发编程的基础...阅读《Java并发编程从入门到精通》这本书,将帮助你系统性地掌握这些知识。

    JAVA开发从入门到精通

    16. **IO流与NIO**:对比传统的IO流与新推出的非阻塞I/O(New IO),理解NIO的优势。 17. **网络编程**:讲解Socket编程,实现客户端与服务器之间的通信。 18. **数据库连接**:介绍JDBC API,包括连接数据库、...

    韩顺平java从入门到精通笔记完整版

    "韩顺平java从入门到精通笔记完整版"是一份针对Java初学者精心编纂的学习资料,旨在帮助初学者系统、全面地掌握Java编程技术。 这份笔记首先会介绍Java的基础概念,包括Java的历史、特点、运行环境以及开发工具的...

    JAVA入门到精通——30天学通JAVA

    最后,你将学习Java的IO流和NIO(非阻塞I/O),这对于文件操作、网络通信等场景非常重要。此外,线程和并发编程也是Java的一大特色,理解如何创建和管理线程,以及同步和互斥机制,能帮助你构建多任务并行的应用。 ...

    后端必备+服务器网络编程指南

    2. NIO(非阻塞I/O):介绍Java的非阻塞I/O模型,如Selector和Channel,以及如何利用NIO处理大量并发连接。 3. HTTP服务器实现:如何用Java构建一个简单的HTTP服务器,处理HTTP请求和响应。 4. 连接池管理:学习如何...

    最新Java零基础入门到精通300集

    4. **IO与NIO**:Java的输入/输出系统是处理数据流的核心,而NIO(非阻塞I/O)则提供了更高效的I/O操作方式。 5. **网络编程**:Java提供了Socket编程接口,让你能够创建客户端和服务器端应用,进行网络通信。 6. ...

Global site tag (gtag.js) - Google Analytics