7.阻塞模式与非阻塞模式
1.阻塞模式
一个线程来处理多个连接显得力不从心
accept等待连接 是一个阻塞方法
read读取SocketChannel中的数据 是一个阻塞方法
/*** 服务端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer byteBuffer = ByteBuffer.allocateDirect(16);//创建一个服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//给服务器绑定一个端口8000,让客户端来连接serverSocketChannel.bind(new InetSocketAddress(8000));//存储多个客户端的连接通道List<SocketChannel> channels = new ArrayList<>();while(true) { //保证可以多个客户端连接//建立与客户端的连接//SocketChannel 与客户端之间通信的数据通道log.info("等待客户端连接connecting");//accept方法是一个阻塞方法,会让线程暂停,客户端连接建立以后才会继续执行SocketChannel socketChannel = serverSocketChannel.accept();log.info("已连接connected...{}", socketChannel);channels.add(socketChannel);for (SocketChannel sc: channels ) {//接受客户端发送的数据log.info("等待客户端向SocketChannel中传输数据...{}", sc);//read方法是一个阻塞方法,会让线程暂停sc.read(byteBuffer);byteBuffer.flip();//读模式String byteBufferContent = StandardCharsets.UTF_8.decode(byteBuffer).toString();log.info("byteBufferContent={}", byteBufferContent);byteBuffer.clear();//写模式,从0开始log.info("读完毕..{}", sc);}}}
/*** 客户端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {SocketChannel socketChannel = SocketChannel.open();//连接服务端,地址localhost:8000socketChannel.connect(new InetSocketAddress("localhost", 8000));//将hello字符串->byte[]->ByteBuffer->socketChannelsocketChannel.write(StandardCharsets.UTF_8.encode("hello"));System.out.println("waiting...");}
2.非阻塞模式
/*** 服务端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer byteBuffer = ByteBuffer.allocateDirect(16);//创建一个服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//****ServerSocketChannel配置为非阻塞-默认是阻塞true,可以让accept方法变成非阻塞serverSocketChannel.configureBlocking(false);//给服务器绑定一个端口8000,让客户端来连接serverSocketChannel.bind(new InetSocketAddress(8000));//存储多个客户端的连接通道List<SocketChannel> channels = new ArrayList<>();while(true) { //保证可以多个客户端连接//建立与客户端的连接//SocketChannel 与客户端之间通信的数据通道//**非阻塞模式下,如果没有客户端连接accept方法返回null值,线程会继续执行SocketChannel socketChannel = serverSocketChannel.accept();if(null != socketChannel) {log.info("已连接connected...{}", socketChannel);channels.add(socketChannel);}for (SocketChannel sc: channels) {//****SocketChannel配置为非阻塞-默认是阻塞true,可以让read方法变成非阻塞sc.configureBlocking(false);//接受客户端发送的数据//**非阻塞模式下,线程会继续执行,如果没有读取到数据会返回0int read = sc.read(byteBuffer);if(read > 0) {byteBuffer.flip();//读模式String byteBufferContent = StandardCharsets.UTF_8.decode(byteBuffer).toString();log.info("byteBufferContent={}", byteBufferContent);byteBuffer.clear();//写模式,从0开始log.info("读完毕..{}", sc);}}}}
问题:非阻塞模式,会让线程一直在跑,太忙了,不能这么用。参考后续的Selector用法。
相关文章:
7.阻塞模式与非阻塞模式
1.阻塞模式 一个线程来处理多个连接显得力不从心 accept等待连接 是一个阻塞方法 read读取SocketChannel中的数据 是一个阻塞方法 /*** 服务端* param args* throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer b…...
Unity类银河恶魔城学习记录11-10 p112 Items drop源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…...
EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格
xls文件: 后端代码: InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…...
炫我科技:云渲染领域的佼佼者
随着数字化时代的来临,云渲染技术正逐渐成为影视、游戏、动画等创意产业的重要支柱。在这一领域中,炫我科技凭借其卓越的技术实力、优质的服务以及不断创新的精神,已然成为了云渲染行业的佼佼者。 炫我科技自成立之初,便以打造高…...
VsCode正确解决vue3+Eslint+prettier+Vetur的配置冲突
手把手教你VsCode正确解决vue3EslintprettierVetur的配置冲突 VsCode正确解决vue3EslintprettierVetur的配置冲突Eslint文档查看和修改规则:step1:首先快速浏览下规则简要setp2: ctrlF 搜索你要配置规则的英文名,例如attributesetp3: 修改配置…...
计算机网络—VLAN 间路由配置
目录 1.拓扑图 2.实验环境准备 3.为 R3 配置 IP 地址 4.创建 VLAN 5.配置 R2 上的子接口实现 VLAN 间路由 6.配置文件 1.拓扑图 2.实验环境准备 配置R1、R3和S1的设备名称,并按照拓扑图配置R1的G0/0/1接口的IP地址。 [Huawei]sysname R1 [R1]interface Giga…...
微服务篇-C 深入理解第一代微服务(SpringCloud)_VII 深入理解Swagger接口文档可视化管理工具
原创作者:田超凡(程序员田宝宝) 版权所有,引用请注明原作者,严禁复制转载 Part 1 理论部分 1 传统API接口文档存在的问题? 1 对API接口文档进行更新的时候,需要及时将变化通知前端开发人员&…...
区块链的应用领域:重塑未来的信任机制
区块链作为一种新兴的技术,正在逐渐改变我们的生活。它以其独特的优势,正在开启一个信任的新时代。在金融、供应链管理、医疗健康、教育、文化娱乐、房地产等众多领域,区块链已经崭露头角,以其独特的方式发挥着作用。 1.金融领域…...
怎么在循环List的时候删除List的元素
怎么在循环List的时候删除List的元素 1. 先给出结论 任何时候都不要在 for 循环中删除 List 集合元素 2. 为什么在 for 循环中删除 List 集合元素是错误的 在 for 循环中删除 List 集合元素的问题主要是因为循环的迭代器和 List 集合的元素索引之间的冲突。在使用 for 循环遍历…...
SpringBoot+thymeleaf完成视频记忆播放功能
一、背景 1)客户要做一个视频播放功能,要求是系统能够记录观看人员在看视频时能够记录看到了哪个位置,在下次观看视频的时候能够从该位置进行播放。 2)同时,也要能够记录是谁看了视频,看了百分之多少。 说明:由于时间关系和篇幅原因,我们这里只先讨论第一个要求,第…...
ES 7.12官网阅读-ILM(index lifecycle management)
官网文档:ILM: Manage the index lifecycle | Elasticsearch Guide [7.12] | Elastic ILM:管理 index 的生命周期 可以根据你的性能、弹性、保存时长需求,使用ILM策略来自动管理你的index;比如 1. 当一个index达到确定的大小&a…...
Jenkins执行策略(图文讲解)
Jenkins执行策略-图文讲解 一:手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…...
1,static 关键字.Java
目录 1.概述 2.定义格式和使用 2.1 静态变量及其访问 2.2 实例变量及其访问 2.3 静态方法及其访问 2.4 实例方法及其访问 3.小结 1.概述 static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。被static修饰后的ÿ…...
网络语义实体对齐(Entity Alignment)相关论文与数据集整理
传统的实体对齐方法主要通过属性相似度匹配的方式实现,利用有监督学习的机器学习模型,如:决策树、支持向量机、集成学习等。依赖实体的属性信息,通过属性相似度,进行跨平台实体对齐关系的推断。基于知识表示学习的方法通过将知识图谱中的实体和关系都映射低维空间向量,直…...
【自动装箱以及包装类的缓存】⭐️通过具体案例看下每种包装类的不同结果
目录 前言 一、自动装箱与拆箱(以 Integer 包装类为例) 二、再来看看几个示例 三、Double ,Float 类型亦是如此吗? 四、补充 前言 小伙伴们大家好,日常使用业务层方面的代码居多,但也不可忘了基本的一些代码格式…...
Java(内部类)
1.内部类 内的五大成员:属性、方法、构造方法、代码块、内部类 解释:在一个类的里面,再定义一个类。举例:在A类的内部定义B类,B类就被称为内部类注意:内部类表示的事物是外部类的一部分,内部类单独出现没…...
c++对象指针
对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象,也可以用new运算符动态建立堆对象。 定义对象指针的格式为: 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为:…...
js 拼接HTML时 onclick方法和传参报错[onject Object] 和 unexpected end of input`
Vue js拼接onclick事件 1.onclick 方法函数找不到2.方法中传参2.1 int 类型传参(直接传参)2.2 字符串类型(需要加引号)2.3 对象(对象是不能直接拼接的。拼接的必须是字符串。因此需要将对象转成字符串。) 1…...
基于springboot实现定时任务,并且添加Event事件处理机制
1、基于Spring-Event增加事件处理机制 import org.bson.Document; import org.springframework.context.ApplicationEvent;/*** 基于Spring-Event增加事件处理机制* create: 2024/4/1-13:33*/ public class SysProductConfigEvent extends ApplicationEvent {// 数据配置priv…...
深入理解数据结构(1):复杂度详解
文章主题:复杂度详解🌱所属专栏:深入理解数据结构📘作者简介:更新有关深入理解数据结构知识的博主一枚,记录分享自己对数据结构的深入解读。😄个人主页:[₽]的个人主页🔥…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
