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

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%

比较两个文件-VB资料 采用递归算法删除带有多级子目录的目录-VB资料 菜单项的动态装入 -VB资料 处理加了密码的MDB文件-VB资料 VB创建临时文件 从公共对话框控件中提取多个文件名称 -VB资料 从全路径名中提取文件名 -VB资料 打印MsChart之类的控件 -VB资料 谈谈在VB6.0中如何使用资源文件进行编程 动画图像分解在VB动画设计中的应用 多重文档界面设计方法-VB资料 恢复回收站中的文件 -VB资料 VB获得位图文件的信息 VB获得文本框中光标所在行的内容 VB获取程序工作路径的方法 VB获取文件或文件夹属性 基于VB的通用折行打印程序 基于VB和EXCEL的报表设计及打印 VB建立多级目录 -VB资料 VB建立快捷方式-VB资料 VB建立文件关联 -VB资料 将RichTextBox 之中被选取的内容复制到剪贴簿-VB资料 将我的程序的文本直接送到WORD中(不用粘贴)-VB资料 开启文件属性窗口 -VB资料 快速读取 TextBox 第 N 行的资料 -VB资料 快速选择里List全部项目-VB资料 VB利用 App.Path 读取「应用程序所在之目录」 VB利用 EM_LINESCROLL 信息控制 TextBox 的卷动。 命名的技巧 -VB资料 目录所占的字节数-VB资料 VB判断文件是否在IE的缓存中 大家看看这台服务是出了什么问题?帮帮忙!!! 一个想把控件内容打印出来的小问题! 如何查看表中各字段的长度? 谁能给出一个ASP.NET应用存储过程的例子 self::node()是否就是 . 高分求救::关于分类显示的问题. c#里的编辑列的激活事件写在哪里? 一个基础小测验 如何获取客户端机器物理内存大小?急!!! 急问:我的VC6.0里的Icon编辑器为什么只有16种颜色 谁有这样的曲线绘图源码,一定重分相谢! 怎样去除启动菜单? 调用自建文件时,报错“重复定义”,为什么? Rave做报表时,要求preview时,不出现那个OutPut Options,并且预览时,要求全屏显示 请问映射文件里添加纪录应该怎么做阿 怎样让下拉列表中选定的值对应为数据库中的值~! 怎样去除启动菜单? asp.net 怎样学习 请问我的要存放含有‘年月日时分秒毫秒微秒’的数据能否用date类型存储? 谁来帮我解决一下问题——解决者另外加分100 问:sys/wait.h 是unix下的一个宏吗? 救命! 请问高手 网页问题 再次跪求教物资进库表和物资库存表的问题! 请问高手,如何在asp中调用,在线等候… 关于局域网的一个问题 一个表的记录写到另一个表中的问题??UP有分 蔡鸟求助:如何用vc++把一个文件(比如图纸)存到局域网中别的机器上 我有IIS的服务器的网站,我用什么软件能知道有谁正在下载什么文件?? 求MICROSOFT VISUAL STUDIO.NET 2002 中文企业版,2003不要,谢谢~ MySQL JDBC 驱动程序在哪里下载? 请教八数码难题的解法! 有在ASP 下 用过regexp类的吗?? 急救!关于ON_WM_ACTIVEAPP的问题 MySQL JDBC 驱动程序在哪里下载? mysql for linux 启动问题? 51job的动态简历预览功能暴快,有谁知道采用了什么样的技术? 请教为什么KeyUp事件不响应? 程序有两个线程时,如果子线程是个死循环,永远不停(如监听一个Socket),那当我的主线程return了后,程序会不会退出呢? 我重载了WM_NCPAINT来画窗体边框和标题栏,可是菜单就不见了,如何给画出来? 如何将INTERBASE中的数据导出到EXCEL文件中?! 关于C# 需要server2003企业中文版(激活的)地址! sql查询问题 update 的问题 急!IIS连接不上 装上JDataConnection Server之后,在数据源ODBC中的驱动程序列表中没有JDBC驱动算不算问题,高分求解! 短消息服务提供商(SP)程序问题 activeX控件问题,急盼高手帮助! 请教八数码难题的解法! 百家思想集大成者什么意思 花根球怎样辨别真伪 为什么单车可以骑着不会倒啊? 花根球牌宫洁丹一盒多少钱? 两个数a、b差120,最大公因(约)数与最小公倍数差105,求a、b的值. go and get my big bag on the loggo and get my big bag on the log. 大公面粉好吗 my good litte dog.go and get my big bag on the log翻中文 下一个是什么呢的英语句子是什么呢 英语,第一个和第四个帮忙看下 黑龙江望奎公安局回应面积超标:夜间疲美政府高官因奥巴马医改核心举措漏洞频乌克兰法院裁定没收季莫申科女儿名下饭外媒称俄罗斯在G20峰会监控各国元首外媒称俄罗斯在G20峰会监控各国元首各国如何处理打医生?日本“老爸地位指数”预测经济走势美最新型隐身驱逐舰下水奥巴马考虑终止 监听盟国领导人英国窃听丑闻案开庭 默多克昔日爱将出无人机击毙索马里“青年党”高官体坛简讯司法体制改革成效由人民评判图文:恩施州联手中南民族大学共建恩施图文:首列“归元金”抵汉开发区怎能是个大杂烩图文:大手牵小手共筑足球梦加快我省食品安全立法建立食品生产经营亚投行年底前正式成立武汉“三公”经费预算6年无增长转作风从“纳税人满意”开始甘荣坤会见土库曼斯坦驻华大使网游之逍遥新生股海潮生曲废材志超级火耀人仙贼王飘渺仙缘路魂踏玄穹含笑关山月重造圣域佛临异界佛门之金乌传威海海上公园旅游威海公园旅游幸福门旅游幸福公园旅游定远舰旅游环翠楼公园旅游太公岛风景区旅游万平口旅游日照世帆赛基地旅游日照灯塔旅游奥林匹克水上公园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘