说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发进阶之NIO非阻塞包(三)

HTML文档下载 WORD文档下载 PDF文档下载
Android开发进阶之NIO非阻塞包(三)

作者:Android开发网


   有关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开发网给出源代码,做详细的分析。

按下某组键(HotKey)便执行某程式-VB资料 把所有的字体名称放到 ComboBox -VB资料 把文件置入到Text或RichText中-VB资料 捕捉 MouseExit 事件 -VB资料 操作过程动态显示 -VB资料 查找月份的最后一天-VB资料 程序启动时,如何自动判断 MDB文件是否损坏并自动修复?-VB资料 读取和修改Windows注册表 -VB资料 对VB的IDE环境的扩展 防止文本控件中的部分滚动-VB资料 关闭正在运行的程序 -VB资料 关机消息的拦截 -VB资料 VB获得、设置鼠标双击间隔时间 VB获取当前系统平台 记载Windows使用的时间-VB资料 加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 交换鼠标左右键 -VB资料 禁止使用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 控制光驱门的开关 -VB资料 VB利用 窗口函数监视系统的运行情况(VB类) VB判断是否在VB5环境下运行 VB判断一个32位程序是否结束 VB判断一个程序启动完成(不是结束) 屏蔽TextBox的系统菜单 -VB资料 启动时禁止装入 Add-Ins -VB资料 让Timer控件每5分钟触发一次事件 -VB资料 让程序启动快一点 -VB资料 VB如何调用系統的【查找】、【替换】的对话框? VB如何动态新增、移除 ODBC DSN? 为什么有这么一个问题.... 有人愿意收一个一般菜,但又不是很菜的人为徒吗?? 求救VC中的关于串口通信的问题,想请请看,急急急急急急急急急急急 ZDataGrid For VB & VB.Net 如何将界面做成如xp的样子 请教关于游戏平台的问题。。。 今天不是鬼节啊?怎么这么多早就作古的人都出来了? 超级菜的问题(关于WINNT安装)想要分的快进 怎么写dll文件 怎样插入当前时间和日期到Access数据库中 下面为什么出错了? 有人愿意收一个一般菜,但又不是很菜的人为徒吗??? TADOTable如何实现记录定位?——求救! 谁知道怎么让WEBLOGIC中消息驱动BEAN的例子MESSAGE跑起来?.. 請問各位為何javabean在suse linux的調用問題 请问如何在weblogic中设置一个jms topic?. 请教关于游戏平台的问题!! 使用QuickVxD不能生成 .h ,.cpp .mak文件,那里不对? 请问:框架(Frame)为什么不能动态生成两次 ????????????? 在win2k下有人知道ActiveReports报表怎么自定义打印纸张大小 大家讨论一下运算符重载的问题!!!! 位操作问题?欢迎各位朋友讨论! data控件能连接sqlserver数据源么? 有没有办法使重复的值只显示一个,空值不显示也不要占位置?(急呀!!!) 用TURBO C2.0能不能写32位的软件? 如何设置WN98中的硬盘驱动器盘符 SOS pekie 请教啦! 投影仪投出的图像中间部分呈粉红色,是不是投影仪坏了? 在MYSQL中我想修改root密码,可是总报错说user表是read only,如何把只读的属性去掉? 关于开发网络麻将游戏需求的问题。。谢谢。 关于jsp或applet调用本地DLL的问题 在BCB中如何添加自己的类? 关于APPLET从服务器下载图片的问题! 建议下一次改版的时候考虑一下这个问题:CSDN 的很多页面好像用NetScape不能浏览? 我不用IE很多年了, 因为太容易死机 有没有做股票的朋友? 急!!!50分求购一个在程序中实现按下按钮功能的小程序,多谢了 在图象上的汉字显示问题 请问谁知道把AVI文件转换成BMP位图数据的算法 圣诞快乐 用什么工具可以从exe文件中把资源文件,如图像、图标提取出来? Word与Delphi的结合!高手请进! 贴子为什么掉到第二页上再UP就回不到第一页去了?见龟!——千山一刀 ^^^^^^^^^如何配置sybase的clinet端????^^^^^^^^^^^^^^^^^^^^ 进程与线程 在win2000系统下,构建asp+sql的web站点,但在web页中无法显示出小数点前的零? 如何配置sybase的clinet端? 关于webbrowser。 TO:riolee(随风) 关于directshow的 开始菜单中的运行找不到 请问各位谁能提供 CString 里有一个operator LPCTSTR,难道这个LPCTSTR也可以被重载,它不是操作符啊,也不在可被重载的范围中啊? 2012年第一季度有几天? 求使(a²+ab)/(b-ab)除以(ab/2)*(b²-ab)/(a²-ab)具有正整数值的所有a的整数值 已知a(a-1)=a²-b-2求1/2(a²+b²)-ab 2012年第一季度多少天? a²+b²-2a-6b+10=0,则a²- b²除以ab=— 甲、乙、丙、丁四人向灾区捐款,甲的捐款数是其他三人捐款总数的三分之一,乙的捐款数是其他三人捐款总数的五分之一,丙的捐款数是其他三人捐款总数的六分之一,丁捐款148元.甲捐款多少 2012年的第一季度是多少天 已知∠1和2∠互补,∠3和∠4互余,求证;∠3=二分之一(∠1-∠2) 小明步行45分钟可长A地到B地,小华乘车15分钟可从B地到A地.当他们相遇时,小明已经走了30分钟,小华接小明乘车返回B地,还需要多少分钟?甲、乙两人同时从A地到B地,甲一半时间跑步,一半时间走 3046年的地球是什么样子的? 0.5+4/5*0.5+1/2等于多少, 已知角a和角b互为补角,角3与角2互余 ,请说明角3=1/2(角1--角2)已知角1和角2互为补角,角3与角2互余 请说明角3=1/2(角1--角2) 地球原来是什么样子原来是什么样子?现在又是什么样子?将来会怎样? 0.5年等于多久 0.1年等于多久 已知角1和角2互补,角2和角3互余,用角1、角2来表示角3 地球是什么样子的 (a+b分之2ab²)³除以(a²-b²分之ab³)乘以{2(a-b)分之1}² 先化简在求值(a+b/2ab²)²除以(a²-b²/ab²)²除以[1/2(a-b)]²其中a=-1/2,b=2/3(要过程啊)2(a-b)是连到一起的不要看错了赶紧啊急急急急急精英们都到那里了啊(求标准答案100分啊 以后地球是什么样子的? (-1\2 ab)³(2ab³)² 23×(-5)-(-3)÷128分之3 一个3位数,左边第一位是7,当把7移动到个位时,所得的新的三位数比原三位数小126.原三位数是多少?用方程解法 a=2-√2,b=2+√2,求(a³b+a²b²/a²+2ab+b²)÷(a²-ab/a²-b²) 化简a²-b²/a²﹢ab 126^10的千位数,百位数,十位数和个位数的和怎麼快速运算啊时间限制10秒之内.能解释最好. 2008年第29届奥运会在北京举行,这一年的第一季度有几天? 化简:(√a²+a√b)/(ab-b²)-(a+√ab+b)/(a√a-b√b) 已知a=-3,B=2,求代数式(1/a+1/b)除以a²+2ab+b²/a+b的值 2008年第29届奥运会在北京举行,这一年的第一季度有( )天. (a²-b²)/(ab)-(ab-b²)/(ab-a²)可化简为已知x²+5xy+y²=0,则(y)/(x)+(x)/(y)的值为 先化解代数式(a²-b²分之a²+b²-a+b分之a-b)÷(a-b)(a+b)²分之2ab然后请你去一组a,b的值代入求值.思考:所取a,b的值要满足什么条件? (a²b)²除以(2ab)²×(3a)²=?(a²b)的平方除以(2ab)²×(3a)²=? 化简ab分之a²-b²-ab-a²分之ab-b²= 温哥华是什么国2011年第一季度有几天 如果a²=3a,那么a=3,这句话对么? 怎么作一个角是已知角的二分之一? 2011年第一周是哪几天? a²-3a-1=3 求a求详细过程 (ab分之a²+b²)+【2-(ab分之a²-b²)】 2011年的第一季度有多少天,这一年共有多少天 386000加上百分17的税是多少 若b分之a=2,则(a²+b²)分之(a²-ab+b²)的值为若a分之1-b分之1=a+b分之1,则a分之b-b分之a-3的值是 还有2011年的第一季度的收益 已知a+b=2,则(2分之1)a²+(2分之1)b²+ab的值是—————— ab分之(a-b)²-ab分之a²-b² 先化简在求值(a-b分之a - a²-2ab+b²分之a²)除以(a+b分之a - a²-b²分之下面还有先化简,在求值(a-b分之a - a²-2ab+b²分之a²)除以(a+b分之a - a²-b²分之a²)+1求a=3分 已知a+b=-2,ab=-2分之5,求a(a+b)(a-b)-a(a+b)²的值原式=a(a²-b²﹚-a﹙a+b﹚²=a﹙a²-b²﹚-a﹙a²+2ab+b²﹚=a[﹙a²-b²﹚-﹙a²+2ab+b²﹚]=a﹙-2b²-2ab﹚=-2ab² ab-b²分之a+b÷[-(a-b)²分之ab+b²] 0+(-3.71)+(+1.71)+(-5) 已知a-b=-10,求a²+b²的和除以2,再减ab的值 如果b分之a=2求a²+b²分之a²-ab+b²的值 数学达人来回答啊(a+b分之2ab²)³除以(a²-b²分之ab³)乘以{2(a-b)分之1}² 平年一年有( ) 天,闰年一年有( ) 天.1900年2月的下旬有( ) 天. 18/49、41/111、47/129、51/139 四个分数比大小.过程在哪里.顺便:1110/2221和3332/6665 2012年的第一季度有几天 已知:如图角1等於角2 求证:角3等於二分之一(角acb减角b) 比较分数17/49,41/111,47/129,139/51. 2012年第一季度有几天,全年有几天? 已知角一小于角二,那么角二与二分之一(角一减角二)之间的关系是? 18/49,41/111,47/1291/139
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn