package com.java.nio.study; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; 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 NioServer { // 选择器 private Selector selector; private ByteBuffer byteBuffer=ByteBuffer.allocate(2014); //nio服务端 public NioServer(int port) throws Exception { selector=Selector.open(); // 打开一个选择器 选择器能够监听是否有感兴趣的事情发生 ServerSocketChannel serverSocketChannel=ServerSocketChannel.open(); ServerSocket serverSocket=serverSocketChannel.socket(); InetSocketAddress inetSocketAddress=new InetSocketAddress(port); serverSocket.bind(inetSocketAddress); serverSocketChannel.configureBlocking(false); // 非阻塞 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 注册感兴趣的事件 System.out.println("--server --- start----"); } // 启动nio服务的监听处理 public void start() throws Exception { while(true) { // int selects=selector.select(); // 没有敢兴趣的事件 阻塞 --》有那么selects > 0 if(selects <= 0) { continue; } Set<SelectionKey> selectionKeys=selector.selectedKeys(); // 获取已经选择器集合 Iterator<SelectionKey> it=selectionKeys.iterator(); while(it.hasNext()) { SelectionKey selectionKey=it.next(); handle(selectionKey); //处理 ,路由操作 it.remove(); } } } private void handle(SelectionKey selectionKey) throws Exception { if(selectionKey.isAcceptable()) { // 已经准备了Accept ServerSocketChannel serverSocketChannel=(ServerSocketChannel)selectionKey.channel(); SocketChannel socketChannel=serverSocketChannel.accept(); // accept这个socket socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); // 注册read感兴趣事件 System.out.println("---- register read-----"); } else if(selectionKey.isReadable()) { System.out.println("----- is read----"); readBuffer(selectionKey); } else if(selectionKey.isWritable()) { System.out.println("------ is write-----"); SocketChannel socketChannel=(SocketChannel)selectionKey.channel(); byteBuffer.clear(); byteBuffer.put("hello ljq--".getBytes()); byteBuffer.flip(); socketChannel.write(byteBuffer); System.out.println("--write to client --"); } } private void readBuffer(SelectionKey selectionKey) throws Exception { SocketChannel socketChannel=(SocketChannel)selectionKey.channel(); int size=socketChannel.read(byteBuffer); if(size > 0) { byteBuffer.flip(); socketChannel.write(byteBuffer); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_WRITE); byteBuffer.clear(); } else { socketChannel.close(); } } public static void main(String[] args) { try { NioServer nioServer=new NioServer(9999); nioServer.start(); } catch(Exception e) { e.printStackTrace(); } } }
package com.java.nio.study; import java.io.InputStream; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; public class NioClient extends Thread { private Socket socket; private PrintWriter out; private InputStream input; public NioClient(int port) throws Exception { socket=new Socket(); socket.connect(new InetSocketAddress(port)); out=new PrintWriter(socket.getOutputStream()); input=socket.getInputStream(); } @Override public void run() { while(true) { try { Thread.sleep(3000); System.out.println("-------run---------"); out.print("---send to nio server--"); out.flush(); int size=input.available(); if(size > 0) { byte[] bytes=new byte[size]; input.read(bytes); System.out.println("reive = " + new String(bytes)); } } catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { try { NioClient client=new NioClient(9999); client.start(); } catch(Exception e) { e.printStackTrace(); } } }
相关推荐
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...
本文将深入探讨Java NIO与IO的性能测试,并通过代码实例来展示它们之间的差异。 首先,我们来看传统的Java IO模型。IO模型基于流,数据是从输入流到输出流的单向传输。例如,`FileInputStream`和`FileOutputStream`...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为New Input/Output,是对传统IO API的扩展。它提供了一种更高效、更具选择性的IO操作方式,尤其适用于高并发和大数据处理场景。在这个“java nio 聊天室...
在性能对比测试中,实验结果表明,基于NIO的新服务器模型在处理高并发时,平均响应时间仅为2.09毫秒,且CPU占用率保持在68.5%的较低水平。与之相比,传统IO服务器模型在处理并发流量时,不仅性能上无法达到新模型的...
至于文件列表中的"SwitchyOmega_Chromium.crx",这看起来像是一个Chrome浏览器的扩展文件,与Java NIO并不直接相关,可能是用于辅助测试或监控网络通信的工具。而"channel"这个文件名没有具体扩展名,可能是代码、...
经过我2个月的深入学习,反复修改测试,开发出一个已经能稳定使用的端口代理程序,源代码没有应用所有nio知识,但比较全面的覆盖了nio编程中需要注意的几点,如果有什么问题,可以联系我:gypzfabc@126.com
对java io总结时编写的测试代码,包括BIO,NIO,AIO的实现,Java io操作是编程人员经常使用到的,以前只是使用没有对这三种IO做系统的了解,本文将对这三种IO作详细的介绍并附有测试完整代码
Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...
在IntelliJ IDEA中,开发者可以方便地使用Java IO和NIO编写和测试相关的代码。IDE提供了强大的代码补全、调试和测试工具,使得开发过程更加高效。对于Java IO,IntelliJ IDEA会自动处理流的关闭,对于NIO,它也提供...
在Java网络编程中,`ServerBootstrap` 是一个用于构建高性能异步网络应用的工具,它主要用在NIO(Non-blocking I/O)模式下。NIO(非阻塞I/O)是Java提供的一种I/O模型,它允许一个线程处理多个输入/输出流,与传统...
使用JMH的Java NIO回显服务器的基准测试 基准测试针对各种服务器运行相同的客户端代码。 客户 客户端主程序是nio.JMHClientMain,具有可选参数: thread = 确定初始化的客户端数(默认为1) cycle = 如果为true,...
鹊桥,又称为MagpieBridge,是一款基于Java的内网穿透工具,利用先进的异步I/O模型(AIO/NIO)来实现高效的网络通信。它为开发者提供了在内网环境中进行开发并允许外部进行调试的强大功能,对于远程协作、云服务测试...
Java JRE7引入了NIO.2(New I/O 2)框架,显著改进了对文件系统操作的支持,其中最重要的增强之一就是引入了WatchService服务。这个服务允许程序以一种高效且优雅的方式监控文件或目录的变化,而无需像JRE6之前那样...
然而,NIO的编程模型相对复杂,需要更精确的控制并发状态,因此在实际应用中需要谨慎设计和测试。在Java 7及以后的版本中,还引入了NIO.2,提供了更高级别的文件系统访问接口,使得NIO更加易用和强大。
《基于Java NIO实现五子棋游戏》是一个适合学习与实践的Java开发项目,它将游戏编程与非阻塞I/O(NIO)技术相结合,为开发者提供了丰富的学习素材。以下将详细介绍该项目涉及的主要知识点: 1. **Java基础知识**:...
/** 测试文件下载的NIOServer */ public class NIOServer { static int BLOCK = 4096; // 每次发送的数据块大小 // 处理与客户端的交互 public class HandleClient implements Runnable { // ... } public ...
《网络通信测试与Java NIO Socket编程详解》 在信息技术高速发展的今天,网络通信成为了软件开发中的重要一环。为了确保网络应用的稳定性和效率,网络通信测试工具扮演了不可或缺的角色。"默蓝网络通信测试工具(NIO...
描述中的"java nio 服务器范例及j2me代码连接服务器的测试代码"暗示了这个压缩包中包含了实现NIO服务器的Java代码和J2ME客户端的源代码,用于测试客户端如何与NIO服务器进行通信。这可能是通过创建一个简单的TCP连接...
创建10000个客户端连接的类,您可以在nio服务器上测试负载。 监视服务API的简单用法。 监视预定义目录中的更改的类。 您可以播放生成的jar文件。 请按照以下步骤操作: 运行maven命令:“ mvn clean install”...