本系列Python进阶高级编程为我购买慕课网实战课程的笔记,墙裂推荐大家购买原课程观看,课程地址:
这一篇我们学习下Python的socket编程。
弄懂HTTP、Socket、TCP这几个概念
我们先看下网络的七层结构模型。
下面是五层网络模型:
上层的协议依赖于下层的协议(DNS依赖于UDP)
当我们应用层满足不了的时候我们如何和下层的TCP和UDP打交道呢?
我们可以使用Socket接口进行和传输层打交道,Socket是不属于任何协议。 我们可以使用Socket脱离应用层可以直接和传输层进行打交道,脱离与应用层,实现自己的应用层协议。
Socket的client和server实现通信
我们先看下Socket通信结构,左侧是服务端,右侧是客户端。
对于服务端我们使用bind
进行协议,地址,端口的指定,然后调用listen
进行监听。
与HTTP传输相比Socket通信只要建立连接之后就可以无限发送信息在客户端和服务端之间,而HTTP是只能进行一次信息传输,必须由客户端发起。
真正的Socket是存在与uwsgi中的
下面我们编写两个文件一个是服务端,一个是客户端。
服务端socket_server.py代码:
1 | import socket |
客户端socket_client.py的代码:
1 | import socket |
socket实现聊天和多用户连接
上面我们已经完成了服务端和客户端的通信,但是信息是固定的,下面我们配置可以互发消息。
服务端代码:
1 | import socket |
注意:我们的配置好的server
只是用来监听,真正和客户端通信的是sock
。
客户端代码:
1 | import socket |
依次运行服务端和客户端,就可以像聊天一样互发消息。
上面的代码只实现了一次建立socket
,因此只支持单客户端,我们想要支持多客户端连接,就要建立多个socket
。这里建立多个客户端我们通过多线程来实现。
服务端代码:
1 | import socket |
客户端代码不变。
这样我们先开启服务端,就能开启多个客户端进行多客户端发消息。
Socket模拟HTTP请求
我们已经知道,socket是HTTP协议之下让我们可以使用TCP,IP的一个接口。
对于requests库是基于urlib来实现的,而urlib又是基于socket来实现的。对于网络上的大多请求(包含数据库的链接)底层都是通过socket来实现的。不同的操作系统封装了不同的socket接口。
我们先看下网页上的HTTP请求长什么样子:
1 | import socket |
通过学习Socket我们发现网络请求的整个过程都是可控的。
一篇不错的参考文章:Python 中的 Socket 编程