补充:RPC与NIO

《接口测试实战课》读书笔记 —— 接口测试入门 为什么说接口测试如此重要? 从它对项目的影响来说,接口测试直接测试后端服务,更加接近服务器上运行的代码程序,也更能发现影响范围广泛的 Bug。 越接近底层的 Bug,影响用户范围越广 随着中台化、服务化的发展,一套服务支持多种终端,例如 Android 端、iOS 端、Web 端等,这些服务都是由一套后端服务支持的。 如果在Web端发现一个界面问题,影响的只是Web端用户,倘若一个服... 阅读详情

参考:https://www.cnblogs.com/zjfstudio/p/4090712.html
https://weixiaolu.iteye.com/blog/1479656

1. 阻塞I/O通信模型

假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超时)才会返回;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。阻塞I/O的通信模型示意图如下:

如果你细细分析,一定会发现阻塞I/O存在一些缺点。根据阻塞I/O通信模型,我总结了它的两点缺点:

  1. 当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU时间
  2. 阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。

阻塞IO实现的通信代码如下:

ServerSocket server = new ServerSocket(8111);
Socket socket = server.accept();
 
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
 
while(true){
   String inline = is.readLine();
   System.out.println(" 收到信息:" + inline);
   //服务器反回
   os.println("serverSend:" + inline);
   os.flush();
   if (inline == "bye")
break;
}
os.close();
is.close();
socket.close();
server.close();
System.out.println("服务器退出");
Socket socket = new Socket("127.0.0.1",8111);
 
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
while(true){
   System.out.println("请输入:");
   String line = sin.readLine();
   os.println(line);
   os.flush();
   String inline = is.readLine();
   System.out.println("服务器获取值:" + inline);
   if (line=="bye")
      break;
}
os.close();
is.close();
socket.close();
System.out.println("客户端退出");

网络编程中,首先我们要学的就是Socket编程,这是网络编程中最底层的程序接口,分为服务器端和客户端,服务器负责监听某个端口,客户端负责连接服务器上的某个端口,一旦连接通过后,服务器和客户端就可以双向通讯了。
这两段代码分别帖入两个类中,分开执行,先执行服务器端,再执行客户端,就可以互发消息了。

观察下代码,发现代码中下面4~20行逻辑是一至的,都是通过流来通讯,所以Socket中不同的是开始地方,服务器是通过server.accept()来获取Socket,而客户端是通过直接创建Socket对象的。

这段代码,其本运行是没问题的,但存在一个问题,就是当客户端接入时服务器端的accept函数才走下去,不然的话,会一直处于卡死等待状态。包括getInputStream函数,也会等待双方接通后,才往下走。除非等到客户端接入,或中断。当然有人会说,可以引入多线程啊,没错,是可以,但是想一下,是不是每个客户接入都得有一个线程? 否则少一个线程,就会有一堆的卡着。所以这种方式不适合在大最客户端接入的情况。

在这种情况下非阻塞式I/O就有了它的应用前景。

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版) 继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。 阅读详情

相关推荐

WebUI自动化测试框架搭建(python+pytest+selenium+allure)

将鼠标移动到要定位的元素上面>右键>点击“检查”>在元素代码上右键>复制>复制XPath。

m0_63729339的博客 1280

RPC 中 参数传递 ImputStream 流会关闭

文章目录非RPC,本地方法调用时:RPC调用(涉及到注册中心,Feign等方式)时:RPC调用中,可将InputStream转为byte[] 进行参数传递InputStream 转 byte [] 实际工作中遇到很多需要对提交的附件处理的场景。那么就涉及到控制层和业务层之间的参数传递。 非RPC,本地方法调用时: @PostMapping("/import") public void import(@RequestParam("file") MultipartFile file) throws IO

Colourful.的博客 1090

新手必看!用FFmpeg一键合并ts文件的5种方法(含Windows/Mac终端命令)

本文详细介绍了使用FFmpeg合并TS视频文件的5种实用方法,涵盖Windows和Mac终端命令操作。从基础安装到进阶技巧,包括处理音频不同步、批量处理多个视频等场景,帮助用户轻松将m3u8分片视频合并为完整mp4文件,提升视频处理效率。

weixin_29065959的博客 555

RPC框架设计-2-NIO编程

文章目录一、NIO介绍二、NIO和BIO的比较三、NIO三大核心原理示意图四、Buffer(缓冲区)4.1 Buffer的基本介绍4.2 Buffer的常用API五、Channel(通道)5.1 Channel的基本介绍5.2 Channel的常用类介绍5.3 ServerSocketChannel代码实现(服务端)5.4 SocketChannel代码实现(客户端)六、Selector (选择器)6.1 Selector基本介绍6.2 Selector常用API 一、NIO介绍 Java NIO 全称j

刘鑫的博客 545

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细介绍了企业微信群机器人Webhook的配置流程,从创建机器人到获取Webhook地址,再到发送各类消息的完整步骤。通过Python代码示例展示了文本、Markdown等消息类型的发送方法,并提供了性能优化建议和常见问题排查技巧,帮助企业高效实现自动化消息推送。

weixin_29208327的博客 6801

华为EC6108V9E刷机实战:从U盘准备到开机优化的完整避坑指南

本文提供华为悦盒EC6108V9E刷机与优化的完整实战指南。针对搭载RK3228芯片和安卓4.4.4系统的设备,从型号确认、固件选择、U盘准备,到详细刷机步骤、常见故障排除,以及刷机后的深度性能优化,手把手帮助用户规避风险,让旧盒子焕发新生,成为流畅的全能媒体中心。

weixin_29324401的博客 1188

经验笔记:RPC与高性能NIO框架

RPC是一种让一个程序可以通过网络请求另一个不同地址空间上的程序执行某些功能的能力,而这一切对于客户端来说就像调用本地函数一样简单。RPC隐藏了底层网络通信的复杂性,使开发者可以专注于业务逻辑而不是通信细节。优点:简化了分布式系统中服务间的交互。缺点:可能增加系统的复杂性,尤其是在跨语言、跨平台的情况下。应用场景:微服务架构、分布式系统、服务网格等。综上所述,RPC框架在分布式系统中的作用不容忽视,而为了实现高效的RPC通信,选择合适的高性能NIO框架是非常关键的。

qq_45831414的博客 1015

基于YOLOv12的牙齿识别与计数系统:从理论到完整实现

本文详细介绍了一种基于YOLOv12深度学习模型的牙齿识别与计数系统。该系统能够在口腔X光片中准确识别和计数牙齿,并提供了用户友好的UI界面。文章涵盖了数据预处理、模型训练、性能优化以及完整系统实现的各个环节,并提供了可复现的代码和数据集参考。整个系统包含三个主要模块:数据预处理模块YOLOv12模型训练模块UI界面展示模块。

YOLO 178

使用NIO来实现RPC

数据传输格式:   客户端调用服务端:     接口简单名/方法名(参数类型权限名:参数值, . ...)     比如  SayHello/sayHello(java.lang.String:lalala)      这里 接口名为SayHello    方法为 sayHello 参数类型为String 内容nana 服务端返回给客户端       返回类型:值 服

yinbucheng的博客 2796

置顶必读(3) |《滚雪球学SpringBoot》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 15万+

《SAP FICO系统配置从入门到精通共40篇》030、集成配置:FI与生产计划(PP)的自动科目确定

FI和PP的自动科目确定,本质上是把生产业务翻译成会计语言。翻译规则就藏在那些配置表里。配的时候多想一步:这个业务动作,在财务眼里是什么?是材料消耗?是产出入库?还是工费分摊?想清楚这个,再看配置界面,那些代码就不是天书了。最好的测试方式,是月底关账前,让生产部门跑一遍所有类型的生产订单。配置对不对,业务最知道。

985大学毕业,前某大厂员工,啥都会点的程序员! 573

【RPC高性能框架总结】2.NIO的原理以及与传统IO的对比

上一篇我们学习了一个自定义rpc框架的设计思路,在最后我们提到了,rpc技术需要使用Socket进行网络传输,为了其能承受多线程、高并发的网络传输请求,需要使用非阻塞型的NIO框架来处理。本篇就来详细介绍一下什么是NIO,以及NIO的大致原理。 一、简介 NIO是New IO的简称,也叫做“non-blocking IO”,即非阻塞IO,为jdk1.4中提供的新API。当时Sun官方标榜的特性...

程序猿之洞 1835

(01)ORB-SLAM2源码无死角解析-(38) EPnP 算法原理详解→理论基础二:分情况求得beta初始解

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.youkuaiyun.com/weixin_43013761/article/details/123092196 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}

江南才尽江南山,年少无知年少狂! 1024

基于Netty的RPC实现

前言 这个demo,主要是展示了RPC与Netty在一起所产生的一种奇妙的化学反应,与传统的,阻塞的通信不同,基于Netty的PRC框架,可以实现,两个服务之前,异步的方法调用。 其实这篇文章的关键词已经给出来了,即:两个服务之前,异步的,方法调用。 一、RPC是什么 如果不清楚RPC是什么,推荐阅读我的博客《PRC原理分析:从一个简单的DEMO开始》 https://blog.youkuaiyun.com/...

m13797378901的博客 6663

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RPC经典面试题及答案

以下是一些RPC(远程过程调用)的经典面试题及其答案,结合高频考点和实际应用场景整理而成:以上问题覆盖了RPC的核心知识点,如需更深入的技术实现或源码分析,可进一步参考相关文档或书籍(如《Offer来了》)。

liao9416的博客 1246

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度思考rpc框架面经之四:netty:泛化:protobuf

RPC框架与注册中心主要在以下几个时刻交互:服务注册:当服务提供者启动后,会将自己提供的服务信息注册到注册中心,通常这个过程发生在服务提供者启动的初始化阶段。服务发现:服务消费者在启动后,会从注册中心获取所需的服务信息,这个过程称为服务发现。服务发现可能在服务消费者启动的时候发生,也可能在运行过程中定时进行,以获取最新的服务信息。服务下线:服务提供者在关闭或者因为某种原因无法提供服务时,会将自己从注册中心移除。这个过程通常发生在服务提供者关闭的时候。

yxg520s的博客 872

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面试官:什么是 NIO?NIO 的原理是什么机制?

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析...

weixin_44421461的博客 282

Netty 总结与补充(十)

Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。网络传输方式问题。

weixin_68074170的博客 1057

小凉学RPC

RPC学习

XiaXiaoliang的博客 843

RPC核心原理:组件与调用流程

RPC(远程过程调用)通过5个核心组件实现远程调用的本地化体验:客户端发起调用、服务端执行业务、客户端Stub处理序列化和服务发现、服务端Stub负责反序列化和方法调用,以及网络传输层完成数据传输。完整调用流程包括请求发起、序列化、网络传输、服务端处理、结果返回和反序列化等步骤。Stub组件解耦了业务代码与网络细节,使开发者无需关心底层通信实现,这正是RPC简化远程调用的关键所在。

331

Rpc编程系列文章第二篇:RPC框架设计目标

RPC编程:RPC架构设计目标

七叔的博客 1万+

HADOOP-RPC机制

转载自 一、RPC基本概念: 1、RPC,即Remote Procdure Call,中文名:远程过程调用;   (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。    (2)Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktrac

图图 907

面试题:如何实现一个RPC框架?

面试题:如何实现一个RPC框架?

qq_26432153的博客 1187

RPC框架原理及实现

RPC概述 RPC(Remote Procedure Call)即远程过程调用,允许一台计算机调用另一台计算机上的程序得到结果,而代码中不需要做额外的编程,就像在本地调用一样。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。 现在互联网应用的量级越来越大,单台计算机的能力有限,需要借助可扩展的计算机集群来完成,分布式的应用可以借助RPC来完成机器之间的调...

洞玄之境的博客 747

NIO 和 IO 到底有什么区别?别说你不会!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目...

weixin_44421461的博客 204

【RPC】---- 基于Netty实现的RPC

- 使用Netty实现了客户端与服务端的通信 - 自定义了消息格式,使之支持多种消息类型、序列化方式(Json、Hessian、Kryo) - 使用Netty的拆包器解决了粘包问题

TheWhc 1114
上一篇: HDFS之RPC(3) 代码
下一篇: HDFS源码-4 ls命令解析
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值