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

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

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

作者:Android开发网


   今天我们通过一个实例详细讲解下Android下NIO非阻塞服务器的开发,对于客户端而言Android123不推荐使用NIO,毕竟NIO相对于传统IO较为复杂,最重要的NIO是为了解决多线程并发问题而解决的技术,可能会因为管理和复杂性降低最终的结果,毕竟NIO是Java的,相关的类型比较难控制,对于客户端而言我们可以使用C++、Java、C#甚至Flash Action Script来编写。

    下面我们以一个简单的Echo Server为例子来分析

 import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;

public class Server {

 public static void main(String[] args) {
  Selector selector = null;
  ServerSocketChannel ssc = null;
  try {
      selector = Selector.open(); //实例化selector
      ssc = ServerSocketChannel.open(); //实例化ServerSocketChannel 对象

      ssc.socket().bind(new InetSocketAddress(1987)); //绑定端口为1987

      ssc.configureBlocking(false); //设置为非阻塞模式
      ssc.register(selector, SelectionKey.OP_ACCEPT); //注册关心的事件,对于Server来说主要是accpet了

 
   while (true) {
   int n= selector.select(); //获取感兴趣的selector数量
   if(n<1)
          continue; //如果没有则一直轮训检查
    Iterator<SelectionKey> it = selector.selectedKeys().iterator(); //有新的链接,我们返回一个SelectionKey集合
    while (it.hasNext()) {
     SelectionKey key = it.next(); //使用迭代器遍历
     it.remove(); //删除迭代器

     if (key.isAcceptable()) { //如果是我们注册的OP_ACCEPT事件
      ServerSocketChannel ssc2 = (ServerSocketChannel) key.channel();
      SocketChannel channel = ssc2.accept();
      channel.configureBlocking(false); //同样是非阻塞
      channel.register(selector, SelectionKey.OP_READ); //本次注册的是read事件,即receive接受

      System.out.println("CWJ Client :" + channel.socket().getInetAddress().getHostName() + ":"  + channel.socket().getPort());
     }

    else if (key.isReadable()) { //如果为读事件

      SocketChannel channel = (SocketChannel) key.channel();

      ByteBuffer buffer = ByteBuffer.allocate(1024); //1KB的缓冲区
      channel.read(buffer); //读取到缓冲区
      buffer.flip(); //准备写入
      System.out.println("android123 receive info:" + buffer.toString());

      channel.write(CharBuffer.wrap("it works".getBytes())); //返回给客户端
     }
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    selector.close();
    server.close();
   } catch (IOException e) {
   }
  }
 }
}

 上面是比较简单的框架,里面存在很多问题,Android123将在下次详细阐述下,上面或者说国内有关NIO资料中的通病,如果你看过Mina或GlassFish的源码,你可能就知道上面的问题大于10种,有关框架的bug占了大多数,作为服务器而言很容易CPU超过100%

理性对待“云”——冲向“云”之前你需考虑的事 为Ruby On Rails开发者准备的5款IDE 一位开发人员的生日愿望清单 当“硅”已走到尽头,我们又该用什么去维系摩尔定律? 高端大气上档次 8位iOS顶级女程序媛 谁都可以做开发者:微软推出Windows Phone Web工具 Mozilla正式发布Firefox 23 新增混合内容拦截 网络监控功能 14条建议,使你的IT职业生涯更上一层楼 依托微信的电商产品实践——SDCC 2013讲师潘凡专访 IBM将向Google、英伟达等授权Power架构技术 人脑研究将推动下一代网络革命?从大爆炸到大收缩 H3C携手F5将“空转”数据中心变为“分布式数据中心” W3C小组发布Web存储API推荐标准 开发者必备的6款源码搜索引擎 闪亮登场:开发者制作图形图表所需的11款JS工具包 来自两位技术大牛的博弈:HBase或将制霸NoSQL? 应用改变世界 2013英特尔&#174;创新应用大赛火热开启 看13位CEO、创始人和高管如何提高工作效率 对首次购买智能手机用户而言,苹果吸引力并不大 Amazon Appstore面向Web应用开放 开发者可添加应用内付费功能 CSC收购成功转型的大数据初创公司InfoChimps 嘀嘀打车发展报告:成全球最大出租车调度平台 又摊上事儿了,Android的MasterKey再次出现bug 比特币挖矿必备工具 硬件性能大比拼 RDBMS vs. NoSQL:反派为什么会得以存活并发展壮大 帮助优化移动网站:谷歌发布新指南和PageSpeed Insights工具 增强Web可用性,你需要避免的七大设计错误 Python六大开源框架对比:Web2py略胜一筹 海外看中国:老外开发者间流传着的7件事儿 京东云峰:电商移动云平台背后的技术 初创公司DigitalOcean:55秒搭建一个云服务器 散分啦,快来抢分!谁能提供计算机中英文论文一篇,来者都必有分! 两个combobox关联显示(在线等) 关于我的yamaha 声卡在2003 不能用的问题 我用WIN98浏览器下载的文件都有错误。 Tomcat中的发行目录怎么设置! 初学者的问题. 关于最终用户许可协议 JPG图片怎么能实现部分透明? 如何用VB.net编写控件 关于ASP中对文本文件的skip(n)操作到底怎么做 关于SQL的菜鸟问题 大家现在用什么软件管理源代码啊。60分相送。 今年是考C 还是C++啊? 怎样判断一个线程已结束 我用new新建了若干个基类是cwnd的窗体cmywnd,然后想在每个窗体内定时让它们自己消失,我应该用什么函数?是destroywindow吗?最后还用不 vs.net 2003 中文版 的帮助MSDN是不是有问题? 清问这个SQL有什么错,还是FB1。0不支持? 是我的usb口的问题吗?? 怪事 急 路径绝对正确,为什么服务器只能下载rar 不能下载EXE 文件 已知,f(x)=arctanx,其二导f''(x)=(-2x)/(1+x*x)^2,f''(0)=0,试: 一个有趣的问题,请大家看一个小程序,来者有分。 这个写者优先是不是有问题????麻烦看一下,小弟实在看不出错在哪里 请问有没有办法得到[系统托盘]上其它程序的所显示的Icon?? 已知,十六进制(34.6)16=(28.75)10(十进制) 高手推荐几个Palm开发的网站?最好有源代码! 请教一个问题 触发器(加密)内容可以查看吗 怪,文件路径绝对正确,EXE文件不能下载,其它格式正常。 在编写的用户控件中公开所引用控件的事件怎么实现啊 这是我的usb口的问题吗? 考程序员前想先考全国三级,请问三级种哪个科目考C编程?何时报名? 调用DLL时候出现Bad Dll calling convention错误,为什么?代码如下 如何建立一个小数据库? 我想问下,网络技术到底是指什么??? 为什么会出现这个问题呢??急救??? 在不同操作系统出现不能正常运行的问题,和默认字体语系乱码问题 C# 静态类成员 新手请求各位前辈帮助 如何查询我连接到哪个数据库? 哭着请求帮助。。。。。页面显示问题!!在线等着 网络技术到底是指什么???? 我想在<<三国九>>里输入正确的中文,有法子么? 能帮我改改么? 紧急求助,请高手支招 请问在JTABLE中如何将某几行设置成可以被选择的,其他几行设置成不能被选中的? 请问怎样修改SDI框架的标题及去掉最大化按钮??? 在自定义的用户控件上公开引用windows控件的事件怎么做啊!!谢谢 2003中为什么IDE设备只能用PIO模式? 在FAQ里见到这样一句,不明白什么意思 怎么我用vc 的 odbc 做数据库时,工程名为try ,在工程工作区的“class view”面板里没有tryview类的? 不能使用xmldocfile() 如图,小圆的半径为2厘米,求阴影部分的面积. 在希腊古典神话中,为人类盗得火种而遭受天神惩罚的英雄是谁? 谁做过CIK细胞治疗,请谈谈效果 你对"效率优先,促进公平"有什么评价? 对于青蛙吃蚊子这个行为属于什么行为?这种行为的三个特点1.是一个——.——的动态过程.2.是——的结果,对动物的——和——有着重要的作用.3.这种行为的产生是动物体内——因素——系 把小动物的尸体埋进花园或菜地的土里,过一段时间不见了.请分析原故是什么?\ 一个匀速转动的圆桶内壁上有一个物体随着一起转动并未滑动,为什么f=μF? 白玉蜗牛为什么老是在壳里不出来.温度也不低在20度以上 两对基因独立遗传,TtRr与ttRr杂交后代的基因型和表现型的种类分为几种? 唐·吉诃德与现代概括一下唐吉可德,用现代的观点怎么看,和现代有什么关联 张华和李明在一圆形跑道上练习跑步.同时由一点出发,反向而行.……补充:相遇时,张华跑了250米,李明跑了150米.两人保持原有速度继续前进,当张华到达起点时,李明再跑多少米才能到达起点? 无脊椎动物的尸体埋在土中会消失的原因? 圆锥筒 角速度如图,若A和B的质量是相等的.它们的角速度大小是否相同呢?我做过类似的题,貌似它们的角速度是不同的,可是我不太明白啊,这跟地球自转不是差不多吗.虽然线速度不同,但是角 a的平方-b的平方有什么意义? TTRr和Ttrr与TTrr和TtRr产生的后代有什么不同基因型和表现型 唐吉柯德读后感 要 3000字左右急 急 DC-CIK 细胞免疫疗法是真的吗 例2.已知高秆感病(Ttrr)与高秆抗病(TtRr)的个体杂交,两对基因独立遗传时,所生后代的基因型及表现型种类分别为A.4,4 B.6,4 C.4,6 D.9,4 唐吉柯德读后感200急! 2平方的意义 F1基因型比为TTRR:TtRR:TTRr:TtRr=1:2:2:4,与ttrr杂交,F2基因型比例为 一个圆柱形水桶的容积是251.2升,底面半径是4分米,做这个桶要多少平方分米? 求 一篇小学五年级「唐吉柯德」的读后感150字求 一篇「唐吉柯德」的读后感150字~200字 数学取不取等号问题.A=x|a-1 一个正方体内与十二条棱都相切的球体 如何画图 (我已经试过直方图和三维立体坐标了 感觉都不太好 ) 难道画三视图吗! 可以的话 上图吧 观察日记 青蛙的生活习性 数学真子集取不取等号?M={X|-1≤X≤7}、S={X|k+1≤X≤2k-1},S是M的真子集,求K范围.那个就是解答过程是 当S不等于空集时:1.2K-1≥K+12.K+1>-13.2k-1≤7以上三个合并在一起求范围 可是为什么2K-1 唐吉柯德的简介注意:是他本人的简介! 为什么园锥上各点的角速度不相等 A=x|-2 介绍"唐吉柯德" 既然光无法从黑洞中射出,那人类是如何发现黑洞的?狄紫依 我等你哦 多余的涟漪啥意思? 头灯的氙气灯泡,是G4 6V 8W 的氙气灯泡,3V的电源(2节5号电池)能点亮吗?还有是 6V 15W的,如果同样用3V的电源..用15W的是不是亮点. 请问一平米的铜导线能够承受多大的电流》?能够流过多到的电流? 导数求单调性什么时候取等号什么时候不取 LED,3V电池灯,怎么加电阻,使绿光点亮时间更久输出总电压为两节1.5V的5号电池.3V电压.电池灯串,一条灯串15颗LED.红色,黄色一线各4颗,共8颗 (红色,黄色单颗为电压2V) 绿光,一线7颗 (绿光单颗电压 盖斯定律反应热计算.已知下列反应的反应热:①CH3COOH(l)+2O2(g)=2CO2(g)+2H2O(l)快~已知下列反应的反应热:①CH3COOH(l)+2O2(g)=2CO2(g)+2H2O(l)△H=-870.3kj/mol②C(s)+O2(g)=CO2(g) △H=-393.5kj/mol③2C 什么叫多余 matlab如何用plot3画一个平面和球体的交线啊?如题,网上搜了好多,都是用极坐标的方法,表示方程有些难,转参数方程不太可能.新手没用过请高手指点.原方程比较烦我就不写了,举个例子吧:平面 在同一个圆锥面上是不是角速度一定相同? 尸体埋在很稀的烂泥里和埋在潮湿的土里 哪种腐烂的更快我的小狗已经埋了1个月了刚埋几天就下雨一直在很稀的烂泥里 我想问下她现在是不是都腐烂变臭了 已知小圆直径为4厘米,求下图阴影部分的面积 利用观察法观察,最容易被青蛙捕食的是处于下列哪种状态的动物?A.低空飞行的蚊子 B.静止不动的蝴蝶C.飘浮在水面的死昆虫 D.装死的甲虫 图像序列中的俩幅相邻图像,后一幅图像与前一幅图像之间存在较大相关性,这是什么冗余?A 空间冗余B 时间冗余C 信息熵冗余D 视觉冗余 北纬45度,在平面的球体上要怎么画呢? 在希蜡传说中,帮人类偷取火种的天神是谁? 请问一点五平方、二点五平方、四平方、六平方、十平方国标单股电线最大载流量是多少安? 在△abc中,ab=ac,bd是△abc中线,已知△abd和△bdc的周长之差为6,△abc的周长是30,三边长是多少 在传说中为人类盗火种而受天神惩罚的英雄______ 一块正方形木版有4个角,每次锯掉一个角,锯一次后还有几个角?锯2.3次后呢/ n次后还有几个角? 在△ABC中,AB=AC,BD是△ABC中线,已知△ABD和△BDC的周长之差为6,△ABC的周长是30,求这个等腰三角形的三边长 如果一个人可以用肉眼看见不可见光,那么在一个黑屋子里,外面是亮的,不可见光可以穿透进来,可见光不能穿透进来,那个黑屋子对于那个人来说是亮的吗? 为什么尸体在土中比空气中腐烂得慢? 一个长方形怎么样剪一刀变成2个钝角三角形 牛顿运动定律与爱因斯坦爱因斯坦是不是证明了牛顿运动定律是错的? 质量m为2千克的物体静止在水平地面强 用F为18牛的推力推物体 在t是两秒内物体位移s是10米 此时撤力F求...质量m为2千克的物体静止在水平地面强 用F为18牛的推力推物体 在t是两秒内物体位移s 求阴影部分的面积,大圆的半径是5厘米,小圆的半径是2厘米 "万事具备,只欠东风"本为一书中的故事,后来演变成一个成语,比喻_________.写出书中另一些故事的名称(写两个) 从经济生活角度分析如何改变当前房价居高不下的状况谢谢了, 马凯在法国《回声报》发表署名文章土库曼斯坦总统出新书讲述父亲的故事也门男子因15岁女儿与未婚夫通电话将嘉兴南湖:消企携手共筑安全“防火墙”杭州消防马路中间铺气垫解救跳“桥”男洗洁精添加剂泄漏扰民 嘉兴经开消防成化工厂生产车间起火 杭州富阳消防成功消控室无人值班 浙江海盐假日酒店被罚数万人白宫网站请愿 要求禁播“杀光中浙江开通党员教育云平台助推群众路线教浙江打造中小学校“透明食堂” 信息需浙江临安警方破获特大武装贩毒案 缴获中国再发渤海北部禁航令 23天内有重解放军神秘基地藏大漠深处 配多型先进维也纳出新措治理粉尘污染美国长岛一小学生在校内玩胡椒喷雾致多美拒评是否曾监听默克尔手机 新自贸协新加坡一卡车为避前方车祸急刹车侧翻压美国疑监听默克尔电话 德国外长召见美日本6名女性涉嫌在网络上上传猥亵视频英媒:中国持续30年“英语热”降温周五申购河南日报报业集团发倡议:招行理财能力再获赞誉黄牛党使用黑客软件抢票 需45分钟内天气预报“开房庭长”被免职大河股票池(1月9日 星期四)温暖特困职工心中国奢侈品市场“2013年度保险产品”专家荐号172名在押嫌犯迁“新居”“大河风尚美丽联盟”继续招募理事单位小学生组成志愿者社团征文启事智能电视成了隐私泄露器?被难为哭了狂舞带掉渣,谁见谁怕2014年01月10日你家热水器安全吗7大技巧让你不再遭遇“钱荒”
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘