有关Android NIO的精髓主要用于高负载的Socket网络传输,相对于传统I/O模型的Socket传输方式的优势,我们已经在 Android开发进阶之NIO非阻塞包(一) 中讲到了,这里不再赘述,一起来看看Android NIO有关Socket操作提供的类吧:
一、ServerSocketChannel 服务器套接字通道在Android SDK中查找package名为 java.nio.channels.ServerSocketChannel
在Java的NIO中,ServerSocketChannel对应的是传统IO中的ServerSocket,通过ServerSocketChannel类的socket() 方法可以获得一个传统的ServerSocket对象,同时从ServerSocket对象的getChannel() 方法,可以获得一个ServerSocketChannel()对象,这点说明NIO的ServerSocketChannel和传统IO的ServerSocket是有关联的,实例化ServerSocketChannel 只需要直接调用ServerSocketChannel 类的静态方法open()即可。
二、 SocketChannel 套接字通道 java.nio.channels.SocketChannel
在Java的New I/O中,处理Socket类对应的东西,我们可以看做是SocketChannel,套接字通道关联了一个Socket类,这一点使用SocketChannel类的socket() 方法可以返回一个传统IO的Socket类。SocketChannel()对象在Server中一般通过Socket类的getChannel()方法获得。
三、SelectionKey 选择键 java.nio.channels.SelectionKey
在NIO中SelectionKey和Selector是最关键的地方,SelectionKey类中描述了NIO中比较重要的事件,比如OP_ACCEPT(用于服务器端)、OP_CONNECT(用于客户端)、OP_READ和OP_WRITE。
四、Selector 选择器 java.nio.channels.Selector
在NIO中注册各种事件的方法主要使用Selector来实现的,构造一个Selector对象,使用Selector类的静态方法open()来实例化。
对于Android平台上我们实现一个非阻塞的服务器,过程如下:
1. 通过Selector类的open()静态方法实例化一个Selector对象。
2. 通过ServerSocketChannel类的open()静态方法实例化一个ServerSocketChannel对象。
3. 显示的调用ServerSocketChannel对象的configureBlocking(false);方法,设置为非阻塞模式,Android123提示网友这一步十分重要。
4. 使用ServerSocketChannel对象的socket()方法返回一个ServerSocket对象,使用ServerSocket对象的bind()方法绑定一个IP地址和端口号
5. 调用ServerSocketChannel对象的register方法注册感兴趣的网络事件,很多开发者可能发现Android SDK文档中没有看到register方法,这里Android开发网给大家一个ServerSocketChannel类的继承关系
java.lang.Object
↳ java.nio.channels.spi.AbstractInterruptibleChannel
↳ java.nio.channels.SelectableChannel
↳ java.nio.channels.spi.AbstractSelectableChannel
↳ java.nio.channels.ServerSocketChannel
这里我们使用的register方法其实来自ServerSocketChannel的父类java.nio.channels.SelectableChannel,该方法原型为 final SelectionKey register(Selector selector, int operations) ,参数为我们执行第1步时的selector对象,参数二为需要注册的事件,作为服务器,我们当然是接受客户端发来的请求,所以这里使用SelectionKey.OP_ACCEPT了。
6. 通过Selector对象的select() 方法判断是否有我们感兴趣的事件发生,这里就是OP_ACCEPT事件了。我们通过一个死循环获取Selector对象执行select()方法的值,SDK中的原始描述为the number of channels that are ready for operation.,就是到底有多少个通道返回。
7. 如果 Selector对象的select()方法返回的结果数大于0,则通过selector对象的selectedKeys()方法获取一个SelectionKey类型的Set集合,我们使用Java的迭代器Iterator类来遍历这个Set集合,注意判断SelectionKey对象,
8. 为了表示我们处理了SelectionKey对象,需要先移除这个SelectionKey对象从Set集合中。这句很关键Android 123提醒网友注意这个地方。
9. 接下来判断SelectionKey对象的事件,因为我们注册的感兴趣的是SelectionKey.OP_ACCEPT事件,我们使用SelectionKey对象的isAcceptable()方法判断,如果是我们创建一个临时SocketChannel对象类似上面的方法继续处理,不过这时这个SocketChannel对象主要处理读写操作,我们注册SelectionKey.OP_READ和SelectionKey.OP_WRITE分配ByteBuffer缓冲区,进行网络数据传输。
有关具体的示例和解释上面的流畅,由于篇幅原因我们明天Android开发网给出源代码,做详细的分析。
相关推荐
### Android开发进阶之NIO非阻塞包 #### NIO非阻塞通讯方式解析 在探讨Android DDMS源码中的NIO(Non-blocking I/O)非阻塞通讯方式时,我们首先需要理解NIO的基本概念及其在Android开发中的应用。 **NIO简介**:...
### Android开发进阶之NIO非阻塞包 #### 关键知识点概述 1. **NIO(New I/O)的概念**:NIO是Java 1.4版本开始引入的新I/O处理模型,它通过非阻塞的方式提高了I/O操作的性能。在Android开发中,利用NIO可以显著...
总的来说,Android开发中的NIO技术提供了高性能、非阻塞的网络通信解决方案,有效地解决了多线程管理和资源消耗的问题。它不仅简化了并发编程,也提升了Android应用程序在网络通信方面的效率。对于Android开发者来说...
8. **Java NIO**:非阻塞I/O操作在Java中的实现与应用。 9. **Java Web基础**:涵盖前端脚本语言、框架等基础知识。 10. **JavaScript DOM视频**:了解网页元素的操作与控制。 11. **jQuery视频**:简化HTML文档遍历...
Java的IO系统分为传统IO和NIO(非阻塞IO)。RandomAccessFile允许随机访问文件,而NIO引入了通道和缓冲区,提高了数据传输效率。异常处理是程序健壮性的关键,Java的异常分为检查异常和运行时异常,理解异常的层次...
I/O流处理和NIO(非阻塞I/O)对于读写文件和网络通信至关重要。线程与并发编程是Java的强项,涉及线程同步、死锁避免、并发工具类(如Semaphore、CountDownLatch)等内容。 再者,Java EE(企业版)是Java在服务器...
5. **IO/NIO**:Java的I/O系统升级到NIO(非阻塞I/O),Channel、Buffer和Selector的使用。 6. **网络编程**:Socket编程,实现客户端和服务端的通信。 7. **枚举与注解**:枚举类型的使用,注解的定义和应用,以及...
对于IO流,理解输入输出处理,文件操作,以及NIO(非阻塞I/O)的概念也是必要的。 进一步,深入研究Java的反射机制,它允许我们在运行时动态地获取类的信息并调用其方法。还要学习Java的泛型,它提供了类型安全的...
- **网络I/O**:阻塞I/O、非阻塞I/O、NIO(New I/O)等。 - **JVM内存管理**: - **堆和栈**:理解它们的区别及其在程序中的作用。 - **垃圾回收**:GC算法、堆内存分区(如Young区、Old区)等。 - **性能调优*...
3. NIO(New Input/Output):提供非阻塞I/O,适用于高性能网络通信,如SocketChannel、Selector和Buffer。 六、网络编程 1. Socket编程:通过ServerSocket和Socket实现客户端-服务器通信,理解TCP和UDP协议的区别...
- **IO流与NIO**:文件操作,网络通信,以及非阻塞I/O模型。 - **多线程**:线程同步、死锁避免以及并发工具类的使用。 - **集合框架**:ArrayList、LinkedList、HashMap等数据结构的使用和实现原理。 - **反射...
学习者还需要熟悉集合框架,如ArrayList、LinkedList、HashMap等,以及IO流和NIO(非阻塞I/O)系统,这些用于数据的输入输出和文件操作。 在高级主题中,线程和并发处理是Java的一大亮点,理解如何创建和管理线程,...
3. **I/O流**:`java.io`包提供了丰富的流处理类,通过源码我们可以学习如何进行数据的读写,了解缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的实现。 4. **集合框架**:Java集合框架是数据结构和算法的...
7. **IO与NIO**:包括旧的I/O模型和新的非阻塞I/O模型,有助于优化读写操作。 8. **Java Swing和JavaFX**:介绍图形用户界面的构建,用于开发桌面应用。 9. **JDBC**:讲解如何连接数据库,执行SQL语句,处理结果...
* Java 高级知识:Annotation、IO 和 NIO、AIO、多线程、线程池、阻塞、非阻塞、异步网络通信、反射、动态代理 二、JDBC 编程 * SQL 基础:基础 SQL 语句、基本查询、多表查询、子查询、结果集的交、并、差运算 * ...
- **NIO.2**:增加了文件系统操作的API,增强了非阻塞I/O能力。 - **Scripting API**:允许在Java应用程序中嵌入和使用脚本语言,如JavaScript。 - **Java Database Connectivity (JDBC) 4.0**:改进了数据库连接...
进阶课程包括JUC并发编程、NIO非阻塞I/O等,帮助开发者提升性能优化能力。 JavaWeb阶段,尚硅谷提供JavaScript DOM编程、jQuery、Ajax等前端技术教程,以及JavaWeb核心技术和企业级项目实战,如Servlet、JSP、MVC...
5. **IO流与NIO**:第六章可能涵盖输入输出流(IO)和非阻塞I/O(NIO)的概念,学习者将学会如何读写文件,网络通信,以及高效处理数据流。 6. **多线程编程**:第七章将讲解并发编程,包括线程的创建、同步机制...