一、Python网络编程模块(大汇总)

python schema 别名带入_客户端

二、Python urllib.parse模块用法详解

python schema 别名带入_数据_02


python schema 别名带入_客户端_03


python schema 别名带入_数据_04


python schema 别名带入_客户端_05


如果被解析的 URL 以双斜线(//)开头,那么 urlparse() 函数可以识别出主机,只是缺少 scheme 部分。但如果被解析的 URL 既没有 scheme,也没有以双斜线(//)开头,那么 urlparse() 函数将会把这些 URL 都当成资源路径。例如如下代码:

python schema 别名带入_服务器端_06


python schema 别名带入_数据_07


python schema 别名带入_服务器端_08

三、urllib.request模块读取资源用法详解

1.在 urllib.request 子模块下包含了一个非常实用的urllib.request.urlopen(url, data=None) 方法,该方法用于打开 url 指定的资源,并从中读取数据。

python schema 别名带入_数据_09

2.在使用 urlopen() 函数时,可以通过 data 属性向被请求的 URL 发送数据。例如如下程序:

python schema 别名带入_服务器端_10


data属性即是----------------------------POST请求3.如果使用 urlopen() 函数向服务器页面发送 GET 请求参数,则无须使用 data 属性,直接把请求参数附加在 URL 之后即可。

python schema 别名带入_客户端_11


4.实际上,使用 data 属性不仅可以发送 POST 请求,还可以发送 PUT、PATCH、DELETE 等请求,此时需要使用 urllib.request.Request 来构建请求参数。程序使用 urlopen() 函数打开远程资源时,第一个 url 参数既可以是 URL 字符串,也可以使用 urllib.request.Request 对象。

python schema 别名带入_数据_12


5.添加请求头

python schema 别名带入_客户端_13

四、http.cookiejar模块:管理cookie

python schema 别名带入_数据_14


下面程序示范了先登录 Web 应用,然后访问 Web 应用中的被保护页面

python schema 别名带入_客户端_15


python schema 别名带入_客户端_16


该程序并未向服务器发送登录请求,但由于该 CookieJar 会把登录成功的 session id 发送给服务器,因此服务器就会认为该程序与前面那个登录成功的程序是同一个客户端。

五、socket建立TCP连接

python schema 别名带入_数据_17

python schema 别名带入_python schema 别名带入_18


python schema 别名带入_客户端_19

掌握了这些常用的方法之后,可以大致归纳出 TCP 通信的服务器端编程的基本
步骤:
1。服务器端先创建一个 socket 对象。
2.服务器端 socket 将自己绑定到指定 IP 地址和端口。
3.服务器端 socket 调用 listen() 方法监听网络。
4.程序采用循环不断调用 socket 的 accept() 方法接收来自客户端的连接。

同样,客户端也是先创建一个 socket 对象,然后调用 socket 的 connect() 方法建立与服务器端的连接,这样就可以建立一个基于 TCP 协议的网络连接。

TCP 通信的客户端编程的基本步骤大致归纳如下:

1.客户端先创建一个 socket 对象。

2.客户端 socket 调用 connect() 方法连接远程服务器。

python schema 别名带入_服务器端_20


python schema 别名带入_python schema 别名带入_21

六、多线程实现socket通信

由于 socket 的 recv() 方法在成功读取到数据之前,线程会被阻塞,程序无法继续执行。考虑到这个原因,服务器端应该为每个 socket 都单独启动一个线程,每个线程负责与一个客户端进行通信。

现在考虑实现一个命令行界面的 C/S 聊天室应用,服务器端应该包含多个线程,每个 socket 对应一个线程,该线程负责从 socket 中读取数据(从客户端发送过来的数据),并将所读取到的数据向每个 socket 发送一次(将一个客户端发送过来的数据“广播”给其他客户端),因此需要在服务器端使用 list 来保存所有的 socket。

python schema 别名带入_python schema 别名带入_22


每个客户端都应该包含两个线程,其中一个负责读取用户的键盘输入内容,并将用户输入的数据输出到 socket 中,另一个负责读取 socket 中的数据(从服务器端发送过来的数据),并将这些数据打印输出。由程序的主线程负责读取用户的键盘输入内容,由新线程负责读取 socket 数据。

python schema 别名带入_服务器端_23


先运行上面的 MyServer 程序,该程序运行后只是作为服务器,看不到任何输出信息。再运行多个 MyClient 程序(相当于启动多个聊天室客户端登录该服务器),接下来可以在任何一个客户端通过键盘输入一些内容,然后按回车键,即可在所有客户端(包括自己)的控制台中收到刚刚输入的内容,这就粗略地实现了一个 C/S 结构的聊天室应用。

七、socket shutdown方法详解

shutdown 方法的 how 参数接受如下参数值:

SHUT_RD:关闭 socket 的输入部分,程序还可通过该 socket 输出数据。

SHUT_WR: 关闭该 socket 的输出部分,程序还可通过该 socket 读取数据。

SHUT_RDWR:全关闭。该 socket 既不能读取数据,也不能写入数据。

python schema 别名带入_服务器端_24

八、selectors模块用法:实现非阻塞式编程

前面介绍的 socket 都是采用阻塞方式进行通信的,当程序调用 recv() 方法从 socket 中读取数据时,如果没有读取到有效的数据,当前线程就会被阻塞。为了解决这个问题,上面程序采用了多线程并发编程,即服务器端为每个客户端连接都启动一个单独的线程,不同的线程负责对应的 socket 的通信工作。

python schema 别名带入_数据_25


python schema 别名带入_客户端_26


python schema 别名带入_python schema 别名带入_27


上面程序中定义了两个监听器函数 accept() 和 read(),其中 accept() 函数作为“有客户端连接进来”事件的监听函数,主程序中的 ① 号代码负责为 socket 的 selectors.EVENT_READ 事件注册该函数;read() 函数则作为“有数据可读”事件的监听函数,如 accept() 函数中的 ② 号代码所示。

通过上面这种方式,程序避免了采用死循环不断地调用 socket 的 accept() 方法来接受客户端连接,也避免了采用死循环不断地调用 socket 的 recv() 方法来接收数据。socket 的 accept()、recv() 方法调用都是写在事件监听函数中的,只有当事件(如“有客户端连接进来”事件、“有数据可读”事件)发生时,accept() 和 recv() 方法才会被调用,这样就避免了阻塞式编程。

为了不断地提取 selectors 中的事件,程序最后使用一个死循环不断地调用 selectors 的 select() 方法“监测”事件,每当监测到相应的事件之后,程序就会调用对应的事件监听函数。
下面是该示例的客户端程序。

python schema 别名带入_服务器端_28


python schema 别名带入_python schema 别名带入_29


mask------------selectors.EVENT_READ,selectors.EVENT_WRITE两个事件。

九、socket发送和接受数据(基于UDP协议)详解

python schema 别名带入_数据_30


python schema 别名带入_客户端_31


python schema 别名带入_客户端_32

十、UDP多点广播(多播)原理及实现

python schema 别名带入_数据_33

从图 1 中可以看出,使用 socket 进行多点广播时所有的通信实体都是平等的,它们都将自己的数据报发送到多点广播IP地址,并使用 socket 接收其他人发迭的广播数据报。

下面程序使用 socket 实现了一个基于广播的多人聊天室。程序只需要一个 socket、两个线程,其中 socket 既用于发送数据,也用于接收数据;主线程负责读取用户的键盘输入内容,并向 socket 发送数据,子线程则负责从 socket 中读取数据。

python schema 别名带入_数据_34


上面主程序中,第 10 行代码先创建了一个基于 UDP 协议的 socket 对象,由于需要使用该 socket 对象接收数据报,所以将该 socket 绑定到固定端口(由于只需要绑定到固定端口,因此程序中 ① 号代码使用了 0.0.0.0 这个虚拟 IP 地址)。

第 18 行代码将该 socket 对象添加到指定的多点广播 IP 地址。至于程序中使用 socket 发送和接收数据报的代码,与前面的程序并没有区别,故此处不再赘述。

十一、smtplib模块详解:发送邮件

python schema 别名带入_数据_35


python schema 别名带入_python schema 别名带入_36


如果程序要将邮件内容改为 HTML 内容,那么只需将调用 EmailMessage的set_content() 方法的第二个参数设置为 html 即可。

python schema 别名带入_客户端_37


python schema 别名带入_服务器端_38


python schema 别名带入_客户端_39

十二、poplib模块:收取邮件

python schema 别名带入_python schema 别名带入_40


python schema 别名带入_服务器端_41


python schema 别名带入_python schema 别名带入_42