猪哥66

猪哥66 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

微信搜索:裸睡的猪

个人动态

猪哥66 发布了文章 · 2月25日

Java异常简单介绍

本文收录在猪哥GitHub:https://github.com/pig6/Java 中,本项目收集一线大厂面试、实战、Java学习路线等。

一、异常产生的原理

JVM针对程序运行监测出的异常创建个异常对象,对象包含了异常产生的:内容、原因、位置。根据程序逻辑将异常对象层层抛出或者处理。

二、Throwable体系

1.Error

错误Error一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。

  1. VirtualMachineError

    • OutOfMemoryError
    • StackOverflowError
  2. LinkageError

    • NoClassDefFoundError
    • NoSuchMethodError
  3. 。。。

2.Exception

1> 运行时异常 RuntimeException:是指“可以避免的异常”,如 null引用异常,这类异常都是由程序内部原因造成的,是可以避免的,考验开发的严谨性,因此这个问题是我们作为一名开发必须要避免发生的,再大的公司每年总会有几次事故是因为NPE导致的,我们如果因为这种问题被通报了就是很尴尬的事情了(对生产环境一定要有足够的敬畏心啊)。

常见的运行时异常有以下几种:

  • NullPointerException
  • ClassCastExecption
  • ArithmeticException
  • IndexOutOfBoundsException
  • ClassNotFoundException

2> 非运行时异常:代表“无法避免的异常” 如io异常,往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生,所以这类异常必须捕获,这就是我们在使用io资源或者操作线程比如sleep的时候必须要捕获或者抛出的原因。

常见的有:

  • IOException
  • InterruptedException
  • SQLException
  • 自定义的非RuntimeException

在这里插入图片描述

3.Check And UnCheck

1>CheckedException:等价于非运行时异常,要么捕获,要么抛出,否则编译无法通过。代表“无法避免的异常” 如io异常 往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生
2>UnCheckedException:包括:Error&运行时异常

三、方法

  • toString:异常类信息+异常信息描述
  • getMessage:异常信息描述
  • printStackTrace:最常用打印完整的错误堆栈信息

四、catch还是throw

通常应该捕获那些知道如何处理的异常,而将那些不知道如何处理的异常进行传递。如果想传递一个异常,就必须在方法的声明中添加一个throws说明符,以便告知调用者这个方法可能会抛出异常。

五、finally

  1. 无论是否出现异常都会执行
  2. 必须与try一起使用
  3. 注意:finally中有return语句永远返回finally中的return,try块中的return不会生效

在这里插入图片描述

六、其他

  1. 如果父类抛出了多个异常,子类重写父类方法的时候,抛出和父类相同的异常//是父类异常的子类//或者不抛出
  2. 父类方法没有抛出异常,子类重写父类该方法的时候也不可以抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
  3. 使用习惯:

    • 不要丢弃异常,捕获异常后需要进行相关处理。如果用户觉得不能很好地处理该异常,就让它继续传播,传到别的地方去处理,或者把一个低级的异常转换成应用级的异常,重新抛出
    • catch语句应该指定具体的异常类型。不能把不该捕获的异常也捕获了
    • 在finally里面释放资源。如果finally里面也会抛出异常,也一样需要使用try..catch处理
    • 不要把大量的代码塞在try...catch块里面,分离各个可能出现异常的语句并分别捕获异常

遗留问题: 编码中是该捕获Exception还是Throwable呢?欢迎评论区交流!!

查看原文

赞 1 收藏 1 评论 0

猪哥66 发布了文章 · 2月23日

互联网大厂必学技能:压力测试!

本文收录在猪哥GitHub:https://github.com/pig6/Java 中,本项目收集一线大厂面试、实战、Java学习路线等。

压测全称为压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。

在开发接口或者功能点完成后,就需要对接口或功能点压力测试,测试出接口的极限以应对较大并发,举一个最直接的例子:淘宝双十一购物节,2018年淘宝交易创建峰值达到49.1万笔/秒,而在双十一之前淘宝都要对系统进行压测,看是否能够抗住每年创新高的并发!

大白话:不停地请求服务的接口,设置每秒的请求量以及持续时间,看看什么时候服务开始处理失败,从而得出服务的性能指标。

一、笔记目的

  • 简单认识压测(的目的)
  • 介绍压测平台应该有哪些能力

二、压测目的

  • 挖掘系统瓶颈点

    • cpu计算能力
    • 业务代码(频繁full gc等)
    • DB
    • 线程模型
    • 带宽等
  • 建立性能基线

    • qps (request per second)
    • rt (response time)
    • 用于线上扩容策略配置等
  • 优化系统性能

    • 配置DB主从
    • jvm参数优化
    • 缓存改造
    • 线程模型改造等

三、压测平台应该具备的能力

1.压测场景

  • rpc场景(一般为压测单个服务的性能)

    • 回放录制的流量
    • 自定义的流量
  • http场景(一般为全链路压测)

    • 回放录制的流量
    • 自定义的流量

2.数据

准备数据用于压测的时候使用

  • 录制任务

    • http请求的录制
    • rpc请求的录制

3.压测参数配置

  • 压测类型

    • 普通压测(普通循环播放流量)
    • 调试(单次流量播放,一般用于调试链路是否接通)
    • 递增(设置压测的多个阶段,每个阶段配置不同的qps以及持续时长)
  • 配置

    • 变量配置(单是流量录制是不够的,特殊的接口(比如关注行为)需要变化请求的参数,因此需要支持变量配置)

      • 自增变量

        • 设置起止值
        • 设置步长
      • 文件变量

        • 读取变量列
      • 时间变量

        • 对当前毫秒戳做加减操作
      • 计算变量

        • uuid
        • 区间random
      • 预定义变量(就是写死一个值)
    • 请求配置

      • 指定接口与方法/url
      • 指定机器
      • 超时时间
      • 变量

        • 指定配置好的变量
    • 压测配置

      • 初始qps
      • 期望最大qps
    • 词表配置

      • 循环回放流量录制中的流量
    • 资源隔离

      • DB隔离
      • 缓存隔离
      • MQ隔离
    • 静默期(那个时间段不可以进行压测)

4.保护策略

配置不同的监控项以及异常的处理策略:比如停止压测或者降低压测流量等

  • db保护策略

    • 配置db的告警阈值

      • 告警之后自动降低指定的qps或者停止压测
  • 机器保护策略

    • 监控cpu gc 内存等等等等
    • 降低qps或者停止
  • 服务保护策略

    • 监测请求的响应情况
    • 降低qps或者停止

5.监控

配置不同的监控项用于判断性能瓶颈

  • 客户端响应情况监控

    • qps
    • rt
    • 错误率
  • 服务端监控####

    • 业务日志
    • 机器

      • cpu
      • 线程池
      • 服务接口等待队列大小等

四、压测报告

  • 需要输出压测报告用于分析和记录

    • 各个监控项的指标
    • 压测结果的指标
    • 等等

今天为大家简单列举了一些压测的知识点,以后有时间再为大家详细介绍哦,欢迎一键三连!!!

查看原文

赞 4 收藏 5 评论 0

猪哥66 发布了文章 · 2月2日

【重点】Java大厂面试10个知识点汇总

本文收录在猪哥GitHub:https://github.com/pig6/Java 中,本项目收集一线大厂面试、实战、Java学习路线等。

本篇笔记是我五年来的工作学习面试经验&记录,希望对大家有一些帮助

一、java基础

  • Object类的所有方法:getClass hashCode equals clone toString notify notifyAll wait finalize
  • 八种基本数据类型&取值范围
  • 自动拆装箱&包装类型的缓存机制
  • ThreadLocal 理解String&不可变性 StringBuffer StringBuilder源码
  • ArrayList LinkedList HashMap(重点,可以花一天时间彻底掌握) LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet源码
  • 异常体系结构
  • Java8:理解函数式编程 流式操作 CompletableFuture

二、并发编程

必考,高并发的解决必要手段,对于juc以及线程模型的演进过程的掌握非常重要

  • 理解并发与并行
  • 线程池的原理:理解每个参数
  • Thread Runnable Callable
  • AQS(重要:常常会配合synchronized来说) Condition
  • Lock:ReentrantLock ReentrantReadWriteLock
  • Semaphore CountDownLatch CyclicBarrier
  • 各种Atomic
  • ConcurrentHashMap BlockingQueue CopyOnWriteArrayList
  • Executors
  • 线程的状态转换:wait sleep notify notifyAll join park
  • 停止线程的方法
  • 线程模型:理解BIO、NIO(重点)、AIO、了解netty
  • 并发包就那些东西,掌握AQS之后其他的很快就打通了,所以不用

三、jvm

《深入理解java虚拟机》没事就看一遍,每次都会有新的理解

  • jvm内存结构
  • 常用调优参数
  • gc算法
  • gc的工具:CMS&G1重点&ZGC
  • java内存模型:

    • 可见性、原子性、顺序性、happens-before、内存屏障、volatile、final
    • synchronized(对象头):偏向锁->轻量级锁->重量级锁、monitor、锁优化、锁消除、锁粗化、自旋锁、可重入锁
  • 常用工具以及命令
  • 类加载过程
  • 对象创建过程
  • fullGC的排查思路
  • 工具:jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, Arthas

四、设计模式

  • 创建型:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
  • 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
  • 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

五、mysql

下面列出来的全是重点

  • 常用sql以及内置函数
  • 索引

    • hash索引
    • b+树的索引
    • 聚集索引&非聚集索引
    • 回表
    • 联合索引:最左前缀&覆盖索引&索引下沉
  • 事务&隔离级别&实现原理:readview undolog redolog mvcc
  • 锁的使用&锁算法&行锁&表锁&乐观锁&悲观锁
  • 连接查询的原理(算法)
  • binlog&使用场景
  • 分库分表:垂直&水平
  • 工具:explain

六、redis

《redis的设计与实现》看完这本书就行了,深入浅出,很快就可以看完和掌握,直接搞定redis

  • 熟练五种类型对象&适用场景:字符串 列表 哈希 集合 有序集合
  • 了解底层数据结构:SDS 链表 字典 跳跃表 整数集合 压缩列表
  • 淘汰策略
  • RDB&AOF
  • 复制功能的实现
  • Sentinel&集群的结构
  • 发布订阅&事务
  • 分布式锁
  • 常见问题&解决方案:缓存击穿,缓存穿透,缓存雪崩

七、web

感觉很少有人问了,应届生可能问的多些

  • 三次握手与四次挥手
  • http/1.0 http/1.1 http/2之间的区别
  • http中 get和post区别
  • 理解https加密过程
  • forward&redirect的区别
  • CSRF&XSS攻击与防范
  • 常见的web请求返回的状态码
  • cookie&session
  • Servlet&filter&listener
  • DNS
  • tomcat&nginx区别

八、spring

说实话问到我的不多,感觉掌握下面几个足够了

  • IOC&DI&AOP
  • 掌握常用注解
  • 如何解决循环依赖
  • 事务传播机制
  • 事务失效场景
  • springMVC的理解
  • springboot的理解

九、分布式&高可用

平时多注意怎么处理好程序可能遇到的极端情况,保证服务的高可用

  • zookeeper

    • 理解使用:文件系统+监听器
    • 了解选举算法&分布式锁的实现
  • mq(重要,有时候面试官直接一串mq连环炮就可以决定要不要一个人了)

    • 作用:异步 解耦 削峰
    • kafka(之后会就kafka写一个系列)

      • 设计架构
      • 如何保证高可用
      • 如何保证高吞吐
      • 如何实现局部有序
      • 重复消费的问题
      • 延迟消息
  • 了解dubbo&spring cloud&Consul工作流程
  • 限流&熔断:Hystrix/Resilience4j(高可用的必须中间件)
  • 链路追踪(了解实现原理)

十、算法&数据结构

常刷leetcode

  • 栈、队列、链表、数组、哈希表、树、堆、图
  • 快排&二分&分治&递归&滑动窗口/双指针&BFS&DFS

十一、工具

  • git多分支协作流程
  • maven常用命令&生命周期
  • linux常用命令:tail grep awk sed等等

备注

  • 看着确实很绝望,up本人也是
  • 个人难免有盲区,欢迎评论区指正&补充,会持续更新
  • but
  • 种一棵树,最好的时间是十年前,其次是现在,大家共勉
码字不易,欢迎一键三连 关注猪哥!
查看原文

赞 12 收藏 11 评论 0

猪哥66 发布了文章 · 2020-11-16

Python就业指导

一年一度的金三银四招聘旺季又要到了,最近有很多同学希望我能给他们一些关于python的就业指导;之前出过一期关于java的就业指导,但是并不是很完善,所以希望这期关于python的就业指导能够很全面很详细的聊聊就业的那些事,以下都是猪哥的个人经验和建议,如有偏差还望指正!

一、就业方向

不管做任何事,一开始就有一个方向会让你有很高的效率;大家都听说python几乎无所不能,哪具体有哪些职位呢?

  1. 测试开发工程师
  2. 运维工程师
  3. 后端开发工程师
  4. web开发工程师
  5. 游戏开发工程师
  6. 爬虫工程师
  7. 全栈工程师
  8. 云计算工程师
  9. 教学讲师(可兼职)
  10. 数据分析/挖掘工程师
  11. 算法工程师
  12. 图像识别工程师
  13. 自然语言处理(NLP)工程师
  14. 量化策略工程师
  15. 人工智能相关
  16. 架构师

上面这些只是我所知道的职位,我相信还有很多关于python的职位,你是否已经有心仪的职位?

这几年招聘我感觉最大的变化是:相比过去现在招聘java或其他语言岗位时,很多都会要求面试者会一些python,不信你可以去招聘网上看看;

二、岗位要求

在选择完就业方向或者学习方向之后,我们需要具备什么能力或学习哪些知识之后就可以去找工作了呢?

因为技术的不断更新迭代,各种框架流行,想要知道当下需要学习哪些知识点可以直接去招聘上看看岗位要求,这里我列举几个和大家一起分享:

python测试开发工程师:


  • 熟练掌握 python ,熟悉 pytest
  • 熟练掌握 linux 命令,具备 shell 脚本开发能力* 熟悉交换机基本配置命令

python web开发工程师:


  • 熟悉 linux 的基本操
  • 至少熟悉一种 python 后端框架: flask / django 等
  • 掌握一种主流数据库( Mysql / MongoDB )的开发和实现原理,具备数据库设计经验
  • 熟悉 tcp / ip 协议、 http 协议,掌握 Web 开发相关技术
  • 精通 django 开发的优先

python爬虫工程师:


  • 熟悉一种开源爬虫框架,如 scrapy 、 webmagic 、 nutch 、 heritrix
  • 理解 http 协议,熟悉 HTML 、 DOM 、 XPath
  • 加分项:有大规模分布式海量数据处理经验优先(如 Hadoop / Hbase / Spark / Flink / Hive 等)有移动端抓取经验有爬虫框架开发经验熟悉反爬虫、验证码识别技术有数据仓库相关开发和使用经验有机器学习相关应用经验

python量化交易工程师:


  • 强学术背景,对数学,统计,算法基础扎实。尤其是随机微机分,随机过程,偏微分方程,统计概率,线性代数等
  • 熟练使用python、数据结构、算法等
  • 对神经网络,机器学习了解,包括但不仅限于:逻辑回归/支持向量机/高斯朴素贝叶斯/随机森林
  • 熟悉数字货币交易相关知识者优先
  • 有独立研发做事策略,统计套利,金融衍生品定价经验优先
  • 数学,物理,统计等理科硕士及以上毕业生,985/211加分。

更多岗位要求大家可以自己去招聘网站上看,就不一一列举。

三、刷面试题

刷面试题这一步是在面试之前必不可少的,相信有很多同学总是会感叹:自己做项目明明都会,可是一到面试的时候面试官一开始总是问一些用不上的知识点,这让我很头疼!其实面试官问这些题目一是考察你对语言及其原理是否有了解,二是考察你解决问题的思维方式,这都是体现你coding能力的重要因素;

有些知识的可能时间一长就忘记了,我们都知道艾宾浩斯遗忘曲线:最初遗忘速度很快,以后逐渐缓慢,所以考前复习是必不可少的;有些准备去bat的同学可能提前几个月就开始刷题,技术面试的好坏决定着你薪资的高低!

废话不多说直接上干货,送大家一份 《Python面试宝典》: 链接:https://pan.baidu.com/s/1ytJD... 提取码: t8tq

四、制作简历

我们经历了漫长的学习和枯燥的刷题,终于可以投简历了,可是却有很多同学发现投出去的简历如同扔进海里的针,几乎都没有人回复你,这又是为何?如果排除你投递职位不符合的话那只能说明你的简历被pass掉了,如何才能避免自己的简历不被hrbp pass呢?hr看简历可能只会看以下几个点:

  1. 学历
  2. 工作经历
  3. 技术栈

由于学历我们很难去包装,所以在写项目经历和技术栈时我们尽量写的高大上一些,这猪哥并不是要你去造假,而是注意技巧和用词,例如参与一个项目时你可以写自己是核心开发,而你在写技术栈的时候也可以多些一些,比如:熟练使用python,熟悉js,html,sql等,了解hadoop等大数据知识,具有高并发,高可用思想;

对于那些你不熟悉的知识,可以临时突击下,然后用了解、理解等等这些词,即使面试官问你你答不上来的时候也没关系,毕竟你只是说了解,过了简历塞选这关才是你的目的!

关于技术栈的编写大家可以参照企业招人的要求,比如xxx公司招人要求如下:

最简单我就按照他这几点要求写,然后再多送几个技术栈,相信hr看见你的简历都会有种似曾相识的感觉:确认过眼神,这是对的简历!

聊了这么多,简历模版再送一波:链接:https://pan.baidu.com/s/15yO7... 密码:sic3

五、投递简历

投递简历难道也有技巧吗?不就是在各个招聘app上投吗?

其实投简历的方式有很多种,先给大家说说在各个招聘app上投:58上有很多培训机构伪装为公司,然后你去了才发现他们要你报名培训,所以我基本不用;大街拉钩的话最近几年也慢慢不行了;一般用的话就是boss和智联招聘,而智联招聘出现过用户信息被卖的事情,所以现在基本用的最多就是boss;当然还有一个软件大家也可以逛逛:脉脉,这里会有技术人员直接发帖招聘,很多都是名企的程序员。

除了招聘网站投递,还有就是官网投递和内推,内推是双方都获利的方式,因为他内推你如果入坑成功他会有奖励金!

当然如果你在圈子中慢慢有了影响力,自然会有人找上门!

六、面试技巧

历经千辛万苦我们终于等来了面试机会,那面试的流程是怎样的呢?

首先我们来看下一般大厂的面试流程:

  1. 电话初面:自我介绍,然后聊语言原理,流行框架实现原理,最后聊聊项目;注重细节和原理,可能会有一到两次电话面试;
  2. 技术面谈:自我介绍,算法,项目,聊的知识面比较广;可能存在交叉面试(所谓交叉面试就是其他部门主管来面,避免裙带关系);
  3. 高管复试:他们最后的高管复试会涉及到相关的技术问题,大部分是对你的整体价值观做宏观的把控(比如上进心,责任心,心态,工作激情等)
  4. 基本就是从大方向了解一下您的心态、抗压能力,工作中的角色、未来大致的规划以及对公司的意向度

其次我们来看看每一步需要注意的点:

  • 在你接到心仪公司的电话面试时,你内心肯定是很激动的,这时候你需要确定你周围环境以及自己的状态是否合适面试,如果不适合的话可以和面试官说现在不方便能否推迟一点或约个时间,阿里电话面试一般会在晚上7-8点,这个时间比较合适。
  • 面试一般开始都会让你做一个简短的自我介绍,所以你可以之前准备一份简短的自我介绍然后背下来,说的时间最好控制在一分钟左右;
  • 技术面试没什么好说的,都是实打实的;说一下最后hr面试吧,如果你技术过了的话一般hr这关没什么问题,但和hr交流时需要注意技巧避免被套路,比如:hr肯定会问你在上一家公司的工资,这时候你可以说:公司有规定不允许向外透露公司的薪资结构;如果非要你说你也可以适当提高,他会根据你当前薪资做参考;即使后面需要你提供银行流水或薪资证明也是有办法的,大胆一点!

最后,猪哥想要告诉你的是:每一次面试都是一次与面试官之间的较量,谁掌握主动谁就在这次较量中胜出,而在面试中作为面试者很难去主动,那如何才能掌握主动呢,以下是我积累的几点小技巧: - 在与面试官第一次接触时主动询问他贵姓,以这种主动提问的方式来开始此次面试,这也是一种有礼貌的体现; - 在答题过程中尽量将知识点引向自己擅长的方向 - 如果面试中存在自己确实不了解的知识点可以大胆向面试官提问,这是一次难得的交流解疑答惑的机会,会给面试官一个谦虚好学不懂就问的好印象

总结

如果你面试成功,那么我恭喜你;如果你面试失败,我会由衷的替你开心,因为只有失败你才会去总结自己的缺点;

给大家讲一讲猪哥第一次面试经历,那是在我大三暑假的时候,因为自己当时也是个小萌新,所以肯定被pass了,而hr当着我的面把我的答题纸和简历撕掉扔到垃圾桶里,那次对我打击太大了!那个暑假我没回家,我把qq和微信都卸载了,一个人在寝室开始走上自学java之路。在经历半年自学之后工作也找到了,而且实习期间就是小组长,大四还参加了一个全国算法比赛虽然拿了第三但是自己并不满意。

声明下猪哥是三本学校并且成绩不好尤其是英语超烂的那种,学的是通信工程,所以也是自学编程入门,给大家讲这个故事是想让大家自信起来,勇敢的去面对每一次面试!坚信自己去新公司是去技术扶贫!!!

最后再送一波老男孩的就业指导视频:链接:https://pan.baidu.com/s/1VX2b... 密码:ypd1

希望您能学有所成!!!

查看原文

赞 0 收藏 0 评论 0

猪哥66 发布了文章 · 2020-11-16

Python学习路线

此视频资源收集于网络,如有侵权请联系删除!!! 此视频资源仅用作个人学习,请勿用于商业获利,造成后果自负!!!

经历长达近一个月的资源筛选过程终于结束,总共1.5T百度网盘的资源经过:去重、筛选、整理、归档之后一份粗略的Python学习曲线资源已经成型,虽然中间经历了很多坎坷,不过最终还是完成,猪哥也是第一时间与大家分享出来。

资料主要分为两部分:一、各个学习网站论坛等,二、百度云资料。网站论坛资源更新快,可以与大家互动;而百度云资源主要为视频,方便大家下载和在线观看,两种资源结合使用,学习和查找知识更方便!

一、网站论坛学习资源

  1. 名称链接说明实验楼:https://www.shiyanlou.com 提供免费的Linux实验环境
  2. Py资源中文大全:http://t.cn/Rq0C0ET 各种python包和管理工具
  3. PEP8 Py编码规范中文版:https://dwz.cn/30uIzs9W 代码规范与基础同样重要
  4. PEP20著名的Py之禅:https://dwz.cn/r2u2zV0c Py编程和设计的指导原则
  5. Google Py编程风格指南:https://dwz.cn/HDTKsCai 实践出真知
  6. Py Code Examples:https://dwz.cn/dawtruYk 精细到方法级别的代码案例
  7. Py Module of the Week:https://pymotw.com 每篇介绍一个 Py标准库的使用
  8. 菜鸟教程:http://t.cn/RLGeMuW 最经典的一个语言教程网站
  9. 廖雪峰Py教程:https://dwz.cn/drygpxjk 大牛带你简单快速入门
  10. Py自动化测试博客:https://dwz.cn/raopItkV 一个自动化测试大佬的博客
  11. Py中文学习大本营:http://www.pythondoc.com 一个不错的Flask学习网站
  12. 刘江的Django:https://dwz.cn/udQayyZY 最适合入门的Django教程
  13. 莫烦Py:https://morvanzhou.github.io 机器学习方面有着不错的造诣
  14. 吴恩达机器学习:https://dwz.cn/F8Aad3DY 网易云课堂(中/英字幕)
  15. 几个Py练习题:https://dwz.cn/ExJnmwOJ 有几个不错的实用练习题
  16. CheckiO:https://py.checkio.org 一个学习Py的有趣网站

二、学习曲线

这个学习曲线是我在某马论坛上看到的,觉得不错就推荐给大家,同时也感谢某马的开源免费精神,猪哥也是受益颇多!

image

三、优质资源

我把这些资源分为了七个不同的阶段,难度是依次递增,其实就是对应上面学习曲线图;

本资源一共800G,永久保存,并且会持续更新,建议大家转发收藏,方便以后查找学习;

这是猪哥推荐的Python学习曲线,基本上是某马的视频教程,这个学习曲线适合零基础的同学:

四、获取方式

  1. 链接:https://pan.baidu.com/s/1SzSW7sexDUNZgsvxi7eF-Q 密码:pig6
  2. 如果链接失效,可在下方留言或者私信猪哥哦,猪哥会及时更新!

五、猪哥有话说

如果你觉得此文章好请分享给你的每一位朋友:也许你一个不经意的善意之举,却是他人人生的一个转折点。

查看原文

赞 26 收藏 19 评论 9

猪哥66 发布了文章 · 2020-08-15

Pycharm、Idea、Goland 官方汉化来了

作为软件开发的编辑器,不得不提大名鼎鼎的 JetBrains 公司,其出品的软件:Pycharm、Idea、WebStorm、phpstorm、CLion、RubyMine、AppCode、DataGrid,目前来讲都是最受欢迎的!

可是由于软件都是英文的这对于一些新手来说很不适应,于是有很多人开始寻找汉化教程。

在官方没有出汉化插件之前,一直都用的是 平方X 的汉化教程,但是汉化必须要跟随这新版本的迭代,所以有些汉化难免不匹配或者会出现 无法点击 设置 的问题。

在Idea 2020.1 版本的新功能中,我们看到了 官方的汉化插件出现,这样极大的方便了新手的汉化,下面猪哥就给大家截图看看如何汉化吧!
在这里插入图片描述

具体步骤:
打开pycharm左上角的file(文件) > 选择settings(设置) > 打开plugins(插件) > 搜索chinese(中文插件),下载好后重启pycharm。

mac系统是 :Preferences > plugins(插件) > 搜索chinese(中文插件),下载好后重启pycharm。

看看汉化后的效果:
在这里插入图片描述

查看原文

赞 0 收藏 0 评论 0

猪哥66 发布了文章 · 2020-04-02

Python正则表达式,这一篇就够了!

之前我们讲解了 正则表达式语法 的起源、发展、流派、语法、引擎、优化等相关知识,今天我们主要来学习一下 正则表达式在 Python语言 中的应用

大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数。
在这里插入图片描述
re模块主要定义了9个常量、12个函数、1个异常,每个常量和函数猪哥都会通过实际代码案例讲解,让大家能更直观的了解其作用!

注:为避免出现代码格式错乱,猪哥尽量使用代码截图演示哦。

一、re模块简介

聊到Python正则表达式的支持,首先肯定会想到re库,这是一个Python处理文本的标准库

标准库的意思表示这是一个Python内置模块,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块:https://docs.python.org/3/py-...

因为re是内置模块,所以不需要再下载,使用时直接引入即可:

import re

re模块官方文档:https://docs.python.org/zh-cn...
re模块库源码:https://github.com/python/cpy...

二、re模块常量

常量即表示不可更改的变量,一般用于做标记。

re模块中有9个常量,常量的值都是int类型!
在这里插入图片描述
上图我们可以看到,所有的常量都是在RegexFlag枚举类来实现,这是在Python 3.6做的改版。在Python 3.6以前版本是直接将常量写在re.py中,使用枚举的好处就是方便管理和使用!
在这里插入图片描述

下面我们来快速学习这些常量的作用及如何使用他们,按常用度排序!

1. IGNORECASE

语法: re.IGNORECASE 或简写为 re.I

作用: 进行忽略大小写匹配。

代码案例:
在这里插入图片描述
在默认匹配模式下大写字母B无法匹配小写字母b,而在 忽略大小写 模式下是可以的。

2. ASCII

语法: re.ASCII 或简写为 re.A

作用: 顾名思义,ASCII表示ASCII码的意思,让 \w, \W, \b, \B, \d, \D, \s\S 只匹配ASCII,而不是Unicode。

代码案例:
在这里插入图片描述
在默认匹配模式下\w+匹配到了所有字符串,而在ASCII模式下,只匹配到了a、b、c(ASCII编码支持的字符)。

注意:这只对字符串匹配模式有效,对字节匹配模式无效。

3. DOTALL

语法: re.DOTALL 或简写为 re.S

作用: DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符\n默认模式下.是不能匹配行符\n

代码案例:
在这里插入图片描述
在默认匹配模式下.并没有匹配换行符\n,而是将字符串分开匹配;而在re.DOTALL模式下,换行符\n与字符串一起被匹配到。

注意:默认匹配模式下.并不会匹配换行符\n

4. MULTILINE

语法: re.MULTILINE 或简写为 re.M

作用: 多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的。

代码案例:
在这里插入图片描述
正则表达式中^表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符\n后面的字符。

注意:正则语法中^匹配行开头、\A匹配字符串开头,单行模式下它两效果一致,多行模式下\A不能识别\n

5. VERBOSE

语法: re.VERBOSE 或简写为 re.X

作用: 详细模式,可以在正则表达式中加注解!

代码案例:
在这里插入图片描述
默认模式下并不能识别正则表达式中的注释,而详细模式是可以识别的。

当一个正则表达式十分复杂的时候,详细模式或许能为你提供另一种注释方式,但它不应该成为炫技的手段,建议谨慎考虑后使用!

6.LOCALE

语法: re.LOCALE 或简写为 re.L

作用: 由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配,这个标记只能对byte样式有效。这个标记官方已经不推荐使用,因为语言区域机制很不可靠,它一次只能处理一个 "习惯”,而且只对8位字节有效。

注意: 由于这个标记官方已经不推荐使用,而且猪哥也没使用过,所以就不给出实际的案例!

7.UNICODE

语法: re.UNICODE 或简写为 re.U

作用: 与 ASCII 模式类似,匹配unicode编码支持的字符,但是 Python 3 默认字符串已经是Unicode,所以有点冗余。

8. DEBUG

语法: re.DEBUG

作用: 显示编译时的debug信息。

代码案例:
在这里插入图片描述

虽然debug模式下确实会打印编译信息,但猪哥并不理解这是什么语言 以及表达的含义,希望了解的朋友能不吝赐教。

9.TEMPLATE

语法: re.TEMPLATE 或简写为 re.T

作用: 猪哥也没搞懂TEMPLATE的具体用处,源码注释中写着:disable backtracking(禁用回溯),有了解的同学可以留言告知!
在这里插入图片描述

10. 常量总结

  1. 9个常量中,前5个(IGNORECASE、ASCII、DOTALL、MULTILINE、VERBOSE)有用处,两个(LOCALE、UNICODE)官方不建议使用、两个(TEMPLATE、DEBUG)试验性功能,不能依赖。
  2. 常量在re常用函数中都可以使用,查看源码可得知。在这里插入图片描述
  3. 常量可叠加使用,因为常量值都是2的幂次方值,所以是可以叠加使用的,叠加时请使用 | 符号,请勿使用+ 符号!在这里插入图片描述

最后来一张思维导图总结一下re模块中的常量吧。
在这里插入图片描述

三、re模块函数

re模块有12个函数,猪哥将以功能分类来讲解;这样更具有比较性,同时也方便记忆。

1.查找一个匹配项

查找并返回一个匹配项的函数有3个:search、match、fullmatch,他们的区别分别是:

  1. search: 查找任意位置的匹配项
  2. match: 必须从字符串开头匹配
  3. fullmatch: 整个字符串与正则完全匹配

我们再来根据实际的代码案例比较:

案例1:
在这里插入图片描述
案例1中search函数是在字符串中任意位置匹配,只要有符合正则表达式的字符串就匹配成功,其实有两个匹配项,但search函数值返回一个。

match函数是要从头开始匹配,而字符串开头多了个字母a,所以无法匹配,fullmatch函数需要完全相同,故也不匹配!

案例2:
在这里插入图片描述
案例2删除了text最开头的字母a,这样match函数就可以匹配啦,而fullmatch函数依然不能完全匹配!

案例3:
在这里插入图片描述
案例3中,我们只留下一段文字,并且与正则表达式一致;这时fullmatch函数终于可以匹配了。

完整案例:
在这里插入图片描述
注意:查找 一个匹配项 返回的都是一个匹配对象(Match)。

2.查找多个匹配项

讲完查找一项,现在来看看查找多项吧,查找多项函数主要有:findall函数finditer函数

  1. findall: 从字符串任意位置查找,返回一个列表
  2. finditer:从字符串任意位置查找,返回一个迭代器

两个方法基本类似,只不过一个是返回列表,一个是返回迭代器。我们知道列表是一次性生成在内存中,而迭代器是需要使用时一点一点生成出来的,内存使用更优。

在这里插入图片描述
如果可能存在大量的匹配项的话,建议使用finditer函数,一般情况使用findall函数基本没啥影响。

3.分割

re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数, flags表示模式,就是上面我们讲解的常量!

在这里插入图片描述
注意:str模块也有一个 split函数 ,那这两个函数该怎么选呢?
str.split函数功能简单,不支持正则分割,而re.split支持正则。

关于二者的速度如何? 猪哥实际测试一下,在相同数据量的情况下使用re.split函数与str.split函数执行次数执行时间 对比图:
在这里插入图片描述
通过上图对比发现,1000次循环以内str.split函数更快,而循环次数1000次以上后re.split函数明显更快,而且次数越多差距越大!

所以结论是:在 不需要正则支持 且 数据量和数次不多 的情况下使用str.split函数更合适,反之则使用re.split函数。

注:具体执行时间与测试数据有关!

4.替换

替换主要有sub函数subn函数,他们功能类似!

先来看看sub函数的用法:

re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。

值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。

在这里插入图片描述

re.subn(pattern, repl, string, count=0, flags=0) 函数与 re.sub函数 功能一致,只不过返回一个元组 (字符串, 替换次数)。
在这里插入图片描述

5.编译正则对象

compile函数template函数 将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数(后面我们会讲解Pattern正则对象)。
在这里插入图片描述
template函数compile函数 类似,只不过是增加了我们之前说的re.TEMPLATE 模式,我们可以看看源码。
在这里插入图片描述

6.其他

re.escape(pattern) 可以转义正则表达式中具有特殊含义的字符,比如:. 或者 * ,举个实际的案例:
在这里插入图片描述
re.escape(pattern) 看似非常好用省去了我们自己加转义,但是使用它很容易出现转义错误的问题,所以并不建议使用它转义,而建议大家自己手动转义!

re.purge() 函数作用就是清除 正则表达式缓存,具体有什么缓存呢?我们来看看源码就知道它背地里干了 什么:
在这里插入图片描述
看方法大概是清除缓存吧,我们再来看看具体的案例:
在这里插入图片描述
猪哥在两个案例之间使用了re.purge() 函数清除缓存,然后分别比较前后案例源码里面的缓存,看看是否有变化!
在这里插入图片描述

7.总结

同样最后来一张思维导图总结一下re模块中的函数吧。
在这里插入图片描述

四、re模块异常

re模块还包含了一个正则表达式的编译错误,当我们给出的正则表达式是一个无效的表达式(就是表达式本身有问题)时,就会raise一个异常!

我们来看看具体的案例吧:
在这里插入图片描述
上图案例中我们可以看到,在编写正则表达式中我们多写了一个括号,这导致执行结果报错;而且是在其他所有案例执行之前,所以说明是在正则表达式编译时期就报错了。

注意:这个异常一定是 正则表达式 本身是无效的,与要匹配的字符串无关!

五、正则对象Pattern

关于re模块的常量、函数、异常我们都讲解完毕,但是完全有必要再讲讲正则对象Pattern

1. 与re模块 函数一致

re模块的函数中有一个重要的函数 compile函数 ,这个函数可以预编译返回一个正则对象,此正则对象拥有与re模块相同的函数,我们来看看Pattern类的源码。
在这里插入图片描述
既然是一致的,那到底该用re模块 还是 正则对象Pattern

而且,有些同学可能看过re模块的源码,你会发现其实compile函数 与 其他 re函数(search、split、sub等等) 内部调用的是同一个函数,最终还是调用正则对象的函数!
在这里插入图片描述
也就是说下面 两种代码写法 底层实现 其实是一致的:

# re函数
re.search(pattern, text)

# 正则对象函数
compile = re.compile(pattern)
compile.search(text)

那还有必要使用compile函数 得到正则对象再去调用 search函数 吗?直接调用re.search 是不是就可以?

2. 官方文档怎么说

关于到底该用re模块 还是 正则对象Pattern ,官方文档是否有说明呢?

在这里插入图片描述
官方文档推荐:在多次使用某个正则表达式时推荐使用正则对象Pattern 以增加复用性,因为通过 re.compile(pattern) 编译后的模块级函数会被缓存!

3. 实际测试又如何?

上面官方文档推荐我们在 多次使用某个正则表达式时使用正则对象,那实际情况真的是这样的吗?

我们在实测一下吧

在这里插入图片描述
猪哥编写了两个函数,一个使用re.search函数 另一个使用 compile.search函数 ,分别(不同时)循环执行count次(count从1-1万),比较两者的耗时!

得出的结果猪哥绘制成折线图:
在这里插入图片描述
得出的结论是:100次循环以内两者的速度基本一致,当超出100次后,使用 正则对象Pattern 的函数 耗时明显更短,所以比re模块 要快!

通过实际测试得知:Python 官方文档推荐 多次使用某个正则表达式时使用正则对象函数 基本属实!

六、注意事项

Python 正则表达式知识基本讲解完毕,最后稍微给大家提一提需要注意的点。

1.字节串 与 字符串

模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用!

2.r 的作用

正则表达式使用反斜杠('')来表示特殊形式,或者把特殊字符转义成普通字符。

而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突。

解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。

3.正则查找函数 返回匹配对象

查找一个匹配项(search、match、fullmatch)的函数返回值都是一个 匹配对象Match ,需要通过match.group() 获取匹配值,这个很容易忘记。
在这里插入图片描述
另外还需要注意:match.group()match.groups() 函数的差别!

4.重复使用某个正则

如果要重复使用某个正则表达式,推荐先使用 re.compile(pattern)函数 返回一个正则对象,然后复用这个正则对象,这样会更快!

5.Python 正则面试

笔试可能会遇到需要使用Python正则表达式,不过不会太难的,大家只要记住那几个方法的区别,会正确使用,基本问题不大。

查看原文

赞 51 收藏 37 评论 5

猪哥66 发布了文章 · 2020-02-23

GoLand 2020永久激活

注意:本教程补丁来源于https://zhile.io ,如有侵权请联系作者删除!

本项目只做学习研究之用,不得用于商业用途!

本教程适用于GoLand所有版本

2020.2019.11.29 jetbrains公司发布了Go的最强编辑器GoLand 2019.3。本次更新软件消耗更少的CPU和更快的性能,增强了对Go Modules的支持,添加了一组新的快速修复程序,并增强了重构。可以通过Evaluate Expression调用嵌入式字段的方法,并使用Mozilla rr远程调试应用程序。

一、激活前注意事项

  1. GoLand一定要是在官网下载:https://www.jetbrains.com/goland/download/
  2. 本教程适用于GoLand所有版本
  3. 本教程适用于jetbrains全系列产品(Pycharm、Idea、WebStorm、phpstorm、CLion、RubyMine、AppCode、DataGrid)
  4. 不需要修改hosts文件,以及任何配置文件
  5. 如果按照此教程还无法激活,加猪哥微信拉你进激活群图片

二、激活教程

1.下载破解补丁

点击链接 https://pan.baidu.com/s/1v4g_fNTZse7piY9aPXNN9g 下载补丁文件 jetbrains-agent.jar (如果链接失效可关注微信公众号「裸睡的猪」回复激活群,补丁来源于https://zhile.io

图片

2.将补丁放在lib目录

将刚才下载的补丁文件 jetbrains-agent.jar 放置在GoLand安装目录里面的lib目录里面

图片

3.点击试用

将补丁 jetbrains-agent.jar 放置到lib目录后,我们就可以启动软件了。

图片图片

进入到主页面后我们点击 “Evaluate for free”免费试用,最后退出软件自动关闭。

图片图片

4.激活

在点完试用退出后,我们只需要重新再打开GoLand软件就会弹出激活窗口,点击 Install jetbrains-agent for GoLand 按钮就完成激活。

图片图片

5.查看有效期

查看有效期的步骤为点击:Help->About这里可以看到你的GoLand的版本号、许可来源、有效期、以及一些环境

显示你电脑的用户名即表示永久激活成功,如果是 to GoLand Evaluator 则表示没有激活,按照教程再多试几次!

图片

三、激活失败

如果激活失败,可添加猪哥微信拉你入激活群大家帮你解决!

图片

查看原文

赞 1 收藏 0 评论 0

猪哥66 发布了文章 · 2020-02-23

Idea 2020永久激活

注意:本教程补丁来源于https://zhile.io ,如有侵权请联系作者删除!

本项目只做学习研究之用,不得用于商业用途!

2019.11.28 jetbrains公司发布了Java的最强编辑器IntelliJ IDEA 2019.3。本次更新提供了重大的性能和可用性改进,包括更快的启动,主题和键盘映射插件的更容易安装,增强的VCS工作流以及增加了对微服务框架,MongoDB等的支持。

本教程适用于Idea所有版本

一、激活前注意事项

  1. Idea一定要是在官网下载:https://www.jetbrains.com/idea/download/
  2. 本教程适用于Idea所有版本
  3. 本教程适用于jetbrains全系列产品(Pycharm、Idea、WebStorm、phpstorm、CLion、RubyMine、AppCode、DataGrid)
  4. 不需要修改hosts文件,以及任何配置文件
  5. 如果按照此教程还无法激活,加猪哥微信拉你进激活群(已经加过猪哥微信的请勿重复添加)图片

二、激活教程

1.下载破解补丁

点击链接 https://pan.baidu.com/s/1v4g_fNTZse7piY9aPXNN9g 下载补丁文件 jetbrains-agent.jar (如果链接失效可关注微信公众号「裸睡的猪」回复激活群,补丁来源于https://zhile.io

图片

2.将补丁放在lib目录

将刚才下载的补丁文件 jetbrains-agent.jar 放置在Idea安装目录里面的lib目录里面

图片

3.点击试用

将补丁 jetbrains-agent.jar 放置到lib目录后,我们就可以启动软件了。

图片图片

进入到主页面后我们点击 “Evaluate for free”免费试用,最后退出软件自动关闭。

图片图片

4.激活

在点完试用退出后,我们只需要重新再打开Py

Charm软件就会弹出激活窗口,点击 Install jetbrains-agent for Python 按钮就完成激活。

图片图片

5.查看有效期

查看有效期的步骤为点击:Help->About这里可以看到你的Idea的版本号、许可来源、有效期、以及一些环境

显示你电脑的用户名即表示永久激活成功,如果是 to Idea Evaluator 则表示没有激活,按照教程再多试几次!

图片

三、激活失败

如果激活失败,可添加猪哥微信拉你入激活群大家帮你解决!

图片

查看原文

赞 2 收藏 1 评论 0

猪哥66 发布了文章 · 2020-02-22

HTTP详解

爬虫又称网络爬虫,所以在讲解爬虫之前,我们有必要了解一下什么是网络?网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。

文章主要以一次HTTP请求的整个过程来讲解(DNS解析不讲):HTTP起源、TCP/IP协议、建立TCP连接、客户端请求、服务端响应、断开TCP连接,文章最后还捎带讲了与HTTP相关知识。文章较长,建议收藏或转发后阅读!
在这里插入图片描述

一、简介

1.起源

今天我们能够在网络中畅游,都得益于一位计算机科学家蒂姆·伯纳斯·李的构想。1991年8月6日,蒂姆·伯纳斯·李在位于欧洲粒子物理研究所(CERN)的NeXT计算机上,正式公开运行世界上第一个Web网站(http://info.cern.ch ),建立起基本的互联网基础概念和技术体系,由此开启了网络信息时代的序幕。
在这里插入图片描述
伯纳斯·李的提案包含了网络的基本概念并逐步建立了所有必要的工具:

  1. 提出HTTP (Hypertext Transfer Protocol) 超文本传输协议,允许用户通过单击超链接访问资源;
  2. 提出使用HTML超文本标记语言(Hypertext Markup Language)作为创建网页的标准;
  3. 创建了统一资源定位器URL (Uniform Resource Locator)作为网站地址系统,就是沿用至今的http://www URL格式;
  4. 创建第一个Web浏览器,称为万维网浏览器,这也是一个Web编辑器;
  5. 创建第一个Web服务器http://info.cern.ch)以及描述项目本身的第一个Web页面。

2.特点

HTTP 协议一共有五大特点:

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie和Session孕育而生,后期再讲)。

二、TCP/IP协议

我们经常听到一句话就是:HTTP是一个基于TCP/IP协议簇来传递数据

如何理解上面那句话?我们来看看TCP/IP四层模型就明白了。
在这里插入图片描述
从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据

同样我们可以看到ping走的ICMP协议,这也就是为什么有时候我们开vps可以上网,但是ping google却ping不通的原因,因为走的是不同的协议。

那TCP/IP协议簇大致是如何工作的,我们再来看看下图:
在这里插入图片描述
我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

三、建立TCP连接

我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。

1.TCP包头信息

前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。
在这里插入图片描述
TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:

  1. URG:紧急数据(urgent data)---这是一条紧急信息
  2. ACK:确认已收到
  3. PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据
  4. RST:表示要求对方重新建立连接
  5. SYN:表示请求建立一个连接
  6. FIN:表示通知对方本端要关闭连接了

2.建立连接过程

了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。
在这里插入图片描述
三次握手讲解:

  1. 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)
  2. 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)
  3. 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)
面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源

四、客户端请求

客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。

1.HTTP请求报文结构

我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文
在这里插入图片描述

2.HTTP请求实例

来看看实际的HTTP请求例子:
在这里插入图片描述

  1. ①是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT
  2. ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
  3. ③是协议名称及版本号
  4. ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
  5. ⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

请求头参数非常多,猪哥就不一一说明,只说明两个低级的反扒参数:

  1. User-Agent:客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器
  2. Referer:先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源

五、服务端响应

服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。

1.HTTP响应报文结构

在这里插入图片描述

2.HTTP响应实例

在这里插入图片描述

3.响应状态码

响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面猪哥只列出分类,详细状态码自行上网查找了解。
在这里插入图片描述

六、断开连接

在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

1.长短连接

是否断开我们需要区分HTTP版本:

  • 在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接
  • 在HTTP1.0发布仅半年后(1997年1月) ,HTTP/1.1版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接

注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。

早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接。

2.长连接优缺点

对于服务器来说建立长连接有优点也有缺点:

  • 优点:当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。
  • 缺点:当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。

所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。

ps:大家不要小看这一个TCP连接,在一次客户端HTTP完整的请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接)建立TCP连接占用的时间比还是很大的。

3.断开连接过程

在建立TCP连接时是三次握手,而断开TCP连接是四次挥手!
在这里插入图片描述
在前面讲TCP/IP协议时我们说过标志位:FIN表示通知对方本端要关闭连接了那断开连接为何需要四次挥手呢?这里给大家的课后作业,可以在留言中给出你的理解,看看是否正确。

七、题外话

1.面试必考题:http三次握手、四次挥手

面试官:为何建立连接需要三次握手而关闭连接却需要四次挥手。给大家的课后作业,在留言中给出你的见解!

2.http2.0

在这里插入图片描述
HTTP/1.1已经为我们服务了20年,而HTTP/2.0其实在2015就发布了,但是还没有推广开来,关于HTTP/2.0新特性大家也可以去网上查阅相关资料

3.http&rpc

因为http响应慢请求头体积大等缺点,所以在微服务时代,大家都使用rpc来调用服务,rpc相关概念感兴趣同学自行网上学习。

4.http&https

http还有两个很大的缺点就是明文不能保证完整性,所以目前会渐渐被HTTPS代替,HTTPS知识猪哥下期将会为大家讲解。

更多Python学习教程,可关注猪哥微信公众号「裸睡的猪」获取!

查看原文

赞 7 收藏 6 评论 0

认证与成就

  • 获得 265 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-08-04
个人主页被 6.9k 人浏览