非阻塞式 I/O 模型的工作原理【NIO】-2

 优化上一篇文上的代码。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;public class NonBlockingServer {public static void main(String[] args) throws IOException {// 创建 SelectorSelector selector = Selector.open();// 创建 ServerSocketChannel 并绑定端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);// 将 ServerSocketChannel 注册到 Selector 上,并指定监听事件为接受连接事件serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("Server started, listening on port 8080...");while (true) {// 阻塞等待事件发生selector.select();// 获取发生事件的 SelectionKey 集合Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();// 遍历处理事件while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();// 创建新线程处理事件new Thread(new EventHandler(key)).start();}}}// 处理事件的线程类static class EventHandler implements Runnable {private SelectionKey key;public EventHandler(SelectionKey key) {this.key = key;}@Overridepublic void run() {try {// 处理接受连接事件if (key.isAcceptable()) {ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel clientChannel = serverChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(key.selector(), SelectionKey.OP_READ);System.out.println("Client connected: " + clientChannel.getRemoteAddress());}// 处理读事件if (key.isReadable()) {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead != -1) {buffer.flip();byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes);String message = new String(bytes);System.out.println("Received message from client: " + message);// 原样返回给客户端clientChannel.write(ByteBuffer.wrap(bytes));} else {// 客户端关闭连接key.cancel();clientChannel.close();System.out.println("Client disconnected: " + clientChannel.getRemoteAddress());}}} catch (IOException e) {e.printStackTrace();}}}
}

在这个优化后的代码中,我们将处理事件的逻辑封装在 EventHandler 类中,并在遍历处理事件时创建新的线程来处理每个事件。这样可以实现并发处理不同连接的读写事件,提高系统的并发处理能力。

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

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

相关文章

JG/T 263-2010 建筑门窗用未增塑聚氯乙烯彩色型材检测

建筑门窗用未增塑聚氯乙烯彩色型材是指以未增塑聚氯乙烯型材为基材&#xff0c;以共挤、覆膜、涂装、通体着色工艺加工的建筑门窗用型材。 JG/T 263-2010建筑门窗用未增塑聚氯乙烯彩色型材检测项目 测试项目 测试标准 外观与颜色 JG/T 263 尺寸和偏差 JG/T 263 共挤层厚…

【c++leetcode】1382. Balance a Binary Search Tree

问题入口 DSW (DAY, STOUT & WARREN) ALGORITHM 时间复杂度O(n) class Solution { public:int makeVine(TreeNode* grand, int cnt 0){auto n grand->right;while (n ! nullptr){if(n->left ! nullptr){auto old_n n;n n->left;old_n->left n->righ…

服务器如何使用https 自签证书

前言 在使用自签名证书&#xff08;Self-Signed Certificate&#xff09;配置 HTTPS 的情况下&#xff0c;您可以按照以下步骤进行操作。请注意&#xff0c;自签名证书在生产环境中可能不是最佳选择&#xff0c;因为它们不受任何第三方信任机构的验证。在生产环境中&#xff0…

力扣hot100题解(python版18-21题)

18、矩阵置零 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。** 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例…

CSS常见选择器

CSS&#xff08;层叠样式表&#xff09;中包含了多种用于选择和定位HTML文档中元素的选择器&#xff0c;以便为这些元素应用样式。以下是CSS中常见的一些选择器及其详细解析&#xff1a; 1. 基础选择器 元素&#xff08;标签&#xff09;选择器&#xff1a; p {color: red; }这…

Stable Diffusion WebUI 折腾新篇章

原文&#xff1a;https://blog.iyatt.com/?p13123 1 前言 第一次玩 Stable Diffusion WebUI 是三十几天前&#xff0c;当时还在用四年半前&#xff08;大学前暑假&#xff09;买的轻薄本&#xff0c;而在半年前独显还坏了&#xff0c;所以是纯纯的用 CPU 折腾&#xff0c;刚…

【Android】View事件体系基础

文章目录 坐标系View滑动layout方法offserLeftAndRight() 和 offsetTopAndBottom()LayoutParams(布局参数)View动画scrollTo/scrollBy 解析Activity的构成 坐标系 分为Android坐标系和View坐标系 可以用 getWidth() 和 getHeight() 获取View自身的宽度和高度 对于ViewgetX() …

【c语言】内存函数

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 memcpy函数的使用和模拟实现 memcpy函数的使用 memcpy函数的模拟实现 memmove的使用和模拟实现 memmove的使用 memmove的模拟实现 memset函数的使用 memcmp函数…

pdf转word文档怎么转?分享4种转换方法

pdf转word文档怎么转&#xff1f;在日常工作中&#xff0c;我们经常遇到需要将PDF文件转换为Word文档的情况。无论是为了编辑、修改还是为了重新排版&#xff0c;将PDF转为Word都显得尤为重要。那么&#xff0c;PDF转Word文档怎么转呢&#xff1f;今天&#xff0c;就为大家分享…

pytest-fixture固件的使用

fixture 固件&#xff1a;pytest自动化中用于前后置&#xff0c;功能强大&#xff0c;可替代setup,teardown,setup_class,teardown_class 装饰器&#xff1a; pytest.fixture(scope"作用域“, params"参数化", autouse”自动执行“, ids”参数别名“, name"…

ubuntu中怎么搭建go语言环境?

在Ubuntu中搭建Go语言环境相对简单&#xff0c;以下是一些基本步骤&#xff1a; 下载Go语言包&#xff1a; 访问Go官方网站(https://golang.org/dl/)下载适合您系统的Go语言包。选择适合您系统架构的版本&#xff0c;一般选择最新的稳定版本即可。 安装Go语言&#xff1a; 解压…

唯品会API新篇章:为第三方开发者提供VIP商品详情服务

唯品会API的新篇章为第三方开发者带来了一个全新的机会&#xff0c;可以通过其提供的API接口获取VIP商品详情服务。这对于想要在电商领域进行创新的开发者来说&#xff0c;无疑是一个好消息。 下面是一个简单的示例&#xff0c;展示了如何使用唯品会API获取VIP商品详情&#x…

Java中web的css、js、img等静态资源引入详细操作教程

本篇文章主要讲解&#xff1a;Java中web的css、js、img等静态资源引入详细操作教程 日期&#xff1a;2024年2月27日 作者&#xff1a;任聪聪 java中web单体项目静态资源webjar引入形式说明 说明&#xff1a;通过webjar进行静态资源的导入&#xff0c;使用maven进行版本的管理。…

基于华为atlas的分类模型实战

分类模型选用基于imagenet训练的MobileNetV3模型&#xff0c;分类类别为1000类。 pytorch模型导出为onnx&#xff1a; 修改mobilenetv3.py中网络结构&#xff0c;模型选用MobileNetV3_Small模型&#xff0c;网络输出节点增加softmax层&#xff0c;将原始的return self.linear4…

postgressql和postgis安装

PostgreSQL安装 1 简 介 2 PostgreSQL优点特性 3 安装PostgreSQL 3.1 Yum安装 3.2 RPM包安装 3.3 源码安装 4 安装PostGIS 4.1 安装依赖 4.2 检查PostGIS是否安装成功 5 PostgreSQL多实例 PostgreSQL安装 1 简 介 PostgreSQL 是一种非常复杂的对象-关系型数…

【经验】vscode 鼠标拖曳不能选中整行文字,只能选中纵向矩形范围

1、问题描述 不知道昨天操作vscode设置界面时&#xff0c;误选择了啥&#xff0c;导致鼠标拖曳不能选中整行文字&#xff0c;只能选中纵向矩形范围&#xff0c;现象如下&#xff1a; 2、解决方法 1&#xff09;打开设置界面 点击左下角按键&#xff0c;选择“设置” 2&…

kubectl 命令行管理K8S(下)

目录 声明式资源管理方式 介绍 命令 修改yaml文件指定的资源 离线修改 在线修改 YAML 语法格式 查看 api 资源版本标签 编辑yaml配置清单生成资源 编写yaml文件 yaml创建Deployment yaml创建service服务对外提供访问并测试 yaml创建Pod 生成模板 pod模板 serivc…

Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)

Web服务器的配置与管理(Apachetomcat) 项目场景 公司业务经过长期发展&#xff0c;有了很大突破&#xff0c;已经实现盈利&#xff0c;现公司要求加强技术架构应用功能和安全性以及开始向企业应用、移动APP等领域延伸&#xff0c;此时原来开发web服务的php语言已经不适应新的…

leetcode:134.加油站

解题思路&#xff1a;需要注意开始时的编号&#xff0c;有的可以走一圈&#xff0c;有的走不了 模拟过程&#xff1a;for循环主要是用来模拟线性的过程&#xff0c;而在这里它是环状的&#xff1b; 可以用暴力解法&#xff0c;但是在这里我用贪心来解决。 常见疑惑&#xff1…

云呐智能化运维发展趋势是什么样?5g智能化矿山运维是什么

智能运维是近年来信息技术和自动化技术发展的一个新兴领域。未来&#xff0c;智能运维的技术演变方式可能包括以下几个方面: 数据驱动决策: 随着大数据技术的发展&#xff0c;智能运维将更加重视数据驱动的决策。通过对海量数据的实时分析和挖掘&#xff0c;我们可以发…