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

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%

物联网时代,你的汽车也在转型 触宝输入法产品经理解析iOS 8第三方输入法开放程度 专访联想谢政维:功耗和价格是天蝎项目最大障碍! 《近匠》蚁视科技创始人覃政:ANTVR,虚拟现实的新生 后棱镜门时代:开发者保护应用安全的5大技巧 专访许鹏:谈C程序员修养及大型项目源码阅读与学习 65种GPU性能测试,AMD开源驱动领先! 一周消息树:我们从WWDC 2014收获了什么? 精益设计:“纸上谈兵”的说服力 指尖上的艺术——如何运用代码发挥无限创意 周末巨献:100+诡异的数据集,20万Eclipse Bug、死囚遗言等 TIOBE 2014年6月编程语言排行榜:Swift能否取代Objective-C? 移动游戏后端:开发还是购买?你必须知道的6件事 Vuforia SDK 3.0发布在即 全球注册开发者已逾10万 最受职场青睐的十大热门云计算技能盘点 Android Bootstrap:开发也能用模板,省时又省力! Facebook开源又一力作,欲借Broadcom开放交换机 华为敏捷网络:坚持被集成,引领ICT融合 专访赵桂华:.Net也有春天及高性能网站架构实践 《近匠》Testin:云测试除了APP和真机 还有可穿戴和汽车 应用开发利器FXForms:iOS上实现各种Form View Firefox 30正式版:支持GStreamer 1.0技术、内置全新Gecko 30内核 从阿里、UC联姻 看移动互联网“入口”之争 AppCode发布3.0.1更新,支持Xcode 6和Swift 智能家居持续升温:苹果HomeKit合作伙伴Honeywell发布恒温器 欲与谷歌、亚马逊抗衡,苹果推CloudKit拥抱云服务 针对新一代物联网应用 Atmel推全新32位微控制器 实时计算,流数据处理系统简介与简单分析 Cue:秒杀HealthKit,打造自己的家庭医生 新iPhone要来:4.7就够了么?我们还有更大的 Docker迈入云(DockerHub)+端(Docker引擎)时代 求助:关于treeview的右键点击选中的问题。。。 小弟才學 JavaMail 安書上的例子寫了下面的代碼 編譯通過但是 運行不了 幫忙看看!!!! 虚函数是什么意思。 delphi5的sql语句 请教。Windows CE Services 怎么用。我有一张盘,不知用法。 [老问题]如何对并口进行操作?300分。----------------- 请问Java TM Programming Language中的TM(在Java的右角上)是什么意思啊? 这样的程序界面应该如何做?紧急求助!!! HelloImpl err: Cannot connect to ORB 是怎么回事呢? Source Insight3.1使用问题?正确解答者150分 哪儿有《The art of computer programming》下载? C++編程思想 各位情场高人,帮小弟一把,怎么把这个MM约出来,出个主意,俺先谢谢大家了!!! 我需要JAVA-JDBC打开数据库的例子.................... 谁有Delphi编译错误信息对照表,有中文注解的最好---50分 请问在SQLSERVER2000中如何在检索数据是将两个字段合并成一个字段,用“||”吗? 数据库的重定向问题! 关于使用资源 QRRichText 打印如果页数很多(2页以上),就打印不完全,但打印预览中可以看到全部,为什么? 我有一个弱弱问题要问。。。 在C#中如何做ToolWindow属性的WinForms?????????? 怎样才能将静态文本框的背景色设置为透明的? 实时错误“480”,不能创建AUTOREDRAW图象,如何解决?把PICTUREBOX定义太大会产生这个错误,不能绘图! COOL!COOL! 序列的一系列问题 劳烦各位介绍一下业界最流行实用的汇编,C语言编译器,我是在校生急需指导! Rebar 移动的问题!烦死我了! 高手留步:请问VC中获取当天日期的函数是???还有比较两个日期所差天数用什么函数??? 请问怎样才能将vb中的date型的内容转化为sql server的datetime型呀,谢谢大家了 请问,怎样在 FLAH5 中直接插入 MP3,并改变 MP3 的音质? 利用delphi连接远程sybase数据库,在多用户操作情况下为什么会产生数据库死锁 看了一下SL275(2001年5月)的课程概述,发现里面没有了Applet了,SCJP是不是舍弃了它了? 有关JAVA的Package,ClassPath的讨论,诸位看过来 COOL!COOL!COOL! what's wrong with the SOCKET define? 使用vb通过NotesSQL for odbc连接过domino数据库时总出现如下错误“ [Microsoft][ODBC 驱动程序管理器] 驱动程序的 SQLAllocHandle on SQL_HANDLE_ENV 失败”,有谁遇到过吗?如何解决? 在SDK中,如何判断对话框中的CheckBox是否选中? 请教如何修改如何提交数据(一对多的表) 如何在delphi里实现文件(比如文本文件)从一台机器传递到另一台机器?比较急! 不知道主板集成声卡的型号,又没有驱动程序?怎么办?主板是ASUS CUSL2,I815E CHIPSET 想问问大家pb自带的例子中有没有关于权限的例子 怎么样吧jpg图片转成ico?????? 听说程序员结婚生孩子多数会是女孩,是不是真的?,好像与辐射有关哦 那里有windoes版的ftp源码 不知道主板集成声卡的型号,又没有驱动程序?怎么办? 主板是ASUS CUSL2 ,I815E CHIPSET 请问哪里有编写多线程安全对象的资料?(72分) 通过界面输入大量数据,界面如何设计??? 在Red hat 7.1如何安装GBK字符集! Focus(老鱼)回答得50分 请教网站的建设计划如何写呀? 请问下面的DELPHI程序如何转为CB (X/10)(X/10)=(6-X*X)/36 学信网可以查英语四级网考成绩吗看好了是四级网考成绩哟 已知x+y=3,xy=1,a+b=5,ab=3,且m=ax+by,n=bx+ay 求m^3+n^3的值 2009年六月的英语四级成绩什么时候能出来? 小白加小白等于什么? 设A=根号5-根号6,B=根号6-根号7,A,B的大小关系 2009年6月的英语四级成绩什么时候出来 小白加小白等于啥? 小白加小白等于什么呢? 解方程:2x-3分之4=2分之1 3分之1x+5=13 三次根号9与根号3的大小 求含字母的绝对值化简 2道 快 2009年6月四级成绩什么时候出来?如题.、 在有理数中,最小的正整数是什么?,最大的负整数?,绝对值最小的数是? 化简有绝对值的带字母的式子的规律 09年6月英语四级成绩什么时候查得到在哪查、PS :我是江西的 十进制数转换成八进制数正数我会转换,主要是十进制的负数 转换成八进制数.例如十进制数-111转成8进制数.本人菜鸟,请写出计算过程.请问,八进制数、十六进制数,在计算机里占两个字节的空 初一的化简绝对值题目(带字母的) 快点啊,多谢啦! 什么时候可以知道2009年6月英语四级的成绩 如何将十进制数转换成八进制数? 已知b=根号(a-3)+根号(3-a)+根号8 试比较a、b的大小 灵异事件解答有时睡觉的时候突然醒了 意识清醒的状态下 我自己总是觉得身体里有东西老是想往外飘 但每次快飘出身体的时候总被拉回来 有时反反复复次 我想请问下这是怎么回事? 1、十进制数59转换成八进制数是 (4)有一个数是123,它与十六进制数53相等,那么该数值是A)八进制数; B)十进制数; C)五进制 ; D)二进制数A 绝对是灵异事件,我带手机上学,每天晚上回到家,装手机的袋子那链子总是拉开,我是坐车回来的,下车的时候还是拉着的,连续几天了,难道真的有鬼 八进制转十进制怎么转啊?八进制数1507 一个数是123,它与十六进制数53相等那么该数是几进制的?怎么个算法? 这件事过去了快一年了!本该早已忘记,不过我经常想起,也无法理解所以想请高手帮我解答下!事情是这样的,那天晚上陪朋友在网吧里等人大概等到12点她朋友才来!然后我自己一个人回家~网吧 英语四级成绩证明什么样子 有一个数是123,它与十六进制53相等的数值是多少?我很着急,计算过程也要, 3倍的根号0.2+4倍的根号125+根号27分之1—根号75 比较大小 π和22/7 根号3和5/3 (ax+by)^2-(ay+bx)^2 谁能帮我解答灵异事件?昨天晚上做梦梦到左手的玉镯子碎了,今天老公下班回家告诉我他今天抽完烟仍烟头市烟头居然立住了,他觉得很有意思还拍了照片留纪念呢,但是我很忐忑.上网查了我 比较大小:根号22___5(填“大于”或“小于”求值 ±根号4又25分21= 小白加小白等于? 计算0.75^-1×(根号下3/2)^1/2×(27/4)^1/4+10(根号下3-2)^-1+1 小白加小白等于什么 通过估算,比较根号2分之根号5-1与8分之5的大小 是个灵异事件 有人问我小白加小白等于什么 小白加小白等于多少 如果x+5=10.那x是多少, 小白加小白等于什么呢? 八进制数0123的值相当于十进制的83;十六进制数0x123的值相当于十进制数的291.我不明白那83和291的结...八进制数0123的值相当于十进制的83;十六进制数0x123的值相当于十进制数的291.我不明白 (x+3):5=10:5 小白加小白等于……… 多元函数f(xy,x-y)=x²+y²,则af(x,y)/ax+af(x,y)/ay=? 英语六级要比英语四级难很多么?我还想知道英语六级的 具体做题顺序 是不是还像四级一样 分AB卷 而且是分开收 2013年十月网考四级成绩怎么查询? 化简(x²+xy+y²)(x²-xy+y²)=? 介绍一下英语四级的考法.本人大学本科自考,现要考英语四级.但我英语实在是不行.有没有社会考生的考法,或者是其他有效可行的途径. 2012年5月份的四级网考成绩怎么查?官网说7月15出成绩,怎么查?是五月四级网考! 比较根号2+根号7与根号3加根号五的大小 评析我的英语四级,望指教我的英语4级的成绩总分是:464听力:169阅读:157综合:47写作:91,哪位可以帮我分析下我的薄弱项吗?我对四级的评分不是熟悉-想继续考6级-望各位能给我些建议,先 网考四级怎么查啊是网考,希望大侠不要弄混了 英语谜语,可能是脑经急转弯how many feet are there in a yard 如何解(x-0.3)分之36-x分之36=4 大学英语四级网考能查成绩吗怎莫不能查啊 这是10进制转几进制的?6bb8121b3db2771a65daeacb29342c429ec1d948dc1841b1340d239b4b04d41a复原成十进制是什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn