BIO 探究二

接上文 BIO 初探究

文章目录

  • 前言
  • 一、使用netty
  • 二、nio 客户端 与 bio 服务端,bio 服务端 与 nio 客户端
  • 总结
  • # 未完待续


前言

提示:验证阻塞到底阻塞在什么地方


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用netty

上文猜想 bio 的阻塞是阻塞在server 端的 while ((len = inputStream.read(content)) != -1) 这行代码上,本文就验证下,验证方案如下

  • 实现一个NIO 服务器
  • 使用多个BIO 客户端连接 NIO 服务器
  • 查看结果

netty 服务端


import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;import java.net.InetSocketAddress;public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup boss = new NioEventLoopGroup(1);// 处理连接数线程设置为1EventLoopGroup worker = new NioEventLoopGroup(1);try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(boss, worker).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(9090)) //配置监听本地端口.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast("handler", new GenerallyServerHandler()); //2.4 加入自定义业务逻辑ChannelHandler} //2.3 初始化channel的时候,配置Handler)}).option(ChannelOption.SO_BACKLOG, 128) //(5).childOption(ChannelOption.SO_KEEPALIVE, true);ChannelFuture portFuture = bootstrap.bind().sync();System.out.println("netty server started...");// 不加这行代码 服务启动一会就关闭了portFuture.channel().closeFuture().sync();} finally {boss.shutdownGracefully().sync();worker.shutdownGracefully().sync();}}}

处理器

package com.microsoft.samples.nexo.openprotocol.demo.nio;import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;public class GenerallyServerHandler extends SimpleChannelInboundHandler {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf = (ByteBuf) msg;System.out.println("rev: " + buf.toString(CharsetUtil.UTF_8));}
}

使用上文的 TestClient 多个 bio 客户端验证
结果:收到了所有的客户端发来的值
在这里插入图片描述
结论:BIO 的阻塞 在于 io 流的阻塞, 一个网络 io 流 需要一个线程,在流没有结束前,需要当前线程一直阻塞,
问题来了:目前看到的阻塞 都是在这个服务端的 while ((len = inputStream.read(content)) != -1) 这段 代码里边;
我们如果去除掉这行代码呢?
执行结果: 每个客户端发送的消息都收到了,但是只收到了 一条消息(上文的客户端每个都发了两条消息),这样看来阻塞似乎是我们编码上人为的原因造成的阻塞;
或者说网上所谓说的 bio 阻塞 是否也包含 while ((len = inputStream.read(content)) != -1) 这行代码? 有清楚的大佬 麻烦点一点;

二、nio 客户端 与 bio 服务端,bio 服务端 与 nio 客户端


总结

# 未完待续

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

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

相关文章

当企业越来越难做,精益变革能带来什么改变?

随着技术的不断进步和消费者需求的日益多样化&#xff0c;传统的管理模式和生产方式已经难以适应时代的发展。越来越多的企业开始陷入困境&#xff0c;难以在激烈的市场竞争中立足。然而&#xff0c;正是在这样的背景下&#xff0c;精益变革应运而生&#xff0c;为企业带来了前…

使用html2canvas和jspdf导出pdf包含跨页以及页脚

首先要下载两个文件&#xff0c;一个为html2canvas.min.js&#xff0c;另一个是jspdf.umd.min.js这两个文件分别下载的地址我也附录上&#xff0c;都在官网git&#xff1a; html2canvas.min.js: https://html2canvas.hertzen.com/dist/html2canvas.min.js jspdf.umd.min.js: …

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

一、704. 二分查找 题目链接&#xff1a;https://leetcode.cn/problems/binary-search/description/ 文章讲解&#xff1a;https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1fA4y1o715 1.…

感染恶意代码之后怎么办?

隔离设备 立即将感染设备与网络隔离&#xff0c;断开与互联网和其他设备的连接。这可以防止恶意代码进一步传播到其他设备&#xff0c;并减少对网络安全的威胁。 确认感染 确认设备是否真的感染了恶意代码。这可能需要使用安全软件进行全面扫描&#xff0c;以检测和识别任何已…

前端实现大文件分片并行上传、断点续传、秒传(完整解析)

一、总体流程图 二、具体步骤 简单理解&#xff1a;前端先将文件切割多份&#xff0c;在进行上传&#xff0c;由后端进行切片合并操作。 具体逻辑&#xff1a; 1. 前端选中上传文件&#xff08;如果是批量上传就把选中的文件存入选中文件列表数组中&#xff0c;后续在遍历上…

【Vue3-Element-Admin 动态路由】涉及到的配置

Vue3-Element-Admin 动态路由 涉及到的配置 0. Vue3-Element-Admin 项目地址1. router/index.ts2. Mock接口模拟数据3. store/permission4. api/menu5. plugins/permission 这篇文章讲的主要是 Vue3-Element-Admin 差不多内置的动态路由配置 (根据后端接口渲染) 先把开发环境&a…

纷享销客一体化BI智能分析平台介绍

纷享销客BI智能分析平台是一款自助式敏捷BI&#xff0c;无缝继承纷享销客PaaS平台的对象数据、对象关系、功能权限体系与数据权限体系&#xff0c;用户通过简单的拖拽点选即可实现灵活定义分析模型和可视化自助分析&#xff0c;零技术门槛快速上手&#xff0c;面向全员各类角色…

深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)

stanford cs231 编程作业之SVM分类器 写在最前面&#xff1a; 深度学习&#xff0c;或者是广义上的任何学习&#xff0c;都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论&#xff0c;越往后学越觉得没什么。但听的云里雾里的地方也越来越多…

Python教程-快速入门基础必看课程10-函数基础

该视频主要讲述了Python中函数的定义、使用和返回。函数是Python中一个重要的概念&#xff0c;可以用来封装一段可重复使用的代码&#xff0c;并通过函数名来调用它。在Python中&#xff0c;定义函数的关键字是def&#xff0c;后面跟着函数名和括号。函数可以没有参数&#xff…

【学习笔记】MySQL(Ⅰ)

MySQL(Ⅰ) 1、 介绍 1.1、概述 1.2、MySQL 的优缺点 1.4、关系型数据库模型2、 基础篇 —— SQL(结构化查询语言) 2.1、通用语法 2.2、SQL 语句的分类 2.3、DDL 语句 2.3.1 数据库结构相关的语法 2.3.2 数据表相关的语…

Java实现俄罗斯方块游戏源代码(启动即可玩)

这是一个用Java Swing实现的俄罗斯方块游戏&#xff0c;具有经典的游戏机制和图形界面。游戏中&#xff0c;玩家需要旋转和移动不断下落的方块&#xff0c;使其填满一行来消除该行并得分。 该项目适合学习Java GUI编程、游戏开发基础以及面向对象编程&#xff08;OOP&#xff0…

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习 C 的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#xff0c;在某个时间点&#xff0c;两个平行宇宙…

【Angew】:催化材料中贵金属的最大效率-原子分散表面铂

图形摘要&#xff1a;通过在纳米结构 CeO2的 {100}“纳米袋”中稳定表面 Pt2物种&#xff08;见图&#xff09; &#xff0c;可以制备具有最高贵金属分散度的Pt-CeO2材料。此类材料可以大大减少催化剂所需的贵金属量。 摘要&#xff1a;贵金属Pt是催化领域用途最广泛的元素&am…

【JS】JS高阶函数——reduce()用法详解总结。你不得不知道的数组reduce高级用法!

reduce用法详解总结 1.reduce语法说明1.1 方法介绍1.2 参数说明1.3 执行机制1.4 简单示例&#xff1a;数组求和 2. 高级用法2.1 权重求和2.2 代替some和every2.3 数组扁平2.4 数组去重2.5 字符统计和单词统计2.6 数组成员特性分组2.7 数字千分化 reduce函数是一个神奇的函数 1.…

LatexEasy:数学排版神器,你值得拥有!

&#x1f31f; 还在为复杂的数学公式排版而烦恼吗&#xff1f;LatexEasy来帮你解决烦恼&#xff01;&#x1f31f; &#x1f4da; 作为一名科研狗或者学术爱好者&#xff0c;你一定知道LaTeX在数学排版中的强大功能。但LaTeX的语法对于初学者来说&#xff0c;总是有些令人望而…

编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(竞赛小魔法:万能头文件加速)

如果看到这里的各位是想要参加竞赛&#xff0c;那么接下来一点一些小魔法大家可以修炼一下下。 万能头文件 在那遥远的编程王国&#xff0c;藏着一件传说中的秘宝——bits/stdc.h&#xff0c;这不仅仅是一块普通的头文件石碑&#xff0c;它是C语言魔法的集大成者&#xff0c;…

C++ Qt实现http url启动本地应用程序

更多Qt文章,请访问《深入浅出C++ Qt开发技术专栏》:https://blog.csdn.net/yao_hou/category_9276099.html 我们在使用腾讯会议时经常会通过http链接打开本地的腾讯会议,例如下图: 打开会议发起人给的链接,会出现一个网页,然后点击加入会议就会启动本地的腾讯会议,本篇…

面向小白的 Spark MLlib 入门教学

目标: 介绍 Spark MLlib 框架及其在机器学习中的应用。培养学生基本的数据处理、建模和评估技能,使其能够独立进行简单的机器学习任务。教学大纲: 介绍 Spark MLlib 了解 Apache Spark 和 MLlib。MLlib 的主要功能和优势。演示如何在 Spark 中启动 MLlib。基本概念和环境设置…

msvcp140_1.dll丢失怎么修复,这四种修复方法可轻松搞定

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140_1.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍5种常见的解决方法&#xff0c;帮助大家快速恢复应用程序的正常运行。 一&a…

Python函数式编程

Python函数式编程内容不多&#xff0c;熟练使用它们能让代码简洁不少。 Python中的函数式编程强调使用函数作为基本构建块&#xff0c;支持高阶函数、 lambda函数、列表推导式、map()、filter()、reduce()等特性。下面是一些函数式编程的典型例子&#xff1a; 使用 map() 函数…