com.nio.Server
package com.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class Server { private Selector selector = null; public Server() throws IOException{ // register the server ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); int port = 8080; InetSocketAddress endpoint = new InetSocketAddress(port ); ssc.socket().bind(endpoint); selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); } public void start() throws IOException{ while(true){ int num = selector.select(); if(num>0){ Set<SelectionKey> selectionKeySet = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectionKeySet.iterator(); while(iterator.hasNext()){ SelectionKey key = iterator.next(); iterator.remove();// must remove it if (key.isAcceptable()) { ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel(); SocketChannel sc = serverSocketChannel.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); }else if (key.isReadable()) { System.out.println("do read ..."); SocketChannel sc = (SocketChannel) key.channel(); sc.register(selector, SelectionKey.OP_WRITE); }else if (key.isWritable()) { System.out.println("do write ..."); SocketChannel sc = (SocketChannel) key.channel(); sc.close(); key.cancel(); } } } } } public static void main(String[] args) throws Exception { new Server().start(); } }
com.nio.Client
package com.nio; import java.io.IOException; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException{ System.out.println("client start ... "); Socket socket = new Socket("localhost",8080); socket.close(); System.out.println("client end ... "); } }
Note:
1. 在使用Iterator迭代SelectionKey的后,必须调用Iterator.remove(). 因为select()只会向selector所关联的键集合中添加元素,如果不移除每个处理过的键,它就会在下次select()方法时仍然保留在集合中。
2. 不要轻易使用SelectionKey.cancel(). cancel 会终止selector 和 key关联的Channel的联系。
相关推荐
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...
为了更好地理解Java NIO的使用方式,下面我们通过简单的代码示例来展示如何实现一个基本的NIO服务端和客户端。 **服务端代码实现** ```java package cn.nio; import java.io.IOException; import java.net....
例如,书中提到了使用 Java NIO 可以提高应用程序的响应性、可扩展性和可靠性等。 ### Java NIO API 与旧版 I/O API 的关系 值得注意的是,Java NIO API 是对旧版 I/O API 的补充而非替代。这意味着开发者需要了解...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了系统在处理大量并发连接时的效率。在这个“基于java NIO的socket通信demo...
在描述中提到的"JAVA NIO 异步通信客户端"是指使用NIO API实现的一个客户端程序,它能够在不阻塞主线程的情况下进行网络通信。这通常通过使用Selector和Channel来完成。Selector负责监控多个通道的状态变化,而...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,相对于传统的BIO( Blocking I/O)模型,NIO在处理高并发、大数据量的网络应用时表现出更高的效率和...
还包括了基础和高级I/O概念、二进制I/O以及新的缓冲区类、内存映射文件和文件锁定机制、字符I/O操作(涉及编码、解码和转换字符数据的处理)、新的正则表达式API以及如何通过`java.nio`包实现I/O复用。 作者通过...
Java NIO的Reactor模式是实现高并发的关键。Reactor模式是一种事件驱动的架构模式,它具有事件分离器、事件处理器以及复用的事件队列。事件分离器负责监听事件的发生,事件处理器对相应的事件做出响应。在Java NIO中...
标题中的“nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser”表明这是一个关于Java NIO的服务器实现,且是基于事件驱动模式的。事件驱动编程是一种设计模式,它允许程序对特定事件做出响应,而...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区的I/O)相比,NIO具有更高的效率和灵活性。在Java NIO中,数据是以通道...
Java NIO,全称为Non-blocking Input/Output,是Java在1.4版本引入的一个新特性,旨在提供一种更高效、更灵活的I/O操作...结合实际项目需求,合理运用Java NIO的Selector机制,可以显著提升系统的吞吐量和响应速度。
本资料"java-nio.rar"主要探讨的是如何使用Java NIO实现异步连接池,这在高并发场景下尤其重要,因为它能显著提升系统性能。 1. **NIO基础** - **通道(Channels)**:NIO中的通道类似于流,但它们是双向的,可以...
8. **异步文件操作**:Java NIO2(Java 7引入)引入了异步文件操作,使得读写文件可以在后台线程中执行,不阻塞主线程,进一步提高了服务器的响应速度。 总结来说,Java NIO通过引入非阻塞I/O和选择器,优化了...
### Java NIO通信框架在电信领域的实践 #### 华为电信软件技术架构演进 **1.1 电信软件概述** 电信软件是一个宽泛的概念,根据功能和应用场景的不同大致可以分为两大类:系统软件和业务应用软件。系统软件通常...
- **定义**:选择器(Selector)是 Java NIO 中用于监听多个通道的事件的组件。它允许单个线程同时监听多个数据通道,提高了多路复用的效率。 - **应用场景**:选择器特别适合于处理大量低流量的连接,如聊天服务器...