Python
最新文章Python 精简笔记
基于《Python编程从入门到实践》(第二版)
基于 Python 3.8
归纳总结 + 知识补充
转载自:https://github.com/JERRY-Z-J-R/I-love-you-3-thousand/tree/master
本文档只是 Python3 的入门基础,更多详细内容请看:3.8.13 Documentation (python.org)
一、起步
全文基于 Windows 11 环境
(1)安装 Python
进入 Python 官网:https://www.python.org/
点击导航栏的 Downloads
找到需要的 Python 版本点击下载(推荐 3.8 及其以上)
双击 .exe 文件进行安装
勾选 Add Python 3.x to PATH(自动添加到环境变量)
检查 pip【Python 包管理器】是否勾选(请勾选)
依次默认下一步(安装路径建议放置在非 C 盘路径下)
安装成功
(2)使用 Python
【交互式 Python】
打开命令行窗口(cmd 或 Windows PowerShell)
输入 python 命令
...
Linux网路编程
【Linux网络编程】UDP服务器
1. 相关概念 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。
相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证。因此,我们称UDP为“无连接的不可靠报文传递”。
那么与我们熟知的TCP相比,UDP有哪些优点和不足呢?由于无需创建连接,所以UDP开销较小,数据传输速度快,实时性较强。多用于对实时性要求较高的通信场合,如视频会议、电话会议等。但随之也伴随着数据传输不可靠,传输数据的正确率、传输顺序和流量都得不到控制和保证。所以,通常情况下,使用UDP协议进行数据传输,为保证数据的正确性,我们需要在应用层添加辅助校验协议来弥补UDP的不足,以达到数据可靠传输的目的。
与TCP类似的,UDP也有可能出现缓冲区被填满后,再接收数据时丢包的现象。由于它没有TCP滑动窗口的机制,通常采用如下 ...
Linux网路编程
【Linux网络编程】手写线程池
1.C语言版视频教程点我查看
1.1 任务队列123456// 任务结构体typedef struct Task{ void (*function)(void* arg); void* arg;}Task;
1.2 线程池定义123456789101112131415161718192021222324// 线程池结构体struct ThreadPool{ // 任务队列 Task* taskQ; int queueCapacity; // 容量 int queueSize; // 当前任务个数 int queueFront; // 队头 -> 取数据 int queueRear; // 队尾 -> 放数据 pthread_t managerID; // 管理者线程ID pthread_t *threadIDs; // 工作的线程ID int minNum; // 最小线程数量 int maxNum; ...
Linux网路编程
【Linux网络编程】epoll反应堆
1.epoll 反应堆模型:==实际上就是使用epoll的ET模式 + 非阻塞、轮询 + void *ptr(设置回调函数)。==
接下来我们回顾一下之前用epoll实现的并发服务器
先使用 socket()、bind()、listen()创建套接字并初始化 –> epoll_create() 创建监听红黑树 –> 返回 epfd –> epoll_ctl() 向树上添加1个监听fd –> while(1)循环–> epoll_wait() 监听 –> 对应监听fd有事件产生 –> 返回监听满足数组。 –> 判断返回数组元素 –> 若lfd满足 –> 则调用Accept() –>若 cfd 满足 –>则调用 read() —> 小写转大写 –> write回去。
接下来再看看用epoll反应堆实现的并发服务器工作流程,实际上不同的是,在监听cfd过程中,不仅仅要监听 cfd 的读事件、还要监听cfd的写事件,并且分别对它们读写事件设置各自的回调函数。当各自 ...
Linux网路编程
【Linux网络编程】epoll进阶之水平模式和边沿模式
1.epoll的事件模型EPOLL事件有两种模型:
Edge Triggered (ET) 边缘触发:==只有数据到来才触发,不管缓存区中是否还有数据==。ET是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知。请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)。
Level Triggered (LT) 水平触发:==只要缓存区有数据都会触发==。LT是缺省的工作方式,并且同时支持block和no-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表。
1.1 ET(边沿模式)的设置边沿模式不是默认的 ...
Linux网路编程
【Linux网络编程】多路IO转接之select、poll、epoll
多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,==不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件==。通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。通过这种方式在单线程 / 进程的场景下也可以在服务器端实现并发。常见的 IO 多路转接方式有:select、poll、epoll。
与多进程和多线程技术相比,I/O 多路复用技术的最大优势是系统开销小,系统不必创建进程 / 线程,也不必维护这些进程 / 线程,从而大大减小了系统的开销。
1.select
select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数
解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低 ...
Linux网路编程
【Linux网络编程】TCP状态转换、半关闭、2MSL时长
1. 三次握手、四次挥手过程中的状态变化先结合下图回顾一下TCP建立连接的三次握手过程,关闭连接的四次挥手过程,以及在此过程中的状态变化。
主动发起连接请求端: CLOSE状态 –> 发送SYN标志位–> SYN_SEND状态 –> 接收对端发送的 ACK标志位、SYN标志位 –> SEND_SYN状态 –> 发送 ACK标志位 –> ESTABLISHED状态(数据通信态)
主动关闭连接请求端: ESTABLISHED状态(数据通信态) –> 发送 FIN标志位 –> FIN_WAIT_1状态 – 接收对段发送的ACK标志位 –> FIN_WAIT_2状态(半关闭)–> 接收对端发送的 FIN标志位 –> FIN_WAIT_2状态(半关闭)–> 回发ACK标志位 –> TIME_WAIT状态(只有主动关闭的连接方,会经历该状态)–> 等 2MSL时长 –> CLOSE状态
被动接收连接请求端: CLOSE状态 –>程序启动 –> LISTEN状态 –> 接收对端发送的 SY ...
Linux网路编程
【Linux网络编程】多进程并发服务器、多线程并发服务器
1.出错处理封装函数我们知道,系统调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。
为使错误处理的代码不影响主程序的可读性,我们把与socket相关的一些系统函数加上错误处理代码包装成新的函数,做成一个模快:wrap.c
1.1 wrap.c123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 ...
Linux网路编程
【Linux网络编程】TCP通信时序、滑动窗口 (TCP流量控制)
1.TCP通信时序下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次挥手。
在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为1-10,各段中的主要信息在箭头上标出,例如段2的箭头上标着SYN, 8000(0), ACK1001 ,表示该段中发送了SYN标志位(专门用来建立连接进行通信的标志位),32位序号是8000(表示所带数据包的包号),该段不携带有效载荷(数据字节数为0);还发送了ACK标志位(表示应答,表明收到了前面发送的数据报),32位确认序号是1001,带有一个mss(Maximum Segment Size,最大报文长度)选项值为1024。
建立连接(三次握手)的过程:
1.客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的段1。
客户端发出段1,SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发一个数据 ...
Linux网路编程
【Linux网路编程】Socket套接字
1.网络基础1.1 网络分层模型
1.2 数据包封装 传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
1.3 以太网帧格式
其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。可在shell中使用ifconfig命令查看。协议字段有三种值,分别对应IP、ARP、RARP。帧尾是CRC校验码。
1.4 ARP数据报格式在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的 ...