先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
正文
自计算机诞生以来,计算机网络逐渐从单机模型发展成了网络互联模型
最初只是远程终端连接,终端(键盘和显示器)分布在各地然后与主机相连,用户通过终端来与远程主机进行交互,终端只能与主机通信
再到多个主机之间互联,几台固定的计算机相连在一起形成计算机网络,这种网络一般是私有的(局域网)
随着时代的发展,人们开始尝试在私有网络上搭建更大的私有网络,逐渐又发展演变为互联网,现在我们每个人几乎都能够享有互联网带来的便利
计算机网络就是把各个计算机相互连接,让网络中的计算机能够互相通信传递数据,而网络编程就是实现程序如何在两台计算机之间进行通信
既然网络编程能让两个程序进行通信,在网络中,程序是通过什么来找到另一个程序的?
套接字(socket),表示方式为点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开(IP地址:端口号)
有了套接字,不同计算机之间的程序就可以进行双向通信
一般两个程序间的通信对应的软件开发架构有两种——C/S 架构和 B/S 架构
C/S 架构
Client 与 Server
客户端与服务器端架构,这种架构是从用户层面(也可以是物理层面)来划分的
这里的客户端一般泛指客户端应用程序,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大
例如:QQ、微信、网盘
B/S 架构
Browser 与 Server
浏览器端与服务器端架构,这种架构也是从用户层面来划分的
浏览器,其实也是一种 Client,只是这个 Client 不需要大家去安装什么应用程序,只需在浏览器上通过 HTTP 请求 server 相关的资源(网页资源)
例如:百度、各种应用的网页版
socket
Python 提供了两个级别的网络服务模块:
- socket
- 低级别的网络服务模块,提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法
- socketserver
- 高级别的网络服务模块,它提供了服务器中心类,可以简化网络服务器的开发
今天我们主要介绍 socket 模块
先导入 socket 模块
import socket
#语法
socket.socket([family[, type[, proto]]])
- family:套接字家族;可以是 AF_UNIX 或者 AF_INET
- type:套接字类型;可以根据是面向连接(TCP)的还是非连接(UDP)分为 SOCK_STREAM 或 SOCK_DGRAM
- protocol:一般不填默认为 0
server 端 socket 函数
函数 | 描述 |
---|---|
s.bind() | 绑定地址(host,port)到套接字在 AF_INET 中,以元组(host,port)的形式表示地址 |
s.listen() | 开始 TCP 监听backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量该值至少为 1,大部分应用程序设为 5 就可以了 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
client 端 socket
函数 | 描述 |
---|---|
s.connect() | 主动初始化 TCP 服务器连接一般 address 的格式为元组(hostname,port),如果连接出错返回socket.error 错误。 |
s.connect_ex() | connect()函数的扩展版本出错时返回出错码,而不是抛出异常 |
公共用途的 socket
函数 | 描述 |
---|---|
s.recv() | 接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量flag 提供有关消息的其他信息,通常可以忽略。 |
s.send() | 发送 TCP 数据,将 string 中的数据发送到连接的套接字返回值是要发送的字节数量,该数量可能小于 string 的字节大小。 |
s.sendall() | 完整发送 TCP 数据将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据成功返回 None,失败则抛出异常。 |
s.recvfrom() | 接收 UDP 数据,与 recv() 类似,但返回值是(data,address)其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。 |
s.sendto() | 发送 UDP 数据,将数据发送到套接字,address 是形式为(ip,port)的元组,指定远程地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址返回值通常是元组(ip,port)。 |
s.getsockname() | 返回套接字自己的地址通常是一个元组(ip,port) |
s.setsockopt(level,optname,value) | 设置给定套接字选项的值 |
s.getsockopt(level,optname[.buflen]) | 返回套接字选项的值 |
s.settimeout(timeout) | 设置套接字操作的超时期,timeout 是一个浮点数,单位是秒。值为None表示没有超时期。一般超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect()) |
s.gettimeout() | 返回当前超时期的值,单位是秒如果没有设置超时期,则返回None。 |
s.fileno() | 返回套接字的文件描述符 |
s.setblocking(flag) | 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。 |
s.makefile() | 创建一个与该套接字相关连的文件 |
TCP 编程
如上图左边所示,server 进程首先要绑定一个端口并监听来自 client 的连接,如果某个 client 的连接过来了,server 就与 该 client 建立 socket 连接
所以 server 会打开端口(比如 80)监听,每来一个 client ,就创建该 socket 连接
考虑到会有大量的 client 与 server 进行连接,server要能够区分一个 socket 连接对应哪个 client
一个 socket 由四个元素组成:
- server 地址(目标地址)
- client 地址(源地址)
- server 端口(目标端口)
- client 端口(源端口)
除此之外,server 还需要同时响应多个 client 的请求,所以每个连接都需要一个新的进程或者新的线程来处理,否则 server 一次就只能处理一个 client 的请求了
我们来编写一个简单的 server 程序,它接受 client 连接,把 client 发过来的数据加上 hello 再返回给 client
首先创建一个基于 ipv4 和 TCP 协议的 socket 对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
然后我们绑定监听的地址和端口(可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0
绑定到所有的网络地址,还可以用127.0.0.1
绑定到本机地址)
这里我们是通过本机来实现 C/S 架构,所以绑定到 127.0.0.1 上,而且不要绑定端口号小于 1024 的端口(要有管理员权限才能绑定)
ps:端口复用
我们知道 TCP 关闭连接有一个四次挥手的过程,当 server 主动关闭连接时,会有一个TIME_WAIT(时间等待)状态,等待 2MSL(最长报文段寿命)后进入关闭状态
那么在这个 TIME_WAIT 状态下,端口还处于被别的进程绑定的状态之中,那么其他进程就会拿不到这个端口,产生报错
我们可以通过端口复用来解决这个问题
#提示:socket.setsockopt()方法要在 socket.bind()之前设置
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
level:设置哪个级别的 socket, socket.SOL_SOCKET 表示当前socket
option:设置什么内容(权限) socket.SO_REUSEADDR 端口复用
value:True:表示复用,False,表示不复用
#绑定本地9999端口
s.bind(('127.0.0.1', 9999))
接着开始监听端口,参数为指定等待连接的最大数量
#监听的连接数最多为5
s.listen(5)
print('Waiting for connection...')
server 程序通过一个 while 循环来接受来自 client 的连接,accept()
会等待并返回一个 client 的连接
当有 client 来连接时,就创建一个线程来处理会话
while True:
sock, addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock,addr))
t.start()
连接建立后,server 首先返回一条欢迎消息,然后等待 client 的数据,收到数据之后并加上 hello 再发送给 client
如果没有数据或者 client 发送了 exit 字符串就关闭连接
def tcplink(sock,addr):
print('Accept new connection from %s:%s...' % addr)
#返回欢迎信息
sock.send(b'hello!')
#当 client 发送数据时,返回 hello+数据给 client
while True:
data = sock.recv(1024)
time.sleep(1)
#如果 client 不发送数据或者发送 exit,退出连接
if not data or data.decode('utf-8') == 'exit':
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
* * *
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)
**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)
**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)
**(4)200多本电子书**
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
**(5)Python知识点汇总**
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)
**(6)其他资料**
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)
**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
![img](https://img-blog.csdnimg.cn/img_convert/d8bda2ec4436a1e8632274291aa52102.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
a6ec779b2ead064d.png)
**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
[外链图片转存中...(img-7xKk0ByT-1713343181512)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**