写了一段时间的NIO通信部分,在不断的摸索中提升,但是也有很多不足的地方,下面是一些在写的过程解决的小方法。
QUEUE的认识让我在写程序中如鱼得水,在NIO通信中经常利用到
Queue queue = new LinkedList();
1: 在NIO通信中利用QUEUE来处理信息的发送和接受
java 代码
- while (selector.select() > 0) {
- Set readyKeys = selector.selectedKeys();
- Iterator it = readyKeys.iterator();
- while (it.hasNext()) {
- try {
- SelectionKey key = (SelectionKey) it.next();
- it.remove();
-
- if (key.isAcceptable()) {
- ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
- SocketChannel socketChannel = (SocketChannel) ssc.accept();
- socketChannel.configureBlocking(false);
- socketChannel.register(selector, SelectionKey.OP_READ
- | SelectionKey.OP_WRITE);
- }
- if (key.isReadable()) {
- receive(key);
- }
- if ( key.isWritable()) {
- send(key);
- }
- } catch (IOException e) {
- e.printStackTrace();
- try {
- if (key != null) {
- key.cancel();
- key.channel().close();
- }
- } catch (Exception ex) {
- logger.error(ex);
- } }
- }
- }
定义相关相关队列
java 代码
- 定义接受和发送队列
- Queue<string></string> reciveQueue = new LinkedList<string></string>();
- Queue<string></string> sendQueue = new LinkedList<string></string>();
关于revceive(key)就可以这样处理了
java 代码
- public void receive(SelectionKey key) throws IOException {
- SocketChannel socketChannel = (SocketChannel) key.channel();
-
- socketChannel.read(readBuff);
- readBuff.flip();
- String rmsg = decode(readBuff);
-
- reciveQueue.offer(rmsg );
- ByteBuffer tempBuffer = encode(msg);
- readBuff.position(tempBuffer.limit());
- readBuff.compact();
- }
关于Send(key)
java 代码
- public void send(SelectionKey key) throws IOException {
- SocketChannel socketChannel = (SocketChannel) key.channel();
- String msg = null;
- ByteBuffer reBuffer = null;
-
- while ((msg = sendQueue.poll()) != null) {
- reBuffer = encode(msg);
- writeBuff.put(reBuffer);
- writeBuff.flip();
- while (writeBuff.hasRemaining())
- socketChannel.write(writeBuff);
-
- writeBuff.position(reBuffer.limit());
- writeBuff.compact();
- }
- }
2:关于心跳协议
以前在处理这部分时很烦恼,在网上搜了很多也问了一些人。遇到QUEUE后,我开始利用QUEUE来处理消息,也解决了心跳包的发送烦恼;可以利用定时器在固定时间内象队列中offer心跳包;
3:因为QUEUE是线程安全的,所以在QUEUE的处理上带来了很多方便,可以在利用多线程完成通信和数据的处理异步方式,利用NIO完成数据的接受,然后将reciveQueue注入到另一个数据处理线程,来完成异步处理的效果。
分享到:
相关推荐
9. **IO流与NIO**: - 字节流与字符流 - 文件操作 - NIO(New Input/Output)的优势和使用 10. **反射**: - 运行时类信息获取 - 动态创建对象和调用方法 11. **设计模式**: - 单例模式、工厂模式、观察者...
- NIO(New IO)与AIO(Asynchronous IO) 7. **反射与动态代理**: - Class类的使用 - 反射创建对象、调用方法 - Java动态代理(JDK Proxy与CGLIB) 8. **设计模式**: - 单例、工厂、观察者、装饰者等常见...
6. **IO流与NIO** - 字节流与字符流:理解InputStream、OutputStream、Reader、Writer及其子类。 - 缓冲流:掌握BufferedReader、BufferedWriter等缓冲流的使用。 - NIO(New IO):了解Channel、Buffer、...
- **List、Set与Queue**:ArrayList、LinkedList、HashSet、TreeSet等容器的特性与使用。 - **Map接口**:HashMap、LinkedHashMap、TreeMap的实现与区别。 - **泛型**:泛型的使用,限制集合元素的类型,提高代码...
- List、Set、Queue接口及其实现类的特性与应用场景。 - HashMap、HashTable、ConcurrentHashMap的区别与使用场景。 - 泛型的使用,类型擦除的概念。 5. **多线程** - 创建线程的三种方式:继承Thread类、实现...
- List、Set、Queue与Map接口:熟悉各种实现类如ArrayList、LinkedList、HashSet、HashMap等的特性与使用场景。 - 集合操作:掌握迭代器、遍历、排序、去重、集合转换等操作。 - 高级特性:理解并发容器如...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和高效性而闻名。Java面试题常常涵盖多个方面,包括...在实际面试中,面试官可能会结合实际项目经验进行深入提问,所以理论知识与实践经验的结合尤为重要。
四、IO流与NIO 1. 字节流与字符流:理解InputStream、OutputStream、Reader、Writer的基本使用。 2. 文件操作:掌握File类的常用方法,理解缓冲流BufferedReader和BufferedWriter的作用。 3. NIO(New IO):了解...
9. **IO流与NIO** - **IO流体系**:概述了输入输出流的基本概念,包括字节流和字符流的区别。 - **NIO(New IO)**:介绍了Java NIO的非阻塞I/O模型,以及通道、缓冲区的概念。 10. **反射与注解** - **反射机制...
6. **I/O与NIO**:掌握Java传统的IO流和最新的非阻塞I/O(New IO,即NIO)框架,包括通道、缓冲区、选择器等概念。 7. **Java泛型**:理解泛型的基本用法、边界、通配符及其在设计上的优势。 8. **Java 8及更高...
- List、Set、Queue和Map接口:理解各种集合类的特性,如ArrayList、LinkedList、HashSet、HashMap等的实现与操作差异。 - 泛型:理解泛型的作用,以及类型擦除的概念。 - 接口与抽象类:比较接口和抽象类的使用...
Java SE(标准版)是Java编程语言的核心部分,它提供了编写桌面应用、服务器端应用以及各种类型软件的基础框架。在“Java SE核心(2)5d”这个学习资源...记得理论与实践相结合,不断练习,才能真正消化吸收这些知识。
三、IO与NIO 1. 传统IO流:字节流和字符流的使用,包括FileInputStream、FileOutputStream、BufferedReader和PrintWriter等。 2. NIO(非阻塞I/O):Channel、Selector、Buffer的使用,以及异步I/O操作的实现。 3. ...
6. IO与NIO - 流的概念:输入流、输出流的分类,以及各自的使用场景。 - NIO(New IO):非阻塞IO模型,Channel、Buffer和Selector的使用。 - 文件操作:文件读写,文件复制,以及随机访问文件的方法。 7. ...
Java编程语言是软件开发领域的重要组成部分,尤其在企业级应用和互联网开发中占据主导地位。这份"java导学书中源...同时,国外教材通常注重理论与实践相结合,使得学习过程更加生动有趣,对于提升编程技能非常有益。
Java面试是评估应聘者技术水平和综合能力的重要环节。下面,我们将深入探讨Java面试中的关键知识点,这些内容对于准备Java开发职位的面试者至关重要。...记住,理论知识与实践经验的结合才是成功的关键。
3. **集合框架**:List、Set、Queue、Map接口及其实现类的特性与区别,比如ArrayList、LinkedList、HashSet、HashMap的工作原理。 4. **内存管理**:了解Java的内存区域,如堆、栈、方法区,以及垃圾回收机制(GC)...
7. **IO与NIO** - 输入/输出流:FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等。 - 文件操作:创建、读写、删除文件,目录操作。 - NIO(New IO):非阻塞IO,通道(Channel)和缓冲区...
4. **数组与集合框架**:数组的创建与操作,以及集合框架中的List、Set、Queue和Map接口及其常用实现类,如ArrayList、LinkedList、HashSet、HashMap等的特性和使用场景。 5. **多线程**:线程的创建、同步和通信,...
【京东商城Java笔试真题解析】 在准备京东商城的Java笔试时,理解并掌握核心的Java编程概念至关重要。京东作为一家知名的电商平台,其技术面试往往注重候选人的...记得结合实际案例进行练习,加深理论与实践的结合。