Java NIO:非阻塞IO,解锁高并发的秘密武器

在网络编程的世界里,I/O操作是至关重要的组成部分,但传统的阻塞式I/O模型却常常成为性能瓶颈。想象一下,当你在一台服务器上处理数千个并发连接时,每个连接都需要一个独立的线程来处理读写操作。这不仅消耗了大量的系统资源,还导致了严重的上下文切换开销。于是,Java NIO(Non-blocking I/O)应运而生,为我们带来了非阻塞I/O的解决方案,开启了高并发处理的新纪元。

第二部分:非阻塞I/O的实践案例

实例1:基于NIO的简单聊天服务器

我们将构建一个简单的聊天服务器,使用NIO的非阻塞模式接收来自多个客户端的消息并广播给所有在线用户。

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.HashSet;
import java.util.Set;
import java.util.Iterator;public class ChatServer {private static final int PORT = 8080;private static final ByteBuffer BUFFER_SIZE = ByteBuffer.allocate(1024);private static final Set<SocketChannel> clients = new HashSet<>();public static void main(String[] args) throws IOException {Selector selector = Selector.open();ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress(PORT));serverChannel.configureBlocking(false);serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Iterator<SelectionKey> it = selector.selectedKeys().iterator();while (it.hasNext()) {SelectionKey key = it.next();if (key.isAcceptable()) {acceptNewClient(serverChannel, selector);}if (key.isReadable()) {readFromClient((SocketChannel) key.channel());}it.remove();}}}private static void acceptNewClient(ServerSocketChannel serverChannel, Selector selector) throws IOException {SocketChannel client = serverChannel.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);clients.add(client);}private static void readFromClient(SocketChannel client) throws IOException {BUFFER_SIZE.clear();int bytesRead = client.read(BUFFER_SIZE);if (bytesRead == -1) {clients.remove(client);client.close();} else {BUFFER_SIZE.flip();byte[] data = new byte[BUFFER_SIZE.limit()];BUFFER_SIZE.get(data);String message = new String(data).trim();System.out.println("Received: " + message);broadcastToAll(message, client);BUFFER_SIZE.clear();}}private static void broadcastToAll(String message, SocketChannel sender) throws IOException {for (SocketChannel client : clients) {if (client != sender) {ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());client.write(buffer);}}}
}

在这个例子中,我们首先创建了一个Selector并打开了一个ServerSocketChannel,将其绑定到一个端口上。然后,我们在一个无限循环中使用Selector来监听新连接和已连接客户端的可读事件。当有新的客户端连接时,我们接受这个连接并将SocketChannel注册到Selector上,设置其为非阻塞模式。当SocketChannel上有可读事件时,我们读取数据并广播给所有其他在线的客户端。

实例2:文件复制

下面是一个使用NIO进行文件复制的例子,展示如何使用FileChannelByteBuffer进行高效的数据传输。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.channels.FileChannel;public class FileCopier {public static void main(String[] args) {String sourcePath = "source.txt";String destPath = "destination.txt";try (FileChannel inChannel = FileChannel.open(Paths.get(sourcePath), StandardOpenOption.READ);FileChannel outChannel = FileChannel.open(Paths.get(destPath), StandardOpenOption.WRITE,StandardOpenOption.CREATE_NEW,StandardOpenOption.TRUNCATE_EXISTING)) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (inChannel.read(buffer) > 0) {buffer.flip();outChannel.write(buffer);buffer.clear();}} catch (IOException e) {e.printStackTrace();}}
}

在上述代码中,我们首先打开源文件和目标文件的FileChannel,然后使用一个ByteBuffer作为中介来读取和写入数据。FileChannelread()write()方法分别用于填充ByteBuffer和清空它,从而实现了数据的高效传输。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388266.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络必会面经

1.键入网址到网页显示&#xff0c;期间发生了什么 2.在TCP/IP网络模型中。TCP将数据进行分段后&#xff0c;为什么还需要IP层继续分片 3.详细说明tcp三次握手&#xff0c;为什么是三次&#xff0c;若每次握手丢了&#xff0c;解决办法是什么 4.详细说明tcp四次挥手&#xff…

【Python】python基础

本篇文章将讲解以下知识点&#xff1a; &#xff08;1&#xff09;循环语句 &#xff08;2&#xff09;字符串格式化 &#xff08;3&#xff09;运算符 一&#xff1a;循环语句 循环语句有两种&#xff1a;while for 本篇文章只讲解while循环 格式&#xff1a; whil…

Unity材质球自动遍历所需贴图

Unity材质球自动遍历所需贴图 文章目录 Unity材质球自动遍历所需贴图一、原理二、用法1.代码&#xff1a;2.使用方法 一、原理 例如一个材质球名为&#xff1a;Decal_Text_Cranes_01_Mat &#xff0c; 然后从全局遍历出&#xff1a;Decal_Text_Cranes_01_Albedo赋值给材质球的…

【网络基础】初识网络 {计算机网络背景;网络协议初识;网络传输基本流程;网络中的地址管理;网络设备简单介绍}

一、计算机网络背景 1.1 网络发展 计算机网络的发展可以追溯到20世纪60年代&#xff0c;那时候最初的计算机网络只是为了让科学家们能够共享计算机资源和数据。但是在20世纪80年代&#xff0c;互联网的出现彻底改变了计算机网络的面貌&#xff0c;使得人们可以随时随地通过互…

AI剪辑短视频以及账号管理矩阵工具系统搭建开发

目录 前言 一、系统有哪些功能&#xff1f; 二、怎么开发 前言 通过AI剪辑短视频以及生成短视频&#xff0c;以及对自媒体账号的管理功能的功能进行开发。这款系统能够批量混合剪辑视频然后一键发布到绑定好的自媒体账号里面。 一、系统有哪些功能&#xff1f; 1.AI智能文…

【深度学习实战(49)】目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度&#xff0c;损失函数越小&#xff0c;通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段&#xff0c;如果我们想让预测值无限接近于真实值&#xff0c;就需要将损失值降到最低…

深入探讨RCE漏洞及其防御策略

1. RCE漏洞 1.1. 漏洞原理 远程代码执行&#xff08;RCE&#xff09;漏洞允许攻击者远程注入并执行操作系统命令或代码&#xff0c;从而控制后台系统。 1.2. 漏洞产生条件 调用第三方组件存在代码执行漏洞。用户输入内容作为系统命令参数拼接到命令中。对用户输入的过滤不严…

汽车雷达系统集成

汽车雷达系统集成是实现高级驾驶辅助系统&#xff08;ADAS&#xff09;和自动驾驶功能的重要环节&#xff0c;它涉及多种硬件和软件的协同工作。以下将详细讲解汽车雷达系统集成的各个方面&#xff1a; 雷达传感器选择 毫米波雷达&#xff1a;毫米波雷达主要使用24GHz和77GHz频…

【SQL Server点滴积累】SQL Server 2016数据库邮件(Database Mail)功能故障的解决方法

今天和大家分享SQL Server 2016数据库邮件(Database Mail)功能故障的解决方法 故障现象&#xff1a; 在SQL Server 2016中配置完成数据库邮件(Database Mail)功能后&#xff0c;当你尝试发送测试邮件后&#xff0c;既收不到测试邮件&#xff0c;也不显示错误消息 KB3186435 -…

Windows + Ubuntu双系统!小白轻松安装

前言 这几天有小伙伴想着装WindowsUbuntu双系统&#xff0c;但苦于找不到办法&#xff0c;就在某篇文章后台留言&#xff1a; 这不&#xff0c;今天就更新了嘛&#xff01;虽然做不到有求必应&#xff0c;但教程帖还是可以写写的&#xff0c;能帮一个是一个&#xff01; 今天要…

FFmpeg:多媒体处理的瑞士军刀

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境&#xff0c;比较麻烦&#xff0c;总结了使用docker安装方法&#xff0c;并提供docker镜像。 1.docker镜像 见我上传的docker镜像&#xff1a;https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …

Portainer-CE(可视化工具)一键部署+中文版

目录 Portainer 的主要功能 安装官方版2.19.5 安装中文版 2.19.5 安装中文版2.11.0 Portainer 是一个开源的图形化管理工具&#xff0c;用于管理 Docker 容器、Swarm 集群和 Kubernetes 集群。它提供了一个用户友好的 Web 界面&#xff0c;可以帮助用户更轻松地管理和监控…

[数据结构] AVL树 模拟实现AVL树

标题&#xff1a;[数据结构] AVL树 && 模拟实现AVL树 水墨不写bug 正文开始&#xff1a; 目录 &#xff08;一&#xff09;普通二叉搜索树的痛点 &#xff08;二&#xff09;AVL树简介 &#xff08;1&#xff09;AVL树的概念 &#xff08;三&#xff09;AVL树的…

《程序猿入职必会(5) · CURD 页面细节规范 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

为 Laravel 提供生产模式下的容器化环境:打造现代开发环境的终极指南

为 Laravel 提供生产模式下的容器化环境&#xff1a;打造现代开发环境的终极指南 在现代开发中&#xff0c;容器化已经成为一种趋势。使用 Docker 可以让我们轻松地管理和部署应用程序。本文将带你一步步构建一个高效的 Laravel 容器化环境&#xff0c;确保你的应用程序在开发…

一些Kafka面试题

Kafka是如何保证消息不丢失&#xff1f; 1.生产者发送消息到Broker丢失&#xff1a; 设置异步发送&#xff1a;发送失败则使用回调进行记录或者重发 消息重试&#xff1a;参数配置&#xff0c;可以设置重试次数 2.消息在broker中存储丢失 发送确认机制acks acks0&#xf…

谷粒商城实战笔记-MySQL踩坑记录

文章目录 1&#xff0c; Public Key Retrieval is not allowed问题描述解决办法 2&#xff0c;1044 -Access denied for user root% to database解决方案 1&#xff0c; Public Key Retrieval is not allowed 问题描述 打开DBeaver连接MySQL提示“Public Key Retrieval is no…

4款免费且安全:常用的PDF转Word在线转换工具推荐

现在办公越来越离不开电脑了&#xff0c;PDF文件和Word文档来回转换的需求也越来越大。作为一个天天跟文件打交道的上班族&#xff0c;我特别明白找个好用、靠谱的PDF转Word在线转换工具有多重要。今儿个&#xff0c;给大家说说五个免费的转换工具&#xff0c;都是我试过觉得挺…

多微信管理不再难:聚合聊天神器助你轻松应对!

在当今社交媒体高度发达的时代&#xff0c;很多人都在使用多个微信账号来管理个人与工作联系。面对如此众多的信息沟通&#xff0c;如何高效管理成了一个难题。 幸运的是&#xff0c;聚合聊天神器的出现&#xff0c;彻底改变了这一局面&#xff0c;让我们轻松应对多微信账号的…