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

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%

对话函数式编程语言Roy之父Brian Mckenna GitLab获400万美元A轮融资,GitLab 8.0将很快到来 【CTO讲堂】如何构建高可用和可伸缩的架构? 未来程序员会被机器取代吗? React Native实战(一):配置和起步 集聚MDCC 2015 免费展位第二波正式放出 【深入浅出Koa】入门知识,带你以现代化开发方式构建Web应用 升级到Node V4的七个理由 支持大量ES6特性 像写SQL一样编写Java数据应用 Swift 2.0实战:如何实现从非零下标遍历数组? 手把手教学:在iOS 8中使用Cocoapods 交互技术前沿与应用实战:MDCC虚拟现实专场议程揭晓 解密“攻城狮使用手册” 技术专家齐聚!MDCC 2015精彩日程全曝光 基于ActiveMQ的消息中间件系统 OneMM逻辑与物理架构设计详解 John Carmack大神亲操刀,为Oculus开发Netflix应用 React Native实战(二):Android的打包 独立游戏的成功秘诀:好设计才是王道 Swift 2.1的新变化 Apple TV实战:用TVML开发第一款tvOS应用 【SDCC讲师专访】阿里王晶昱:云时代的分布式数据库DRDS 硬件研发、嵌入式技术演进:MDCC IoT峰会日程揭晓 专访百度知道iOS团队负责人孙源:代码强迫症的死实践派 TIOBE 2015年10月编程语言排行榜:Ruby取代Objective-C进前十 【SDCC讲师专访】PingCAP联合创始人兼CEO刘奇:好的产品应开源,不闭门造车 【深入浅出Koa】常用工具分享 帮你降低编程难度 Relay: 全新的React数据获取框架 探索游戏开发面临的技术挑战——MDCC 2015游戏开发专场议程曝光 【SDCC讲师专访】易开发创始人潘俊勇:这些年我遇到的那些坑 【CTO讲堂】OpenStack行业实践和发展趋势探讨 万物互联,移动为先:MDCC 2015移动开发者大会盛大开幕! 用过,销售,触摸屏的兄弟姐妹给个建议 关于C里面的setjmp()和longjmp()函数的使用。 一个用VB偏的“图片批量转换软件”!带源代码!!! 多伦多穷人欢庆申奥失败 有人注意到了吗???directX的资源释放不干净! 谁能帮我做一个小型帐务管理(用C)??? 用delphi编程,用什么触摸屏比较好啊? 怎样在程序运行时增加子菜单(要增加的数目是未知的) 关于Sprite动画 出售代码 ACCESS的FORMS DLL调用函数问题 VB在ACCESS中应用的一个小问题! ACCESS中的FORMS问题? 再普通不过的一个问题 delphi6中还有BDE和ADO吗?它们被淘汰了吗?现在还有必要用它们来学数据库的开发吗? 50分答谢!!!---这个css定义为什么会出现这样的效果??? 各位:怎么判断表里某个字段是否存在? 纯技术问题:精通“书签“与“层“的大虾请进!!!! 一个奇怪的现象,请教高手这是怎么回事? 哪里有破解清华五行卫士密码的软件? vc++7.0好用吗? 吃完晚饭了... 可不可以让 CppWebBrowser1的背景不是白色? 热热热!!!热疯了!!! 我的喇叭哪儿去了? 我的PB程序出了问题了!!! sql server中哪个函数是用于字符串与整型之间转换的? 我想限定文本输入框只能输入10个汉字或20个英文字符,但文件输入框却只能输入10个英文字符,如何解决? 当我将这样的字符串“dsdsdsdfsdffsdsdfsdfsfdsdfsdfsfsfdsdffs.....”放入我的表格中时,无论怎样设置也不折行,影响了部局,如何解决? MFC中视图(view)是怎样随着主窗口的大小改变而改变的。 急!请教!!猫猫连接,用数据管道同时访问两库,访问不到对方的网络库(sybase) 关于电影下载 我已经把一个exe文件加入到我自己的程序中了,请问在我的程序中应该样调用该exe文件呢? 哪位高手知道RTF格式的含义?或者更好,知道Rxlib中的RXRICHEDIT控件中识别RTF格式的方法? Delphi编写的DLL在VC下不能使用 请问哪儿有电工的<>的电子版下载?我只有这么多了 msdn2001年4月版的讨论 请问哪儿有电工的<>的电子版下载? 请教高手!!!! 请进 各位:周末愉快!为何我的多表查询用updatebatch提交时总是报错? 我不明白!!!! 请问,BAS 与 VBJ 有什么区别吗?为何他们安装在同一个目录呢? 如何得到系统进程的列表? vi下如何撤销操作? 我们知道MFC中的对象序列化做得很好,不知在DELPHI中怎样来实现对象的序列化? 我已经学过C++,想学VC++请问哪本书入门比较好啊? 欢迎使用技巧酷skillstore beta 1.00 有个可以显示IP的QQ,很不可思议,讨论一下好吗? 怎样在程序运行的时候加上参数,比如说双击文本文件打开记事本 谁有运行后烧硬件的程序 求初二物理试题 关于声音的特性吉他是众多人喜爱的一种乐器.吉他用久了,发生走调,必须请专业的乐师调试.乐师主要是调节琴弦的_________.吉他一般有六根琴弦,这六根琴弦的_________、_________大致一样,琴弦的 初二科学大气压的题高压锅盖上有一个空心柱为排气孔,空心柱上戴着一个帽子为限压阀,当高压锅内气体压强超过安全值时,锅内气体就会冲出限压阀,气体跑出一部分,使锅内气体压强减小.现 初二物理练习题我刚升初二请问有没有好题目分享给我些呢(用多 初二物理声音的特性2学案上的 初二的科学关于大气压如图所示,盛水容器中浮着一装有水的小杯A,倒扣一小杯B,给容器加热并使容器中水沸腾,再继续加热时,A、B杯中的水能否沸腾,为什么? 将一边长是10CM的实心立方体木块轻轻放入盛满水的大烧杯中,待木块静止时.从杯中益出600g的水.求:(1)木块受到的浮力(2)木块的密度. 初二物理题,声音的特性.将齿轮固定在玩具电动机的转轴上,启动电动机,使齿轮敲打塑料片,注意这时塑料片发出声音的高低.使玩具电动机的转速逐渐增大,塑料片发出的声音有什么变化?速度 体积为1×10的-3次方立方米的酒精,质量为多少kg.将它倒入一个质量为0.2kg、底面积为1×10的-2次方平方米的平底容器中,放在水平桌面上,容器对桌面的压强为多少Pa?〔酒精的密度为0.8×10的3次 初二科学题(关于水的浮力的) (7 15:53:16)武汉号满载时重7.5*10^7N,求满载时军舰排开海水的体积. (  ρ海水=1.03*10^3kg/m^3  g=10N/kg      结果保留两位小数) 初二物理试题 密度 (5 17:20:35)若把打气筒的出气口封住,再将活塞向下压的过程中,被封闭在气筒内的空气的质量,体积,密度3个物理量中,不变的是?变大的是?变小的是? 初二 物理 初二科学 请详细解答,谢谢! (5 15:45:30)铝球的体积为400立方厘米,质量为810克,问,该球是实心的还是空心的?(铝的密度:2.7×103千克/立方米) (1)一天刚下雨,地上出现一个个小水坑,但月光非常明亮,小英要去朋友家玩,走之前妈妈告诉她:路灯坏了,亮的地方是水坑,小英果然没踩到水,小英从朋友家回来时,朋友告诉她:不亮的地方 密度 (5 17:19:40)如果水结成冰的话,密度是变小还是变大 科学 (24 20:53:14)下列几种用电器正常工作时,电流最大的是(  )A.42寸液晶电视机   B.MP3       C.电子手表            D.100瓦 如图所示,MN是平面镜,A为发光点,B为反射光线上的一点,试画出经过B点的反射光线、这条反射光线对应的入射光线和法线. 水的密度 (5 12:1:17)有一枚奥运会的纪念币,它的质量是16.1克.为了测量它的体积,把它放入一盛满水的量筒中,侧得溢出的水重为1.8×10-2牛.〔1〕求制作纪念币的金属密度;〔2〕盛满水的量筒在 桌子上放着一个空烧杯,烧杯内有——A氮气 B氧气 C空气 D包括ABC 一道初二物理光的反射题深夜,没有灯光,小明用手电筒照在白墙上高处的镜子,竟然发现镜子是黑的,墙是白的,为什么? 求解,15.17.18.19 急,好评的 科学 (24 21:49:28)下列几种用电器正常工作时,电流最大的是(  )A.42寸液晶电视机   B.MP3       C.电子手表            D.100瓦 初二物理题(关于光的反射)急~1.你能让一束平行光线的传播方向改变180度吗?如果能,请你写出需要的器材和具体的做法(画图说明即可,用两种方案做).2.有人用“伸手不见五指”来形容很 水的沸腾 (13 18:15:37)水沸腾时为何响声比沸腾前小,沸腾时的气泡为何上面比下面大,沸腾前的气泡为何下面比上面大. 科学 (24 16:22:14)T℃时,氯化钠的溶解度是n克,将m克氯化钠投入到n克水中,充分搅拌,若得到不饱和溶液,则溶液的溶质质量分数为(   ).如果m克氯化钠不能完全溶解在n克水中,则溶液的溶 光的反射--题 17.18 某同学质量为60㎏,每只脚与地面的接触面积150cm²,当他站在水平地面上时,对地面的压强多大?若他想使自己对地面的压强增大一倍,他可以怎样做? 1.冰块中包有石块,冰块在装睡的杯中处于漂浮状态,当冰块完全融化后,石块沉入底,则杯中的高度将( ).2.一个漂浮在小型也泳池水面上的小船,一个人从池里捞下面物体放入船中,其中能使池 刚倒完热水的热水瓶,立即盖上盖子,冷却后却不易拔出塞子,请你说明其中的道理.答案上写的是水冷却后使瓶内气体减少,为什么气体会减少啊? 初中物理压强计算题初中物理的压强计算题 1.小车在一段光滑的水平面上运动,若它的自重为20N,速度为3米每秒,则该物体作匀速直线运动所需要的推力为( )N;当它运动到一段平直的粗糙面上时,将会由( )变为( ),原因是受到( ) 问一道初二关于大气压的物理题(微难)“把空罐头瓶的瓶口朝下,并将其按入水中,可见始终不能使瓶内充满水.”这句话答案上说是错的,我问老师时她推理了一下然后说应该是瓶内一滴水都 几道初中物理计算题 压强1.动物保护组织成员测量出野牛在水平沙地上站立时留下的一个脚印的面积为0.025立方米,深度为1.8CM,并对该沙地进行抗压实验发现使沙地达到相同深度的压强为2x10x10 1.运动员把铅球掷出去后(不考虑空气影响),铅球仍要受到___力的作用,受力物体是_____,施力物体是_____.2.一个质量为80KG的重物放在水平面上,人施400N的水平拉力就可以使这个重物在地面匀速滑 一物理大气压问题,初二的~在吸管中间剪一水平切口(吸管未剪断)从切口处折弯吸管,使两段大致成直角,把吸管一端放进水里,从另一端用力吹气,观察到的现象是( )1.切口处有水向上喷出 2.切 一位体重为50千克的中学生每只脚与地面的接触面积为200平方厘米,那么他双脚站在水平面上,对地面的压强是多少? 初二物理期末试题.请详细点,谢谢. 初二一道关于大气压的题目SARS病毒可通过空气传播.当我们吸气时,胸部扩张,胸内肺泡跟着扩张,于是肺的容积增大,肺内空气压强_____,_____使含SARS病毒的空气经鼻腔、气管进入肺中;呼气时,胸 一道初中物理压强计算题把一个长方体平放、侧放、立放在水平桌面上,物块对水平桌面的压强分别是0.8×1000Pa、2×1000Pa、5×1000Pa,已知ρ物=2000kg/立方米,计算这个物块的体积(g取10牛/千克) 初二物理试题,急求,谢谢 一道物理题关于大气压2在研究水的沸点与气压关系的实验中:(1)用酒精灯对烧杯内的水加热,当大气压为1标准大气压时,加热到_______ ,水就开始沸腾.(2)熄灭酒精灯,水_________沸腾.(3)再将装有注 求初二物理关于固体压强的两道试题及解答.要有详细的过程哦.谢谢大家咯.我需要的是计算题和过程。不是填空之类的哦。 一束光线与水平面成30度角要使光沿水平方向传播,可用平面镜将光反射来改变它的传播方向,则平面镜与水平方向所成的角应为多少度? 初二物理题(关于大气压)1.牛奶罐上只开一个小孔,就很难倒出牛奶,这是为什么?2.医生用注射器打针前,要把药液吸入注射器,简单描述医生如何把药液吸进注射器,并作出解释.3.若房顶面积为 初二物理光现象试题和答案.过程.最好有实验 光现象的 初二物理光的反射小明同学用如图所示的装置来探究光的反射规律,M是一块平面镜,镶在一块木板上,白色光屏F可以绕垂直于镜面的ON轴转动,E、F屏上面有以O为圆心的圆弧,上面标有刻度,实验如 1,为什么人能用吸管吸出饮料?2若某人同时将2根吸管含在嘴里,一端放在饮料里,一端放在杯外,他可以喝到饮料吗?为什么?不要非常详细,易懂,说明重点就行 人站在水平地面上时,保持静止,受到__力和____力的作用,这两个力的施力物体分别是_____和 _____.这两个力的关系是__________.悬挂在楼板下的电灯,受到地球对它的_____和电线对它的_____作用,这两 小明和小红坐在教室内两个相距不远的座位上,一束阳光照射到教室里较光滑黑板上,小明说看不到黑板上的字迹,小红却说能清晰看到.你认为这种情况可能吗?为什么? 有关大气压的!急``````````````````````实验:在广口瓶中放入浸满酒精的棉花并把它点燃,用一个煮熟的鸡蛋剥去皮并用它堵住瓶口,问:看到什么现象?如何解释这种现象? 〈声现象〉声音的特性和 噪音的危害和控制 如图所示,两平面镜MP,PN相交,夹角为60°,一束光线AO斜射到MP上,经两平面镜反射后与入射光线AO重合,则AO与MP的夹角α为( ),并作出光路图.请画出光路图,并写出解题过程, 1.水沸腾时的温度时96摄氏度,表明水面的大气压大于一个标准大气压.2.没有大气压的地方,车子的车胎会更容易爆裂.3.氢气球在没有大气压的情况下将能够上升得更高. 求一套初二物理期末试题 一定要有答案啊,两套最好了.直接复制到下面,急 ,这套题不太好,还有没有啊 有关光的反射在水平桌面上有一点光源S,在桌面正上方一米处有一水平放置的平面镜.要使光源发出的光经平面镜反射后,照亮桌面上离光源1m远的B点,平面镜应如何转动?试做图说明. 初二科学题.关于大气压有一“苏泊尔”牌高压锅的直径为24cm,限压阀气孔的直径为35mm,限压阀质量为100克,是估算当正常使用时,锅内气压约为多大?要完整的苦厄写步骤 帮忙找几道初二物理练习题吧,最好有答案 声音的特性一部分吹气球的时候一不小心会把祈求吹破,这时会听到很响的“啪”的一声,对于产生很响的原因,小华有以下猜想:A这时由于气球吹破时引起空气急剧振动而发出的声音B这时由 初二科学关于大气压压强的题目一定要科学的!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn