JavaWeb
文章平均质量分 51
Princess$
不一定逆风翻盘,但一定向阳而生
展开
-
linux常用指令
ls 指令【/ 是根目录,也就是最底层目录】【 ls -l/ll 以列表的形式查看目录中的内容】pwd【可以看到现在正在那个目录结构中】cd【cd / 切换到根目录】【cd ~ 切换到家目录】【cd … 切换到当前目录的上级目录】touch 文件名【创建一个空文件】【如果touch一个已经存在的文件,不会修改文件内容,只会修改文件的最后修改时间】cat 文件名【查看文件内容】echo 写入的语句【可以把“写入的语句”放到显示器上】【echo 写入的语句 > 文件名 就原创 2021-04-13 15:02:28 · 172 阅读 · 0 评论 -
40. 网络层 —— 网络层主要解决的问题 / IP协议
1. 网络层主要解决的两个问题1.地址管理:【网络上的这些主机和节点都需要使用一种规则来区分,就相当于是一种身份标识】2.路由选择:【从主机A传输到主机B,由于A和B需要跨越很多网络设备,数据在传输过程中需要选择路径】2.IP协议2.1地址管理解决方案每一个主机都会有一个身份标识,这个标识是由32位数字组成的,但是现在连接网络的设备太多了,光靠这32位已经没有办法分配了,于是就有了一下解决方案:1.动态分配IP地址:【只有联网了才给分配,不联网的时候就不分配(这种方法在一定程度上可以说是解原创 2021-03-29 21:35:36 · 4536 阅读 · 0 评论 -
39. TCP十大特性是哪些?
1.确认应答 https://blog.csdn.net/qq_45136189/article/details/1152625662.超时重传https://blog.csdn.net/qq_45136189/article/details/1152629983.连接管理https://blog.csdn.net/qq_45136189/article/details/1152632694.滑动窗口https://blog.csdn.net/qq_45136189/article/details原创 2021-03-27 21:43:32 · 158 阅读 · 0 评论 -
38. 传输层TCP协议十大主要特性(10) —— 保活机制
背景:在传输过程中可能会遇到很多异常情况,在一些异常情况下,TCP对连接会呦特殊的处理1.进程崩溃【在这种情况下,TCP链接会正常四次挥手的过程,只要进程退出,就会自动关闭相应的文件】2.主机关机【关机的时候就强制杀进程,就进行四次挥手了】3.主机断电/网线断了【1) 如果接收方断电,对端尝试发送消息时,就会没有ACK回应,然后会进行超时重传,重传到一定的次数,重置连接,最后放弃连接】【2)如果时发送方断电,对端尝试接收信息,但是他也不知道什么时候会发送过来,难道就要一直这么等吗原创 2021-03-27 21:37:34 · 193 阅读 · 0 评论 -
37. 传输层TCP协议十大主要特性(9) —— 粘包问题
粘包问题:粘的是应用层数据报,导致处理数据的时候,容易堵半个应用层数据报(这是一个凡是面向字节流传输都会遇到的问题)假设:在小红的回答中有三个字,这个时候就需要从缓冲区中读取了,但是读的时候一次性读几个数据,这是无法预知的,这就可能会让程序出现歧义(UDP以包为单位,就不存在这样的问题)那么读取应用层数据就不应该只读半个包,也就是需要通过应用层协议本身来区分包和包的边界,区分方式可以有:1.使用分隔符:好个p;好个p;…2.明确包的长度:3 好个p...原创 2021-03-27 21:27:11 · 148 阅读 · 0 评论 -
36. 传输层TCP协议十大主要特性(7-8) —— 延迟应答 /捎带应答
延迟应答背景:还是拿水果店老板进货的例子,假如补货的人来问水果店老板,什么时候需要补货,老板说晚上再给你发微信。那么这种情况下,水果店老板会在白天继续卖出去一些水果,晚上再跟补货人说要多少水果,就可以达到剩余空间最大利用目的:为了提高效率,在流量控制的基础上,尽量返回一个合理但是又比较大的窗口方式:在不影响可靠性的前提下让ACK发送的时间晚一会儿条件:为了保证可靠性,不是每个包都可以延迟应答的,还要看:1.数量控制(每隔N个包就应答一次),2.时间控制(超过最大时间就会应答一次)延迟应答的等待时间原创 2021-03-27 21:12:39 · 267 阅读 · 0 评论 -
35. 传输层TCP协议十大主要特性(5-6) —— 流量控制 / 拥塞控制
流量控制背景:假设我是一个水果店老板,你是每天需要给我补货的人,我有一个仓库是放水果的,容量是3000,这是补货的人给我发的货数量就不能大于我仓库的容量,如果今天来补了3000,假设我第二天一箱都没卖出去,那么我就需要告诉你暂停发货了,等我卖出去了,仓库能有点空闲的位置的时候,你再来补货。上面的例子中,水果店老板就是接收者;补货人就是发送者;仓库就是接收缓冲区在前文提到的滑动窗口特性中,滑动窗口不能无限大,传输效率太快了接收方反应不过来,应该根据接收方的处理能力来反向制衡发送方的发送速度;这里的“接原创 2021-03-27 20:38:42 · 260 阅读 · 0 评论 -
34. 传输层TCP协议十大主要特性(4) ——滑动窗口
在之前的TCP中,没有使用滑动窗口,就要等待N次应答时间和N次传播时间,这两个时间加起来才是总的传输时间,这样的效率一定是很低的。也就是之前我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段. 这样做有一个比较大的缺点, 就是性能较差. 尤其是数据往返的时间较长的时候滑动窗口是在保证了可靠性的前提下,批量处理,处理时间压缩了,有进一步地提高效率。如下图所示就是滑动窗口的应答图:窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图原创 2021-03-27 17:04:19 · 400 阅读 · 0 评论 -
33. 传输层TCP协议十大主要特性(3) —— 连接管理(三次握手四次挥手)
连接管理连接管理是分为两大块的:1.建立连接:三次握手的过程2.断开连接:四次挥手的过程为什么要建立连接?1.为了更好的保证可靠性,建立连接的过程就是让通信双方都确认验证一下各自的发送和接受能力是否能够正常2.协商一些重要参数建立连接:三次握手假设我们现在在打电话,那么通信双方刚接通电话的时候就会有这样的情景:在TCP的实际连接过程中,是需要经历一下过程的:三次握手中几个重要的状态:LISTEN:相当于手机打开了,有信号了,可以随时有人打电话进来SYN_SEND/SYN_RCND原创 2021-03-27 14:02:42 · 179 阅读 · 2 评论 -
32. 传输层TCP协议十大主要特性(2) —— 超时重传
超时重传解决的问题:在确认应答中描述了一种理想情况,也就是说在这种情况下没有考虑丢包的过程,但是如果在数据的传输过程中“丢包”了,那么就需要用到超时重传假设再一下传输过程中丢包了,有两种情况:情况一:主机A发送的请求丢了情况二:主机B回复的ACK丢了但是以上两种情况并没有办法区分开,那怎么办呢?解决方法如下:既然区分不了那就等待一个规定的时间也就是定时器,到了这个时间还没有收到ACK那主机A就再次发送数据,假设第一次发送数据后等待的时间为t1,第二次发送数据后等待时间为t2,那么就会有t2&原创 2021-03-27 12:35:20 · 208 阅读 · 1 评论 -
31. 传输层TCP协议十大主要特性(1) —— 确认应答
为了更好的理解,在介绍确认应答特性之前,先举一个简单的例子假设你正处于想要表白的时期,并且你很怂,只想用发微信的方式给小姐姐表白,由于利用发短信的形式进行传输并不可靠,因此需要用对方返回一个应答报文(ACK)来表示已经收到消息了,那么就会有以下情况:此时小姐姐回应的两个答案分别是“喜欢”和“不喜欢”,但是因为有网络先发后至的可能性,不知道这两个答案分别对应的哪个问题,也可能你的表白会空欢喜一场。那么怎么让信息的传输更为准确没有歧义呢,那就在回答的前面加上一个限定标志,比如说:加上两个限定词之后,原创 2021-03-27 12:09:57 · 206 阅读 · 1 评论 -
30. 传输层(2) —— TCP协议格式
TCP协议格式源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); TCP头部最大长度是15 * 4 = 60【如果首部长度为1111,换成二进制是15(最大值),则数据报头的长度为:15*4=60个字节】6位标志位:URG: 紧急指针是否有效ACK: 确认号是否有效 (应答报文)PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段原创 2021-03-21 11:25:54 · 171 阅读 · 0 评论 -
29. 传输层(1) —— UDP协议
UDP协议的特点无连接:类似于发短信,无需先建立连接,就可以直接进行通信不可靠:发送者不知道接收者是否接受到了数据面向数据报:以DatagramPacket为单位进行读写操作在UDP协议代码实现这篇文章中已经通过代码实现一个简易版服务器的形式来体现了“无连接”、“面向数据报”的两大特点,有需要的小伙伴可以参考UDP协议原理比如说现在要发消息,那么QQ这个进程就会构造出来一个应用层数据报下面需要使用Socket API 进行send的时候,就交给了传输层(这里是UDP实现的)在UDP报原创 2021-03-21 11:05:16 · 145 阅读 · 0 评论 -
28. 传输层预备知识 —— 端口号
端口号概念端口号可以区分一个主机上的多个进程,在一次通信中有五元组源IP,源端口,目的IP,目的端口,协议号来标识一次通信。端口号范围及划分端口号是一个由两个字节构成的无符号整数,也就是其范围在0~65535之间;但是从0~1023为知名端口号,也就是一些常用的服务器,给定了他们固定的端口号,我们在自己写的时候姚避开这些端口号除了0~1023是知名端口号以外,还有一些常用服务器端口号如下:Tomcat:8080;MySql:3306https:443http:80等等等等。。。。。原创 2021-03-21 10:13:36 · 400 阅读 · 0 评论 -
27. cookie和session有什么区别
1.cookie首先我们从四个方面来简要理解一些cookie:cookie是啥?【是一个由程序员自己定义的字符串】cookie从哪来?【从服务器中来,程序员会在服务器的header中写入一个Set-Cookie字段,把对应的值会存在浏览器中,这个值可以在响应中看到】cookie存到哪?【cookie是按照域名来存的,每个域名都有自己的cookie,浏览器都是用域名来区分的,也就是每个浏览器的cookie都不一样】cookie以什么形式保存?【cookie以键值对的形式把用户原创 2021-03-20 14:31:57 · 2408 阅读 · 18 评论 -
26. 应用层HTTP原理(4) —— HTTP Server(完成一个登录页面)
使用技术Cookie、session、线程池、工厂模式、html实现代码首先需要在这里创建一下文件,在index.html中写入想从网页上返回的内容,这里是需要完成一个登录页面,因此html中的内容如下:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>登陆页面</title></head><body原创 2021-03-19 21:14:43 · 328 阅读 · 0 评论 -
25. 应用层HTTP原理(3) —— HTTP Server
根据本专题的上一篇文章所说提到的HTTP响应和HTTP请求的格式(HTTP请求和响应格式文章链接)我们可以书写简单的HTTP Server程序,让服务器上的返回给客户端的返回结果返回至网站中简单版本代码如下:package day0314;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java原创 2021-03-17 17:28:49 · 183 阅读 · 4 评论 -
24. 应用层HTTP原理(2)——HTTP请求格式 / HTTP响应格式 / 常见的HTTP方法 / GET和POST的区别
HTTP请求格式1.首行:【方法(GET) / URL / 版本号(例如HTTP/1.1) ——这三部分用空格分隔开】2.协议头(header):【若干个键值对之间用“: ”(冒号空格)来分割】3.空行:【header的结束标志】4.正文:bodyHTTP响应格式1.首行:【版本号 / 状态码 / 描述信息 ——这三部分用空格分隔开】2.协议头(header):【若干个键值对之间用“: ”(冒号空格)来分割】3.空行:【header的结束标志】4.正文:body常见的HTTP方法原创 2021-03-14 21:21:10 · 263 阅读 · 5 评论 -
23. 应用层HTTP原理(1)——HTTP的状态码 / 常见Header/ Cookie的理解
HTTP状态码最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)HTTP的常见HeaderContent-Type: 数据类型(text/html等)Content-Length: Body的长度Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;User-Agent: 声明用户的操作系统和浏览器版本信息;referer: 当前页面是从哪个页面跳原创 2021-03-10 23:39:34 · 223 阅读 · 0 评论 -
22. 网络编程(2)——TCP 协议
网络编程需要依靠Socket API,在java标准库中有两种风格:1.(UDP)DatagramSocket:面向数据报(发送接收数据,必须以一定的数据报为单位进行传输)2.(TCP)ServerSocket:面向字节流UDP和TCP就是传输层的两个最重要的协议TCP服务器逻辑:1.初始化服务器2.进入主循环1)先去从内核中获取到一个TCP的连接2)处理这个TCP的连接a)读取请求并解析b)根据请求计算响应c)把响应写回给客户端服务器实现:import java.io.*;原创 2021-03-09 19:56:06 · 272 阅读 · 4 评论 -
22. 网络编程(1)——UDP 协议
网络编程需要依靠Socket API,在java标准库中有两种风格:1.(UDP)DatagramSocket:面向数据报(发送接收数据,必须以一定的数据报为单位进行传输)2.(TCP)ServerSocket:面向字节流UDP和TCP就是传输层的两个最重要的协议1. UDP实现一个最简单的服务器(回显服务器 echo server),客户端给服务器发送一个字符串,服务器把这个字符串返回显示出来对于一个服务器程序,核心流程分成两步1.进行初始化操作2,进入主循环,接收并处理请求(主循环就是原创 2021-03-09 15:37:51 · 333 阅读 · 3 评论 -
21. 网络基础(2)——网络传输的基本流程
网络传输的基础就是各个协议之间协同工作的成果主要有两个关键步骤:1.封装2.分用下面用一个发快递的例子来介绍一下封装和分用(其实封装就相当于往外发快递,分用就相当于拆快递)封装假设我现在要从陕西西安发到新疆乌鲁木齐一封信,那么就需要以下操作:1.应用层:需要根据用户输入的数据,把这个数据构造成一个应用层数据包,在我们的例子中,就相当于信封中的书信2.传输层:应用层协议把数据要交给传输层协议,来进一步封装。封装的意思就是给刚才的数据基础上加上一个传输层的协议报头也是字符串拼接。想象成,寄信的原创 2021-03-08 15:58:47 · 486 阅读 · 0 评论 -
20. 网络基础(1)——OSI七层模型 / TCP/IP五层模型
OSI七层模型OSI七层模型是常见的网络协议分层形式之一,其主要有以下几层:优点:它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯缺点:它既复杂又不实用; 所以我们引入TCP/IP四层模型.TCP/IP五层模型物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。原创 2021-03-08 15:16:12 · 265 阅读 · 1 评论 -
19. 基础IO(3)——序列化与反序列化
序列化:把一个结构化数据(对象)编程一个二进制的bit流(就比如游戏中的存档,保存游戏场景)反序列化:把二进制的bit流还原回原来的对象(就比如游戏中的读档)序列化import java.io.*;class Student implements Serializable { public String name; public int age; public int score;}public class IODemo6 { public static vo原创 2021-03-08 10:53:57 · 103 阅读 · 0 评论 -
18. 基础IO(2)——IO流
1. 字节流,字符流基本概念File类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成在java.io包中,流分为两种:字节流与字符流字节流:读写数据以字节为基本单位(处理二进制文件/数据的时候使用)字符流:独写数据以字符为基本单位(处理文本文档/数据的时候使用)2. 字节流1)InputStream:(输入)把输入设备读取到内存中2)OutputStream:(输出)把内存中的数据写入到输出设备中示例:复制图片package dqy0305;import java原创 2021-03-08 10:10:57 · 217 阅读 · 0 评论 -
17. 基础IO(1)——文件操作类
1.概念绝对路径:以C:/D:盘符号开头的路径,叫做绝对路径相对路径:先指定一个工作目录,然后用 . 或者 …(这里应该是两个点,从当前目录的上级目录开始找)开头的路径,表示一个具体的文件位置,相对路径的参照点就是当前的工作目录例如:工作目录为:D:\DownLoad\CAD此时对应的相对目录是:.\CER工作目录为:D:\DownLoad此时对应的相对目录是:.\CAD\CER工作目录为:D:\DownLoad\CAD\Data Links此时对应的相对目录是:…\CAD\CER以上三原创 2021-03-04 23:14:17 · 181 阅读 · 2 评论 -
16. 多线程案例(4)——线程池
线程的核心操作1.execute:把一个任务加到线程池中2.shutdown:销毁线程池中的所有线程线程池的组成部分1.先有一个类,来描述具体线程的要做的工作是啥(借助Runnable接口)2.还需要一个数据结构来组织若干个任务,BlockingQueue3.需要有一个类,表示工作线程4.还需要有一个数据结构,来组织若干个线程,LIst线程池代码import java.util.ArrayList;import java.util.List;import java.util.conc原创 2021-03-03 16:21:01 · 125 阅读 · 2 评论 -
15. 多线程案例(3)——定时器
定时器可以强制终止请求:浏览器内部都有一个定时器,发送了请求之后,定时器就开始计时。如果在打开浏览界面的时候,浏览器的响应时间过了响应时间,就会强制终止请求。1.定时器的构成1.使用一个类来描述“一个逻辑”,也就是要执行的任务,同时也要记录这个任务啥时候来执行2.使用一个 阻塞优先队列(既支持阻塞的特性,又支持按优先级的“先进先出”,实际上是堆) 来组织若干个Task,也就是收让队首元素为最早的任务,如果队首元素的时间还没到,那么其他元素肯定也不能执行3.需要有一个扫描线程,要循环检测队首元素是否需原创 2021-03-02 22:18:47 · 171 阅读 · 0 评论 -
14. 多线程案例(2)——阻塞队列
生产者消费者模型生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。阻塞队列是并发编程中的一个重要基础组件,帮助我们实现“生产者-消费者模型”(是一种典型的处理并发编程的模型)如果入队列太快了,继续入队列就会阻塞,一直原创 2021-03-02 15:10:31 · 180 阅读 · 0 评论 -
13. 多线程案例(1)——单例模式(饿汉模式/懒汉模式)
1.饿汉模式只要类被加载了,实例就会立即创建(实例创建时机比较早,并且只会创建一个实例)类加载只有一次机会,不可能并发执行对于饿汉模式,多线程调用getInstance()方法,由于getInstance()里只做了一件事:读取instance实例的地址,也就是可以多个线程同时读取一个变量——线程安全public class ThreadDemo19 { //先创建一个表示单例的类 //饿汉模式的单例实现 static class Singleton{ //原创 2021-03-01 17:50:40 · 606 阅读 · 2 评论 -
12. wait() 和 notify()的区别(对象的等待集)
1. wait方法当条件不成熟时就等待运行分为三步:1.释放锁2.等到通知3.收到通知后尝试重新获取锁继续往下执行wait方法必须在synchronized代码内部使用2. notify方法当条件成熟时,通知指定线程来工作notify方法必须在synchronized代码内部使用wait和notify结合:import java.util.Scanner;public class ThreadDemo18 { public static void main(Strin原创 2021-03-01 00:15:44 · 733 阅读 · 0 评论 -
11. volatile关键字
1. volatile作用保持内存可见性2. 没有用volatile时,代码出现的问题import java.util.Scanner;public class ThreadDemo1 { public static int flag = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ @Ove原创 2021-02-28 23:21:42 · 106 阅读 · 0 评论 -
10. 线程安全问题 / synchronized 关键字(重点)
1. 线程不安全线程不安全代码:public class ThreadDemo13 { static class Counter{ public static int count = 0; public void increase(){ count++; } } public static void main(String[] args) throws InterruptedException {原创 2021-02-28 00:42:42 · 241 阅读 · 0 评论 -
9.线程的状态
通过以下代码来获取到线程状态 public static void main(String[] args) { for (Thread.State state : Thread.State.values()){ System.out.println(state); } }得到的状态有:原创 2021-02-27 18:38:01 · 113 阅读 · 0 评论 -
8.启动一个线程 / 中断一个线程 / 等待一个线程
启动一个线程调用start()方法,才能正式启动一个线程中断一个线程中断就是让一个线程结束,结束可能有两种情况:1.已经把任务执行完了以下代码为例:public class ThreadDemo7 { private static boolean isQuit = false; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(){原创 2021-02-27 17:43:03 · 214 阅读 · 4 评论 -
7. Thread的几个常见方法属性
代码示例://Thread里面的常见属性public class ThreadDemo6 { public static void main(String[] args) throws InterruptedException { Thread t = new Thread("xc"){ @Override public void run() { System.out.println(Thread..原创 2021-02-27 00:51:18 · 290 阅读 · 2 评论 -
6. run()和start()方法的区别
以下代码为例:public class ThreadDemo3 { static class MyThread extends Thread{ @Override public void run() { System.out.println("线程"); } } public static void main(String[] args) { Thread t = new MyT原创 2021-02-27 00:17:33 · 172 阅读 · 0 评论 -
5.串行执行和并发执行的效率对比
并发执行利用了线程的手段,可以提高执行效率,这里用一个简单的例子来进行简单对比1.串行执行public class ThreadDemo2 { private static long count = 100_0000_0000L; public static void main(String[] args) { // serial(); concurrency(); } //1.如果采用串行执行 大概是10s private原创 2021-02-26 18:08:40 · 702 阅读 · 0 评论 -
4. 线程代码创建(五种方法)
创建线程方法方法一:通过继承Thread类的方法public class ThreadDemo1 { static class MyThread extends Thread{ @Override public void run() { System.out.println("我是一个线程"); } } public static void main(String[] args) { Thr原创 2020-07-07 01:05:19 · 552 阅读 · 0 评论 -
3. 线程概念篇/ 线程和进程的区别
线程(Thread)理解:1.线程其实是包含在进程中的2.一个进程中可能有多个线程3.每个线程都有一段自己要执行的逻辑(指令)每个线程都是一个独立的“执行流”4.同一个进程中的很多线程之间 共享了一些资源(内存资源、打开的文件)5.不共享的资源:上下文/状态/优先级/记账信息 /每个线程要独立的参与CPU调度 / 内存中有一块特殊的区域(栈)是每个线程要独立一份进程是操作系统分配资源的最小单位线程是操作系统进行调度和执行的最小单位...原创 2020-07-07 00:03:40 · 193 阅读 · 0 评论