有关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缓冲区,进行网络数据传输。

更多相关文章

  1. Zxing 竖屏切换 android
  2. 编译移植android 2.3到tiny210
  3. Android性能优化之 Android(安卓)Lint
  4. 浅谈Java中Collections.sort对List排序的两种方法
  5. 箭头函数的基础使用
  6. 类和 Json对象
  7. NPM 和webpack 的基础使用
  8. Python list sort方法的具体使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. 关于Android软键盘弹出的问题
  2. 判断Android系统时间是否是24小时制
  3. Android 个人记账程序源码
  4. Android给View画边框
  5. Android下获取手机屏幕大小
  6. Android获取本机Mac地址和IP地址
  7. Android之快捷方式一——通过应用程序创
  8. android 在线预览pdf文件(目前最全)
  9. 布局的学习
  10. Android CTS 4.03测试总结