`
cary
  • 浏览: 86015 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

NIO 与 QUEUE 的结合

    博客分类:
  • J2EE
阅读更多

写了一段时间的NIO通信部分,在不断的摸索中提升,但是也有很多不足的地方,下面是一些在写的过程解决的小方法。
QUEUE的认识让我在写程序中如鱼得水,在NIO通信中经常利用到
Queue queue = new LinkedList();
1: 在NIO通信中利用QUEUE来处理信息的发送和接受

java 代码
  1. while (selector.select() > 0) {   
  2.   Set     readyKeys =  selector.selectedKeys();   
  3.   Iterator  it = readyKeys.iterator();   
  4.          while (it.hasNext()) {    
  5.     try {   
  6.          SelectionKey   key = (SelectionKey) it.next();   
  7.          it.remove();   
  8.   
  9.          if (key.isAcceptable()) {             
  10.                 ServerSocketChannel ssc = (ServerSocketChannel) key.channel();   
  11.                 SocketChannel socketChannel = (SocketChannel) ssc.accept();   
  12.                 socketChannel.configureBlocking(false);                
  13.                 socketChannel.register(selector, SelectionKey.OP_READ   
  14.                 | SelectionKey.OP_WRITE);   
  15.          }   
  16.        if (key.isReadable()) {   
  17.             receive(key);   
  18.        }   
  19.        if ( key.isWritable()) {   
  20.             send(key);   
  21.        }   
  22.     } catch (IOException e) {   
  23.             e.printStackTrace();   
  24.             try {   
  25.                   if (key != null) {   
  26.         key.cancel();// 释放和关闭key   
  27.         key.channel().close();   
  28.         }   
  29.             } catch (Exception ex) {   
  30.         logger.error(ex);   
  31.             }   }   
  32.    }// #while   
  33. }  

定义相关相关队列

java 代码
  1. 定义接受和发送队列   
  2. Queue<string></string>   reciveQueue = new LinkedList<string></string>();   
  3. Queue<string></string>   sendQueue = new LinkedList<string></string>();  


关于revceive(key)就可以这样处理了

java 代码
  1. public void receive(SelectionKey key) throws IOException {   
  2.     SocketChannel socketChannel = (SocketChannel) key.channel();   
  3.   
  4.     socketChannel.read(readBuff);   
  5.     readBuff.flip();   
  6.     String rmsg = decode(readBuff);   
  7.     //将接受到的数据放到队列中   
  8.                                           reciveQueue.offer(rmsg );   
  9.     ByteBuffer tempBuffer = encode(msg);   
  10.     readBuff.position(tempBuffer.limit());   
  11.     readBuff.compact();   
  12. }  

关于Send(key)

java 代码
  1. public void send(SelectionKey key) throws IOException {   
  2.         SocketChannel socketChannel = (SocketChannel) key.channel();   
  3.         String msg = null;   
  4.         ByteBuffer reBuffer = null;   
  5.                                           //队列中取出需要发送的信息   
  6.         while ((msg = sendQueue.poll()) != null) {   
  7.             reBuffer = encode(msg);   
  8.             writeBuff.put(reBuffer);   
  9.             writeBuff.flip();   
  10.             while (writeBuff.hasRemaining())   
  11.                 socketChannel.write(writeBuff);   
  12.   
  13.             writeBuff.position(reBuffer.limit());   
  14.             writeBuff.compact();   
  15.         }   
  16.     }  

2:关于心跳协议
    以前在处理这部分时很烦恼,在网上搜了很多也问了一些人。遇到QUEUE后,我开始利用QUEUE来处理消息,也解决了心跳包的发送烦恼;可以利用定时器在固定时间内象队列中offer心跳包;

3:因为QUEUE是线程安全的,所以在QUEUE的处理上带来了很多方便,可以在利用多线程完成通信和数据的处理异步方式,利用NIO完成数据的接受,然后将reciveQueue注入到另一个数据处理线程,来完成异步处理的效果。

分享到:
评论
2 楼 duanxincool 2008-02-19  
先对你的文章做个评价,确实不错,没有大堆理论,只有实现与自己的解决方案,我一直在java.nio的服务器开发,从开始不知道有这个包到现在,一路走来,困难太多,想做服务器很简单,但是想做无论性能还是伸缩性都高性能的,不是说说那么简单的,一直到现在都觉得自己学的程序还是比较幼稚的,网络上有很多问题都没有具体的想法,或实现的方案,比如心跳,又或说客户连接上来了,不做事情,的解决方案都不是很好,我天天在google上请教,提问,还是得不到解决,关于心跳都只知道解释概念,对具体的方案都比较模糊,看到你的文章发现,只有你还理清了自己的方案,能不能把你的code给我参考参考,或交流交流,我邮箱:j2ee_duanxin@126.com,给我发邮箱把,无论是服务器的讨论还是指教,我都欢迎
1 楼 zhzhl0 2007-10-17  
你好,最近我一直在研究nio,但老得不到要领,今天看了的文章觉得写的很好。能给我一个完整的code吗,如果方便的话,谢谢!
mklv2005@163.com

相关推荐

    关于Java面试,你应该准备这些知识点共9页.pdf.zi

    9. **IO流与NIO**: - 字节流与字符流 - 文件操作 - NIO(New Input/Output)的优势和使用 10. **反射**: - 运行时类信息获取 - 动态创建对象和调用方法 11. **设计模式**: - 单例模式、工厂模式、观察者...

    亲测携程java面试(8问)无答案.zip

    - NIO(New IO)与AIO(Asynchronous IO) 7. **反射与动态代理**: - Class类的使用 - 反射创建对象、调用方法 - Java动态代理(JDK Proxy与CGLIB) 8. **设计模式**: - 单例、工厂、观察者、装饰者等常见...

    牛客网 校招面试题库(附答案与解析)java篇

    6. **IO流与NIO** - 字节流与字符流:理解InputStream、OutputStream、Reader、Writer及其子类。 - 缓冲流:掌握BufferedReader、BufferedWriter等缓冲流的使用。 - NIO(New IO):了解Channel、Buffer、...

    java笔试大全(精品)

    - **List、Set与Queue**:ArrayList、LinkedList、HashSet、TreeSet等容器的特性与使用。 - **Map接口**:HashMap、LinkedHashMap、TreeMap的实现与区别。 - **泛型**:泛型的使用,限制集合元素的类型,提高代码...

    BAT高级Java面试题70题目含答案

    - List、Set、Queue接口及其实现类的特性与应用场景。 - HashMap、HashTable、ConcurrentHashMap的区别与使用场景。 - 泛型的使用,类型擦除的概念。 5. **多线程** - 创建线程的三种方式:继承Thread类、实现...

    2022最新最全java高级工程师面试题.rar

    - List、Set、Queue与Map接口:熟悉各种实现类如ArrayList、LinkedList、HashSet、HashMap等的特性与使用场景。 - 集合操作:掌握迭代器、遍历、排序、去重、集合转换等操作。 - 高级特性:理解并发容器如...

    java面试题.zip

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和高效性而闻名。Java面试题常常涵盖多个方面,包括...在实际面试中,面试官可能会结合实际项目经验进行深入提问,所以理论知识与实践经验的结合尤为重要。

    java名企面试题_java面试题_

    四、IO流与NIO 1. 字节流与字符流:理解InputStream、OutputStream、Reader、Writer的基本使用。 2. 文件操作:掌握File类的常用方法,理解缓冲流BufferedReader和BufferedWriter的作用。 3. NIO(New IO):了解...

    《码出高效:Java 开发手册》1.4.0

    9. **IO流与NIO** - **IO流体系**:概述了输入输出流的基本概念,包括字节流和字符流的区别。 - **NIO(New IO)**:介绍了Java NIO的非阻塞I/O模型,以及通道、缓冲区的概念。 10. **反射与注解** - **反射机制...

    Java资料水平考试高程.

    6. **I/O与NIO**:掌握Java传统的IO流和最新的非阻塞I/O(New IO,即NIO)框架,包括通道、缓冲区、选择器等概念。 7. **Java泛型**:理解泛型的基本用法、边界、通配符及其在设计上的优势。 8. **Java 8及更高...

    Java互联网企业面试真题

    - List、Set、Queue和Map接口:理解各种集合类的特性,如ArrayList、LinkedList、HashSet、HashMap等的实现与操作差异。 - 泛型:理解泛型的作用,以及类型擦除的概念。 - 接口与抽象类:比较接口和抽象类的使用...

    javaSe核心(2) 分五天学习

    Java SE(标准版)是Java编程语言的核心部分,它提供了编写桌面应用、服务器端应用以及各种类型软件的基础框架。在“Java SE核心(2)5d”这个学习资源...记得理论与实践相结合,不断练习,才能真正消化吸收这些知识。

    Ex_Files_Java_Adv_Training.zip_ex

    三、IO与NIO 1. 传统IO流:字节流和字符流的使用,包括FileInputStream、FileOutputStream、BufferedReader和PrintWriter等。 2. NIO(非阻塞I/O):Channel、Selector、Buffer的使用,以及异步I/O操作的实现。 3. ...

    java编程技巧典型案例解析

    6. IO与NIO - 流的概念:输入流、输出流的分类,以及各自的使用场景。 - NIO(New IO):非阻塞IO模型,Channel、Buffer和Selector的使用。 - 文件操作:文件读写,文件复制,以及随机访问文件的方法。 7. ...

    java导学书中源代码

    Java编程语言是软件开发领域的重要组成部分,尤其在企业级应用和互联网开发中占据主导地位。这份"java导学书中源...同时,国外教材通常注重理论与实践相结合,使得学习过程更加生动有趣,对于提升编程技能非常有益。

    Java面试题大全,一些常用的题目

    Java面试是评估应聘者技术水平和综合能力的重要环节。下面,我们将深入探讨Java面试中的关键知识点,这些内容对于准备Java开发职位的面试者至关重要。...记住,理论知识与实践经验的结合才是成功的关键。

    Javamianshiti.rar_java 闈㈣瘯

    3. **集合框架**:List、Set、Queue、Map接口及其实现类的特性与区别,比如ArrayList、LinkedList、HashSet、HashMap的工作原理。 4. **内存管理**:了解Java的内存区域,如堆、栈、方法区,以及垃圾回收机制(GC)...

    java面试题集一些问题

    7. **IO与NIO** - 输入/输出流:FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等。 - 文件操作:创建、读写、删除文件,目录操作。 - NIO(New IO):非阻塞IO,通道(Channel)和缓冲区...

    SCJP真题+个人笔记

    4. **数组与集合框架**:数组的创建与操作,以及集合框架中的List、Set、Queue和Map接口及其常用实现类,如ArrayList、LinkedList、HashSet、HashMap等的特性和使用场景。 5. **多线程**:线程的创建、同步和通信,...

    京东商城Java笔试真题

    【京东商城Java笔试真题解析】 在准备京东商城的Java笔试时,理解并掌握核心的Java编程概念至关重要。京东作为一家知名的电商平台,其技术面试往往注重候选人的...记得结合实际案例进行练习,加深理论与实践的结合。

Global site tag (gtag.js) - Google Analytics