BIO、NIO编程与直接内存、零拷贝

一、网络通信

        1、什么是socket?


                Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,一般由操作
系统提供。客户端连接上一个服务端,就会在客户端中产生一个 socket 接口实例,服务端每接受
一个客户端连接,就会产生一个 socket 接口实例和客户端的 socket 进行通信,有多个客户
端连接自然就有多个 socket 接口实例。

        

2、网络编程中的serversocket与socket

在网络编程中,应用程序启动会使用serversocket监听端口,客户端通过ip与端口找到对应的应用程序;建立连接后应用程序会创建对应的socket读取客户端传输的数据,并通过socket写入数据后返回给客户端;

二、JDK中的BIO

        BIBIO中的SercerSocket负责绑定IP,启动监听端口,等待客户端链接;客户端的Socket累实例发起链接操作,serversocket接收后产生一个新的服务端socket负责与客户端实例通过输入流和输出流进行通信;

        阻塞体现:1、服务启动就绪,主线程一直等待客户端链接,主线程阻塞;

                          2、建立连接后,在读取socket信息之前,线程也是一直阻塞等待;

传统BIO模型

当客户端访问数量增加,线程与客户端访问数量1:1,服务端会创建大量线程,线程数量增加,系统性能急剧下降,过多会导致系统宕机;

为了改进这一问题,我们可以采用n个线程处理多个客户端请求,这一方式会导致多个客户端等待,这是最大的弊端;

三、什么是NIO?

NIO是为了弥补BIO的不足,提供了高速的、面向块的I/O。NIO全程NO-Blocking io;

Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓冲区的。 Java IO
面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地
方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它
缓存到一个缓冲区。 Java NIO 的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓
冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查
是否该缓冲区中包含所有需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要
覆盖缓冲区里尚未处理的数据。

1、阻塞与非阻塞IO

java IO的各种流是阻塞的,这意味着当一个线程调用read()或write时,该线程呗阻塞;

java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据牡丹石他仅能得到目前可用的数据,如果没有数据就什么都读取不到;而不是保持阻塞,所以直到数据变更前,可以做其它的事情,因此是非阻塞;

2、NIO之Reactor(反应器)模式

“反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注
册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件
处理器对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,
让我来调用你)

3、NIO的三大组件

        Selector选择器、channel管道、buffer缓冲区;

Channels:管道,通道,应用程序与操作系统交互事件与传递内容的渠道(应用程序可以通过通道来读写数据);

        a、所有被Selector注册的通道,只能是继承了SelectableChannel类的子类;

        b、ServerSocketChannel:应用程序的监听的通道,只有通过这个通道,应用程序才能向操作系统注册支持多路复用IO的端口监听;        

        c、SocketChannel:TCP Socket套接字的监听通道,一个socket套接字对应了一个客户端IP:端口,服务端ip:端口;

Selector:java的NIO选择器允许一个单独的线程来监视多个输入通道,即多个通道可以使用一个选择器;这个单独的线程可以操作这个选择器选择通道;这种机制可以是的一个单独的线程很容易来管理多个通道;

应用程序回想selector注册需要它关注的channel,以及具体的channel会对那些IO事件感兴趣;

Buffer:缓冲区,用于和NIO通道进行交互,数据从通道读入缓冲区,从缓冲区写入通道中;(本质是一块可以写入数据,读取数据的内存);就是包装成了NIO Buffer对象,封装了该内存的访问方法;

(本文未更新完毕,持续更新中。。。。。)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者:爱写代码的刚子 时间:2024.1.29 前言&#xff1…

SV-7101T网络音频终端 网络对讲终端

SV-7101是一款IP网络广播终端,主要作为网络播放器使用,其接收网络的音频数据,提供音频输出。SV-7101与服务器主控软件、有源音箱配套使用可实现主控室对HG7101终端进行定时打铃、实时语音广播和紧急广播等功能。 淘宝速购: SV-701…

Android中属性property_get和property_set的详细用法介绍

1,property_get和property_set的作用说明 在Android操作系统中,property_get和property_set是用于获取和设置系统属性的函数。这些属性通常用于存储和读取配置信息,例如设备配置、网络设置、系统参数等。 property_get函数用于获取指定属性…

websocket 通信协议

websocket是什么 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 意思就是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息 属于服务器推送技术的一种. 为什么需要websocket? 疑问?…

(五)MySQL的备份及恢复

1、MySQL日志管理 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因: 误删除数据…

MySQL原理(二)存储引擎(3)InnoDB

目录 一、概况: 1、介绍: 2、特点: 二、体系架构 1、后台线程 2、内存池(缓冲池) 三、物理结构 1、数据文件(表数据和索引数据) 1.1、作用: 1.2、共享表空间与独立表空间 …

【C/C++ 05】快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序算法,其基本思想是:任取待排序序列中的某元素作为基准值,按照该基准值将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于…

MySQL原理(二)存储引擎(1)概述

一、存储引擎介绍 1、概念: (1)MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎…

【数据结构与算法】7.详解队列的基本操作

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢…

2024年最新 MySQL的下载、安装、启动与停止

一、MySQL的下载 MySQL最常用的2个版本: 社区版:免费开源,自由下载,不提供官方技术支持,大多数普通用户选择这个即可。企业版:需要付费,不能在线下载,可以使用30天,提供…

ctfshow web72

下载源码: 开启环境: 本题设置了 open_basedir(),将php所能打开的文件限制在指定的目录树中,包括文件本身。 因为 ini_set() 也被限制了,所以 open_basedir() 不能用 ini_set() 重新设置绕过。 使用 php 伪协议 glob:…

【网络】:网络套接字(UDP)

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 四.地址转换函数 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网…

数据结构----链表介绍、模拟实现链表、链表的使用

文章目录 1. ArrayList存在的问题2. 链表定义2.1 链表的概念及结构2.2 链表的组合类型 3. 链表的实现3.1 单向、不带头、非循环链表的实现3.2 双向、不带头节点、非循环链表的实现 4.LinkedList的使用4.1 什么是LinkedList4.2 LinkedList的使用4.2.1. LinkedList的构造4.2.2. L…

npm 淘宝镜像正式到期

由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且同步频率…

Docker 数据管理、容器互联、网络与资源控制

一、docker数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data volumes)和数据卷容器(Datavolumes containers)。 1、数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立…

seata 分布式

一、下载安装seata 已经下载好的朋友可以跳过这个步骤。这里下载的是seata1.6.1这个版本。 1、进入seata官网 地址: https://seata.io/zh-cn/index.html 2、进入下载 3、点击下载地址 下载地址: https://github.com/seata/seata 二、配置seata 进入c…

​ PaddleHub 首页图像 - 文字识别chinese_ocr_db_crnn_server​

PaddleHub 便捷地获取PaddlePaddle生态下的预训练模型,完成模型的管理和一键预测。配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于用户特定场景的应用 零基础快速开始WindowsLinuxMac Paddle…

MacOS安装反编译工具JD-GUI以及解决无法打开的问题

目录 一.下载地址 二.安装 三.问题 四.解决办法 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 4.保存后再次打开即可 一.下载地址 Java Decompiler 二.安装 将下载下来的 jd-gui-osx-1.6.6.tar 解压,然后将 JD-GUI.a…

驾驭AI绘画:《AI魔法绘画》带你秒变顶级画手!

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

C++笔试强训选择题7

1.对于以下代码,说法正确的是() char * p new char[100];A p 和 new出来的内存都在栈上 B p 和 new出来的内存都在堆上 C p在栈上 new出来的在堆上 D p在堆上 new出来的在栈上 new默认情况下申请的空间在堆上 2. 类模板的使用…