首页 > 编程语言 >使用Java实现NIO

使用Java实现NIO

时间:2023-11-13 15:44:57浏览次数:40  
标签:Java NIO java 实现 Selector client import selector ServerSocketChannel

以下是一个使用 Java NIO 实现 Reactor 模型的简单示例代码,并附有详细的注释:

 
import java.io.IOException;
import java.net.InetSocketAddress;
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 ReactorServer {
    public static void main(String[] args) throws IOException {
        // 创建 Selector 对象
        Selector selector = Selector.open();

        // 创建 ServerSocketChannel,并设置为非阻塞模式
        ServerSocketChannel serverSocket = ServerSocketChannel.open();
        serverSocket.bind(new InetSocketAddress("127.0.0.1", 8888));
        serverSocket.configureBlocking(false);

        // 注册 ServerSocketChannel 到 Selector,监听连接事件
        serverSocket.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            // 调用 select 方法阻塞等待事件发生
            selector.select();

            // 获取触发的事件集合
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();

                if (key.isAcceptable()) {
                    // 处理连接事件
                    ServerSocketChannel server = (ServerSocketChannel) key.channel();
                    SocketChannel client = server.accept();
                    client.configureBlocking(false);
                    client.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    // 处理读取事件
                    SocketChannel client = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = client.read(buffer);
                    if (bytesRead == -1) {
                        // 客户端关闭连接
                        client.close();
                    } else if (bytesRead > 0) {
                        // 读取数据并进行处理
                        buffer.flip();
                        byte[] data = new byte[buffer.remaining()];
                        buffer.get(data);
                        System.out.println("Received data: " + new String(data));
                        // 可以在这里添加业务逻辑处理
                        // ...
                    }
                }

                // 从触发的事件集合中移除当前事件
                keyIterator.remove();
            }
        }
    }
}

  

在这个示例中,我们使用了 Java NIO 的 Selector、ServerSocketChannel 和 SocketChannel 等组件实现了一个简单的 Reactor 服务器。主要的事件循环部分通过调用 selector.select() 阻塞等待事件发生,然后遍历处理触发的事件。

希望这段代码能够帮助你更好地了解在 Java 中如何使用 NIO 实现 Reactor 模型。如果你有任何疑问或需要进一步解释,请随时告诉我。

标签:Java,NIO,java,实现,Selector,client,import,selector,ServerSocketChannel
From: https://www.cnblogs.com/langjunnan/p/17829308.html

相关文章

  • 秦疆的Java课程笔记:26 基础 变量 常量 作用域
    变量就是可以变化的量。Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括:变量名,变量类型,作用域。注意事项:每个变量都有类型,类型可以是基本类型,也可以是引用类型。变量名必须是合法的标识符。变量声明是一条完整的语句,因此每一......
  • JavaScript使用JS从JSON获取信息并遍历输出到网页展示信息------前端
    遍历JSON获取数据<!DOCTYPEhtml><!--这是HTML的注释--><htmllang="en"id="myHtml"> <head> <!--这里不是设置了编码,而是告诉浏览器,用什么编码方式打开文件避免乱码--> <metacharset="UTF-8"> <metaname="viewport"......
  • JavaScript--tomcat的下载和使用
     tomcat的配置 项目打包经常打包成war包,war包放到webspps中可以自动解压 ......
  • java模拟PHP的pack和unpack类
    参考链接:https://www.xp.cn/b.php/69284.htmlimportjava.io.IOException;importjava.io.InputStream;publicclassPackUtil{/***打包字符串*类似php中pack在java中的实现**@paramstr*@return*/publicstaticbyte[......
  • Netty(四)NIO多线程优化
    Netty(四)NIO多线程优化​ 前面的代码都只有一个选择器,没有充分利用多核CPU,因此可以分两组选择器boss:单线程配一个选择器,专门处理accept事件,不负责数据的读写worker:创建CPU核心数的线程,每个线程配一个选择器,轮流处理read事件1多线程问题分析关键是这一部分的代码,需要保......
  • ubuntu arm64 配置静态IP 并实现VNC远程树梅派
    1.设置静态IP完成后ifconfig查看IPpingIP地址测试 ping192.168.10.1592.VNC远程树梅派树梅派VNC是server端,VNC版本是:RealVNC客户端:archubuntu18 一开始用gvncviewer连接,出现秒断开的问题,如下:$gvncviewer192.168.149.1ConnectedtoserverDisconnectedfromser......
  • Java核心知识体系6:集合框架详解
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解1集合框架图总览我们来简单解读下上面这个框架图:所有集合类都位于java.util包下Iterator是遍历集合的工具......
  • Java 小文件上传、大文件分片上传、断点续传、秒传的开发原理
    1、前言 文件上传在项目开发中再常见不过了,大多项目都会涉及到图片、音频、视频、文件的上传,通常简单的一个Form表单就可以上传小文件了,但是遇到大文件时比如1GB以上,或者用户网络比较慢时,简单的文件上传就不能适用了,用户辛苦传了好几十分钟,到最后发现上传失败,这样的系统用户体......
  • 饮水机如何实现低液位检测
    随着科技的不断发展,传感器在我们的日常生活和工作中发挥着越来越重要的作用。其中,光电液位传感器在饮水机中的应用,使得饮水机能够实现低液位检测,从而为用户提供更为便捷和智能的服务。光电液位传感器是一种非接触式传感器,它利用光线的反射原理来检测液位。当传感器发射一束光线时,如......
  • 揭秘 ChunJun:如何实现 e2e&session 日志隔离
    本文将从e2e的基本介绍,e2e的使用与扩展,session日志隔离三个维度为大家带来ChunJune2e&session日志隔离的分享。大量具体代码和演示请看视频教程⬇️视频课程:https://www.bilibili.com/video/BV1ru411P7oZ/?spm_id_from=333.999.0.0ChunJun为何选择e2e测试ChunJun项目是......