java 网络编程 方式_JAVA网络编程

概念

BIO  阻塞io,1.4之前

NIO  no-blocking io 非阻塞io,jdk1.4

AIO  异步io,jdk1.7

浏览器输入网址,敲下回车之后发生了什么?

1.URL解析

cb3f03553a158cc2175af255b7ba224a.png

2.DNS解析

概念:Domain Name System,域名系统,本质上是一个分布式数据库。将人类可读的域名解析成计算机可读的IP地址

53310c5b543032abcd7f31bbdf463a27.png

解析顺序:从右向左

38ab0f43b61738a3305987054d7ae521.png

域名的层级:类似于索引,一级一级更有效率的查找

dac5aefe9829a98f816b66edd696d35d.png

DNS查询的两种方式:递归与迭代

0e228bf9d0c2bdbd12872a1687e1202e.png

001bc3f4d9cf0b37db9912ee0f4d955c.png

网络协议

7723947a7d0daf65f394de5396c9c5eb.png

各个层的数据包格式

一个数据包叫一个帧,最大1518字节,经过每个层的时候,会加上特定的标头信息

ef136498410282bfba27e3b95ec1be53.png

java.io专业术语

49b28e34131071850b1ad91b2b5240b4.png

3f965111ade5d35204e935e501091c0c.png

45e20403be51b98ad63ae4654f415b83.png

字符流:相对高级,处理人类可以理解和阅读的字符

基本字符流:

54449610155a9ae7cb3319bdb4fb5cbc.png

高级字符流:

e85817090d4865e1d25147d46330f1b1.png

字节流:相对低级,处理字节,1字节=8bit

基本字节流:

c9598fa4eddbfff6ea963a9fca0df4c8.png

高级字节流:

f04e2271e28fb3ebbc1e74ccba6c67f2.png

设计模式:装饰者模式,高级流套在低级流之上

7d2aafbb83d90edffd54f733de95708f.png

b1b315fa3c837287f8887c5cbf994d3f.png

Socket

socket以ip+port作为唯一标识,与网卡驱动进行绑定,实现点对点的通信

unix系统中,一切皆是文件,socket也不例外,这就是为什么在多路复用模型中,总是会提到文件描述符这个词语了。

4547f043eadd676b207b22d762958e3a.png

9fea7facc8c929db6308f937b42eb499.png

ca0c3d5248416f9e46f435fb160080bb.png

同步异步阻塞非阻塞

一个表白的故事,一个男生向心仪已久的女生表白

同步:女生想了一段时间,当场给出了自己的答复

2d352946218d6cd2cfdc949bcfb01fa9.png

异步:女生说,你让我考虑几天,想好了我会打你电话

5191bb3348f6c15e066c38b884901135.png

阻塞:男生心心念念,茶不思饭不想,一心等待着女生的答复。

cb11f449f9b5580a58d3bf77c4e3b738.png

非阻塞:男生落落大方,个人生活并没有被表白这一件事情完全占据,等待回复这段时间,正常在做自己的事情,比如打打篮球

966b49baf027b3c8c7f9b292294b9aae.png

线程池

本质上为了线程复用,银行办理业务的故事

单线程:只有一个柜员,顾客排队办理业务。

多线程非线程池:有客户就招柜员,办理完了就辞退柜员,再有新的顾客再重新招聘柜员,这无疑是非常可笑的。

88eebb5a88fb990766695ca27298b7a4.png

线程池:有一批固定的柜员,平时作为常设窗口提供服务(核心线程数),

业务繁忙的时候,由HR去招聘一批员工(线程工厂),

如果窗口已经全部开放(最大线程数),客户仍然很多,就需要在大厅排队办理(工作队列),

如果业务非常火爆(比如听过银行破产,储户争相取款- -),整个大厅挤满了客户,那么对于其他大厅外的客户,银行只能说no,告知暂时无法提供服务(拒绝策略)

业务高峰过去之后,新招的员工并不会被立即辞退,只有那些长时间没有业务的员工,才会被HR辞退(空闲时间)

f3536c24c2eade4cc0fe3fe7eb48b697.png

java提供的线程池(除此之外 ,还有手动创建,ThreadpoolExecutor、ScheduledThreadpoolExecutor、Fork Join Pool):

621e6143327bdfaaf358f70848a8f991.png

cc94a61b8f7b96d7c3c40cfa1303c611.png

JAVA IO的前世:BIO阻塞模型

3598d3921c222336a3b5607cce9e1543.png

84cfcc7f0b95b6d3e2ca8bef447f51d6.png

JAVA IO的今生:NIO非阻塞模型

5b7a1c6d13979042722a88f440d6e9df.png

2e83eee84e3b11c14f91b8c35ce81ebf.png

buffer解析

channel是读写双向的,依赖buffer来实现,通过flip()方法来实现读/写模式的翻转

写模式

5dc8d6f5ea42ed45eedc6dbb7515e3b8.png

读模式,limit移动到之前写模式的最后一条,position移动到起始位置。即只能读取写模式下写入到buffer中的数据

bc3dae8fd6a540197f9fd6311326a595.png

如果数据全部读取完,调用clear()方法重新转换成写模式,limit回到最末尾,position回到起始位置

clear()方法其实并没有真的去清除buffer中的数据,只是移动了两个指针而已,但是下次再写入的时候,原有数据就会被覆盖,效果上等同于清除,是一个很巧妙而高效的方法

0eb996113d3076aea007e9502973d3f2.png

如果数据并未全部读完,在这之前需要先转换成写模式,则调用compact()方法

compact()方法把之前未读完的数据复制到buffer的最前面,然后把position指向紧跟着的那个位置,从这个位置开始写入新的数据,limit移动到末尾,这样可以确保每次读的时候是从上一次未读取完的位置开始继续读取。

10e1a4a1252bf72ffe45209d007836e1.png

channel解析

channel之间可以直接进行数据交换

3665f1c8f91b2ad663a03b2b62832d48.png

几个重要的channel

99ae3027e3b981a59171e09e3c872c3f.png

多方法实现文件拷贝

95898edaffb84715ab9525e56e00fb14.png

不带缓冲区的字节流拷贝

带缓冲区的字节流拷贝

基于channer的buffer进行拷贝

两个channel之间直接拷贝

性能对比:三个不同大小的文件,小的400K,中等的10M。大的500M,四个拷贝方法均执行5次,取平均值进行比较

不带缓冲区的字节流拷贝性能非常差,几千倍的差距

其他三种方法差别不大,随着文件的增大,nio的方法效率相对来说比传统的bufferedStream好一些

其实传统io的方法实现在新版本的jdk中已经被重写过了,在jdk1.4的时候,nio方法的性能要比传统io好很多,目前主流的jdk1.8中,底层实现差不多,所以性能没有太明显的差距了。

3d3b2689da7b9730361db51efd496aa5.png

selector解析

所有的channel注册在selector上面,由selector来监测channel的状态变化

0d45c5973b7ded4a1768c294ded768b0.png

channel的状态变化

connect:socketChannel连接到了服务器上

accept:serverSocketChannel接受了一个连接

read:channel上有数据,处于可读状态

write:channel处于可写入状态

7366cde15ddf76a21370c6e791fa6396.png

在Selector上注册channel

每个channel获得一个唯一的SelectionKey,interestOps()关心的事件,readyOps()就绪的事件

a3c98a6236b1efbc718a8b0f8c8de699.png

使用selector选择channel

select()统计所有注册的channel事件就绪的个数,操作完之后需要手动的重置就绪状态,以便当channel再次就绪的时候selector可以正确的统计

f69148779ad173edca5a939fb23bba45.png   

edf6d1e25288c9946ae385dde489b62a.png

5a54eef944ddb54acee9c7752ca7fb12.png

NIO编程模型

socketServerChannel注册监听accept事件,响应说明有新的socketChannel建立了连接,然后对这个新的socketChannel在selector上注册监听read事件,当read事件就绪的时候(buffer中有可读数据),由selector所在的线程去处理该io请求

这样,selector所在的这个线程可以同时处理多个io请求,不像BIO模型中每个io请求都需要有一个单独的线程去一对一的阻塞处理

b1cdf0d8f63016951f48c14c3506c3e1.png

JAVA IO的后世之师:AIO异步模型

内核IO模型

阻塞式I/O:每次系统调用阻塞,知道成功返回数据为止

a8657ed96cd9706ba4d138471795f46f.png

非阻塞式I/O:不停的进行系统调用,没有数据就直接返回无数据,知道有成功返回为止

57c23fdcd0275dcf7a847b3b604a21c2.png

I/O多路复用:不再由应用程序自身不停的进行系统调用,交由selector来监听事件,事件就绪的时候,会返回可读条件,然后应用程序发起系统调用,成功返回数据

99c59412347247117954026bf9ff127d.png

异步I/O:前面三种都是同步调用,无论是阻塞还是非阻塞,应用程序必须主动发起系统调用才能得到数据,在异步I/O模型中,应用程序先发起系统调用,如果此时数据没有准备好,

则返回无数据(非阻塞),当未来的某个时间,内核将数据准备好了之后,就会执行相应的回调函数

f6e7fe4239f8c30587c59af48b001635.png

异步调用机制

AIO中的异步操作

49bcd4778a27c46710122c626f891623.png

异步实现原理

基于Future,异步阻塞,用于客户端

98a21fd183732d315f78d1cb43371560.png

基于CompletionHandler,异步非阻塞,用于服务端 ,底层有一个AsyncronousChannelGroup线程池,用来执行回调函数,性能比nio的单线程同步非阻塞selector更高,AIO模型的精髓也就在这里。

572dc42b63bba376289a83b4ee4b4515.png

AIO编程模型

2498ba80a067b40f20d1bc95e2ab609e.png

三种IO模型适用情境

c0e3270ab55edada2b19f9aecfd48cbe.png

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

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

相关文章

如何设置背景图(前端开发)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模糊化背景图</title><style>body {background-image: url("image/bjt03.jpg");background-repeat: no-repeat;background-atta…

java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

Java基础之字符串操作——String字符串什么是字符串&#xff1f;如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论&#xff0c;我们先来解释下字符序列&#xff0c;字符序列&#xff1a;把多个字符按照一定的顺序排列起来&#xff1…

查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云...

查看oracle会话和进程在这篇文章中&#xff0c;我将继续在Oracle Digital Assistant和Oracle Digital Assistant之上为FlexDeploy实现对话式UI的故事。 Fn项目 。 今天&#xff0c;我将围绕聊天机器人工作的无服务器API迁移到云中&#xff0c;因此整个解决方案都在云中工作&am…

浏览器用户脚本管理器(Tampermonkey)

文章目录脚本管理器的好处是什么&#xff1f;用户脚本管理器有哪些&#xff1f;如何使用&#xff1f;安装脚本示例常用脚本脚本管理器的好处是什么&#xff1f; 用户脚本管理器将在您的用户脚本管理方面提供更多的便利。 它提供了诸如便捷脚本安装、自动更新检查、标签中的脚本…

服务器$java_top路径_ERP实施项目-MD120_FIN000_即时打印_V1.0

中国移动项目即时打印开发在此将web的即时打印开发成通用程序。1、首先通过创建rtf模板制定报表的输出格式&#xff1b;2、将需要输出的数据插入客户化表cux_fnd_xml_pool中&#xff1b;3、通过EBS功能调用CuxFndXmlpViewer.jsp。此jsp程序会根据传入的参数判断调用哪个rtf模板…

通讯网关 api网关_API网关正在经历身份危机

通讯网关 api网关这些年来&#xff0c;API网关正在经历一些身份危机 。 它们是否是集中的共享资源&#xff0c;从而促进了API对外部实体的公开和治理&#xff1f; 它们是集群入口哨兵&#xff0c;可以严格控制哪些用户流量进入或离开集群吗&#xff1f; 还是他们根据自己拥有…

百度搜索引擎使用技巧

1.在指定的网站搜索内容 在搜索框输入&#xff1a;site:youku.com 蛋炒饭&#xff0c;则只会返回优酷网站上关于蛋炒饭的内容 2.屏蔽指定的网站 例如&#xff0c;搜索“内存溢出”&#xff0c;但是不希望看到 csdn 网站相关的内容&#xff0c;你可以在搜索框输入&#xff1a;内…

docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序

docker 容器监控在这篇简短的文章中&#xff0c;我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序。 我将使用标准工具JConsole&#xff0c;它是计算机上JDK安装的一部分。 如果存在问题&#xff08;例如&#xff0c;内存泄漏…

phpexcel 日期 时分秒_thinkPHP+PHPExcel实现读取文件日期的方法含时分秒

Vendor(PHPExcel.PHPExcel.IOFactory);$inputFileName Public/demo/demo.xls;$objReader new PHPExcel_Reader_Excel5();$objPHPExcel $objReader->load($inputFileName);$sheet $objPHPExcel->getSheet(0);$highestRow $sheet->getHighestRow(); // 取得总行数$…

css中的display属性值:table,table-row,table-cell

table&#xff1a;此元素会作为块级表格来显示&#xff08;类似 <table>&#xff09;&#xff0c;表格前后带有换行符。 table-row&#xff1a;此元素会作为一个表格行显示&#xff08;类似 <tr>&#xff09;。 table-cell&#xff1a;此元素会作为一个表格单元格显…

Bootstrap的学习

文章目录概念入门响应式布局响应式布局的实现&#xff08;栅格系统&#xff09;示例代码注意事项栅格系统参考视频应用 Bootstrap 的组件概念 一个前端开发的框架&#xff0c;Bootstrap&#xff0c;来自Twitter&#xff0c; 是目前很受欢迎的前端框架。Bootstrap 是基于HTML、…

jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史

jdk8 string::最近有人提议从JDK 12中删除Java预览功能Raw String Literals &#xff08; JEP 326 &#xff09;&#xff0c; 现在正式宣布将删除该预览功能 &#xff08; Java SE 12 [JSR 386] 25版将其删除 &#xff09;。 JDK String类中已添加了几种方法来支持此功能。 即使…

注册界面的实现案例视频(前端开发)

视频1&#xff1a;https://live.csdn.net/v/182184 视频2&#xff1a;https://live.csdn.net/v/182185 视频3&#xff1a;https://live.csdn.net/v/182186 视频4&#xff1a;https://live.csdn.net/v/182200

jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化

jdbc如何写csv文件在上一篇文章中 &#xff0c;我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方。 这篇文章是关于以CSV格式流式传输。 流式传输使您可以一点一点地传输数据&#xff0c;而不必将所有数据都加载到服务器的内存中。 例如&#xff0c;考虑以下Resul…

使用Bootstrap开发网站首页

视频1&#xff1a;https://live.csdn.net/v/182207 视频2&#xff1a;https://live.csdn.net/v/182208 视频3&#xff1a;https://live.csdn.net/v/182209

在java中3.14156d表示_2006年9月计算机等级考试二级Java笔试真题

一、选择题(每小题2分&#xff0c;共70分)下列各题A)、B)、C)、D)四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂写在答题卡相应位置上&#xff0c;答在试卷上不得分。(1)下列选项中不符合良好程序设计风格的是_____。A)源程序要文档化B)数据说明的次序…

apigee 安装_APIGEE:用于API代理的CI / CD管道

apigee 安装在本文中&#xff0c;我们将看到如何为APIGEE API代理创建CI / CD管道。 我已经参考了APIGEE社区上同一主题的几篇文章。 这些给了一些关于如何为API代理设置CI / CD管道的想法。 这是我用来设置CI / CD的工具。 詹金斯 节点 蜂胶 新人 APIGEE管理API 确保已创…

超链接标签/<a>标签

保留 <a> 标签的点击功能&#xff0c;但是点击不需要跳转&#xff0c;也就是取消 href 属性的功能&#xff0c;可以这样做&#xff1a; <a href"javascript:void(0);">test2</a>href 属性不能去掉&#xff0c;否则看不到链接样式。

php model层怎么写逻辑,目前用php框架的话,大家会把逻辑写到model中吗?

目前用php框架的话&#xff0c;大家会把逻辑写到model中吗&#xff1f;还是model只做数据的添加删除 修改操作&#xff1f;如果说是简单 mvc框架 你们把逻辑写在哪里&#xff1f;controller&#xff1f;还是说自己弄了个逻辑层&#xff1f;回复内容&#xff1a;目前用php框架的…

gradle项目 构建_使用Gradle构建Monorepo项目

gradle项目 构建根据Wikipedia的说法 &#xff0c; monorepo是一种软件开发策略&#xff0c;其中许多项目存储在同一资源库中。 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏&#xff0c;并且已被许多使用大型代码库的组织采用&#xff0c;例如Google&#x…