昨天在翻看mina源码时,突然想起我貌似还没直接写过基于java nio的代码,于是今天想抓紧练习下,写段小程序。
这段小程序可以在terminal用telnet连服务器端,输入内容,当服务器收到内容之后,会在控制台打印输出,接着再把这些内容稍做“包装”并返回给客户端terminal。程序里面还支持是否强制使用java epoll (配置个系统参数 java.nio.channels.spi.SelectorProvider = sun.nio.ch.EPollSelectorProvider就可以了),不过当然这得看运行环境了,对linux版本和java版本都有要求。下面直接贴贴代码:
package niotest; 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.util.Iterator; /** * 基于java nio的RepeatServer。 * 可以在terminal用telnet连服务器端,输入内容,当服务器收到内容之后,会在控制台打 * 印输出,接着再把这些内容稍做“包装”并返回给客户端terminal。 * * @author auzll */ public final class RepeatServer { private ServerSocketChannel serverSocketChannel; private Selector selector; private static final String SELECTOR_PROVIDER_KEY = "java.nio.channels.spi.SelectorProvider"; private static final String EPOLL_SELECTOR_CLASS = "sun.nio.ch.EPollSelectorProvider"; public RepeatServer(boolean epoll, int port) throws IOException { if (epoll) { // 强制设置使用java epoll,需要linux和java版本的支持 // 在我写这个测试代码的时候,我的机器环境是默认使用了EPollSelectorProvider System.setProperty(SELECTOR_PROVIDER_KEY, EPOLL_SELECTOR_CLASS); } serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.socket().setReuseAddress(true); serverSocketChannel.bind(new InetSocketAddress(port)); selector = Selector.open(); // 仅注册OP_ACCEPT serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println(String.format("*** Server start on %d , selector provider class is %s ***", port, selector.provider().getClass().getName())); } /** * 处理客户端连接,并注册读事件 */ private void handleAcceptable(SelectionKey readyKey) throws IOException { ServerSocketChannel serverSocketChannel = (ServerSocketChannel) readyKey.channel(); SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); socketChannel.register(selector, SelectionKey.OP_READ, byteBuffer); } /** * 处理读事件 */ private void handleReadable(SelectionKey readyKey) throws IOException { SocketChannel socketChannel = (SocketChannel) readyKey.channel(); ByteBuffer readBuff = ByteBuffer.allocate(1024); Charset charset = Charset.defaultCharset(); boolean gotData = false; while ( socketChannel.read(readBuff) > 0 ) { gotData = true; // 注册写事件 readyKey.interestOps(readyKey.interestOps() | SelectionKey.OP_WRITE); readBuff.flip(); CharBuffer charBuffer = charset.decode(readBuff); String repeatData = "We got: [" + charBuffer.toString().trim() + "]\r\n"; System.out.println(repeatData); ByteBuffer attachBuff = (ByteBuffer) readyKey.attachment(); attachBuff.clear(); attachBuff.put(charset.encode(repeatData)); } if (!gotData) { // 完全读不到数据的情况下,取消注册读事件 readyKey.interestOps(readyKey.interestOps() & ~SelectionKey.OP_READ); } } /** * 处理写事件 */ private void handleWriteable(SelectionKey readyKey) throws IOException { SocketChannel socketChannel = (SocketChannel) readyKey.channel(); ByteBuffer attachBuff = (ByteBuffer) readyKey.attachment(); attachBuff.flip(); socketChannel.write(attachBuff); // 取消注册写事件 readyKey.interestOps(readyKey.interestOps() & ~SelectionKey.OP_WRITE); } /** * 开始服务 */ public void start() throws IOException { int selected = 0; while ((selected = selector.select()) > 0) { System.out.println("selected is " + selected); Iterator<SelectionKey> readyKeys = selector.selectedKeys().iterator(); while (readyKeys.hasNext()) { SelectionKey readyKey = readyKeys.next(); readyKeys.remove(); if (!readyKey.isValid()) { continue; } if (readyKey.isAcceptable()) { handleAcceptable(readyKey); } if (readyKey.isReadable()) { handleReadable(readyKey); } if (readyKey.isWritable()) { handleWriteable(readyKey); } } } } public static void main(String[] args) throws Exception { // 开始测试 new RepeatServer(false, 9876).start(); } }
相关推荐
01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-...23-Java NIO-Selector-示例代码(客户端).mp4 24
在"JAVA-NIO-DEMO"中,可能包含以下部分的示例代码: - **Channel读写**:演示如何使用FileChannel读取和写入文件,以及如何通过SocketChannel进行网络通信。 - **Buffer操作**:展示如何创建、填充、清空和读取...
基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...
基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络...
Java NIO (Non-blocking Input/Output) 是Java平台中用于高效处理I/O操作的一种机制,它与传统的IO模型( Blocking I/O)相比,提供了更高级别的抽象,允许应用程序以非阻塞的方式读写数据,提高了并发性能。...
赠送源代码:httpcore-nio-4.4.6-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.6-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.apache.httpcomponents,artifactId:httpcore-nio,...
三、Java语言基础教程-Java NIO流篇 [第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6...
标签“nio nio-socket java_nio java_实例 java.nio”进一步强调了这个实例与Java NIO、NIO套接字以及具体的代码实例相关。 压缩包内的文件“www.pudn.com.txt”可能是提供有关NIO的文档或者代码注释,而“nio”...
通过这本书和提供的源码,你可以深入了解Java NIO的工作原理,学习如何有效地利用直接缓冲区进行高性能的I/O操作,并通过实践来优化自己的代码。在实际项目中,合理运用这些知识可以显著提升Java应用的I/O性能。
赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.apache.httpcomponents,artifactId:httpcore-nio,...
java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...
赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档:httpcore-nio-4.4.10-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache....
赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档:httpcore-nio-4.4.10-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org....
赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:org.apache.httpcomponents,artifactId:...
Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO( Blocking I/O),NIO提供...通过理解和实践"java-NIO-demo",你将能够更好地掌握NIO的精髓,并在实际项目中发挥其优势。
JAVA服务器基于JAVA NIO I. 实现HTTP协议 II. 实现HTTPS协议 III. 实现FASTCGI协议(Client端) 运行HTTP/HTTPS服务器 运行开发包下jar文件 java -jar http-server-version-{version}.jar ...
在这个“基于java NIO的socket通信demo”中,我们将探讨如何使用NIO进行服务器和客户端的Socket通信,并解决通信过程中的字符集乱码问题。 首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端...
赠送源代码:httpcore-nio-4.4.5-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.5.pom; 包含翻译后的API文档:httpcore-nio-4.4.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache....
Java NIO(New IO)是一种基于通道(Channel)和缓冲区(Buffer)的I/O操作方法。它提供了与传统IO相同的接口,但是提供了非阻塞版本的IO操作。NIO的设计目标是通过使用较少的系统资源和高效的IO操作,来处理大量的...