| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【挑战学习一百天冲刺实习面试】第二十二天:Java网络编程的BIO和NIO(完结) -> 正文阅读 |
|
[Java知识库]【挑战学习一百天冲刺实习面试】第二十二天:Java网络编程的BIO和NIO(完结) |
一些基本概念阻塞与非阻塞指的是等待调用结果返回之前,调用方的状态 阻塞:发出请求等待请求结果时不能进行其他操作 非阻塞:发出请求等待请求结果时可以进行其他操作 同步与异步指的是通信机制的区别,等待调用的结果的 同步:调用后必须等待结果才可以返回 异步:调用后可以不先知道结果直接返回,直到后面收到结果 四种排列组合基于阻塞与非阻塞、同步与异步,IO操作可以分为四类:
网络编程演进史
同步阻塞式IO(BIO Block IO)->同步阻塞与非阻塞模式(NIO No/New Block IO jdk1.4)->异步非阻塞I/O模型(AIO Asynchronous IO jdk1.7) 网络层的解析与协议URL的解析域名的解析域名的解析是从右向左解析,下面以 域名DNS查询的两种方式DNS有一个分布式映射数据库,查询DNS分为递归查询和迭代查询,查询时经过的域名服务器,只要IP地址被查询出来了就会进行缓存,方便下次查询。 递归查询:DNS客户端查询根域名,如果根域名知道IP地址就直接返回,如果不知道就查询顶级域名,如果… 迭代查询:如果根域名知道I地址就直接返回,如果不知道就把可以查询的顶级域名返回,DNS客户端去顶级域名查询,如果知道了就直接返回,如果不知道就将二级域名返回… 网络协议快速扫盲我们其实是把网络页面信息转化为电信号中的0和1,把它通过光缆传给另一方,另一方接收到之后将电信号层层解析并加载到浏览器中。 将网络传输分层之后,每一层只需要依赖(适配于)下一层就可以,需要担心的事情就减少了很多,当做了改动后不用担心其他层的适配,只需要担心一层即可
网络各层数据包格式
网络编程基础知识网络编程的本质网络编程的本质是进程间的通信,其实就是数据的输入输出。因此我们要了解输入输出模型,数据从数据源输入到应用进程就是输入流,反之是输出流。数据源可以是文件、字符串、对象、Socket等等 java.io的流字节流操作单位是字节,即8bit,人类常常一个个字符读,为了减少额外转化的努力,Java帮我们做了这类工作 字符流介绍先看一下常见的字符流吧: 提供了额外功能的Reader和Writer,需要建立在基本的Reader和Writer的基础上,InputStreamReader是一个连接的桥梁,将字节流转化为字符流 字节流介绍康康最基本的字节流对象: 在基础的字节流的基础上添加一些功能的字节流对象,DataInputStream或帮助我们直接转化为Java数据类型: 流中存在的装饰器模式不管是在字符流还是字节流,我们都有一些高级的对象,但是这些对象是基于一些基本的对象实现的,我们有基本对象的功能,同时还提供了更好的功能。例如BufferedInputStream提供了缓存区,这就是装饰 Socket概述socket也是一种数据源,绑定了Socket就可以传输数据流,那socket到底是怎么发送数据呢?其实是需要网卡此类硬件传输数据,首先应用会创建一个socket,其次将这个ip地址、端口、socket绑定到网卡的驱动程序,然后发信息就先发给socket即可,socket发给网卡驱动程序,网卡从硬件层面将信息发送到 同理,接受数据的时候也是类似,网卡收集到远程网卡传来数据,就会发给socket,socket将信息发给应用进程 网络通信的线程池如果为每个请求创建一个线程再回收的话,会有浪费,同时由于操作系统的限制,我们也不能无止境的创建线程。Java提供了很多实现线程池的工具,通过实现ExecutorService接口,提供了两种不同类型的任务,没有返回值就是Runnable,需要返回值就用Callable 最终,我们从线程池中得到的是Future对象,代表任务最终完成的状态,例如isDone()表示现在任务是否已完成,完成了可以使用get()方法得到结果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbxAiD7n-1631547899555)(C:\Users\forev\AppData\Roaming\Typora\typora-user-images\image-20210911222746341.png)] Executors提供了许多静态方法帮我们创建线程池 BIO阻塞模型socket与serversocketsocket是客户端的,serversocket是服务端的,其连接过程通常如下 BIO阻塞模型有一个线程Acceptor接受其他线程的请求,创建一个新线程用来连接client,再来一个client同理 伪异步IO编程模型(线程池)使用线程池进行优化,否则线程太多太浪费了,如果有可用的线程就使用,没有就等待,这样优化后,系统的可靠性和可伸缩性就有了很大的提升 NIO非阻塞模型NIO概述ServerSocket的appcet是阻塞的,InputStream的read和OutStream的write都是阻塞的,同时无法在同一个线程处理多个Stream IO,即一个用户阻塞整个线程,在BIO中我们可以使用多线程,然后使用了线程池进行优化。我们可以使用一种非阻塞的形式来处理数据的输入和输出,即NIO。 NIO可以理解为new或NoblockingIO,我们不再使用流这个东西,而是使用Channel(通道)替代Stream,流是有方向的单向的,但Channel是双向的;流的读写是阻塞的,Channel可以阻塞也可以非阻塞。 NIO还提供了Selector,一个Selector可以监控多条Channel,比如我们想从非阻塞的Channel读取数据,但是要用读的数据的时候我们不知道Channel是否读完了,可以使用Selector。 同时,NIO可以在一个线程中处理多个Channel I/O。多线程不一定会提高效率,当线程数太多会造成上下文交换压力,此外创建、销毁一个线程还会浪费系统资源。 Buffer简析我们使用Channel读写数据,其实是用的Buffer,针对一个Channel操作,离不开他的Buffer操作。Channel支持双向操作,可读可写,所以Buffer也可以双向操作,同时buffer是有大小的
Channel简析Channel通过Buffer进行操作,不同Channel也可以直接传输数据,简单介绍几个Channel类 多方法拷贝文件
Selector简析监控多个通道的状态,需要我们将Channel注册到Selector中,对于不同的类型,我么可以有一套逻辑 在Selector的常用方法如下:
NIO优化聊天室AIO异步通信模型AIO异步通信模型阻塞式 非阻塞式,轮询看是否完成 NIO的形式是IO多路复用 前面的都是同步的,这里是异步的,等执行完了就来传递一个信号 异步调用机制主要使用 方式一:通过Future对象(对未来某个时间会结束的操作) 方式二(常用):通过CompletionHandler,执行成功和失败后的逻辑都可以自定义 AIO优化聊天室 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:31:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |