如果想要搞懂python web编程开发的原理,需要从底层socket说起。
一、socket是什么?
socket是套接字对象,简单讲就是端点,是需要通信的两个程序端点。比如一个端点是你的计算机(我们通常称为客户端),一个端点是网站所在的服务器(我们通常称为服务端)。两个端点如果想通信,就需要借助socket对象来实现。
理论上讲,我们需要为客户端编写一个socket程序,用于向服务器端发送请求,并接收返回的信息。还需要为服务器端编写一个socket程序,用于接收客户端的消息,并返回信息。
二、socket编程代码解读
客户端的socket程序无需我们手动编写,浏览器已经为我们封装好了。下面演示如何通过python的socket模块,编写简单的web框架,实现基于socket对象的web应用网络通信。
1、引入socket模块,socket模块是python自带的标准模块,直接引入就好。
import socket
2、生成套接字对象(两个参数,第一个是用于IPv4 internet寻址,第二个参数是套接字类型,web应用基于http协议,传输控制协议需要选择面向流的传输,故而参数要选择SOCK_STREAM)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3、设置需要绑定的服务器IP和端口号(这里以本机作为演示,故而IP选择为"127.0.0.1",实际应用会以服务器真实IP作为绑定IP)。
server_address = ("127.0.0.1", 8001)
4、将socket对象绑定IP和端口
sock.bind(server_address)
5、调用listen()方法将该套接字对象设置为服务模式,括号中的参数是在后台排队的最大连接数,如果超过了,服务端会拒绝连接新客户。
sock.listen(5)
6、调用accept()方法,等待连接的请求申请。该方法返回值为一个打开的连接和对方的IP地址
connection, address = sock.accept()
7、设置服务端可接收的信息字节数
connection.recv(1024)
8、收到请求连接后,基于http协议格式发送消息给对方
connection.send(b"HTTP/1.1 200 OK\r\n\r\n")
connection.send("浏览器的请求信息已收到,这是服务器返回的响应信息。".encode("utf-8"))
9、断开连接
connection.close()
通过以上10行代码,就完成了一个简单的python web框架(所有web框架底层都是基于socket实现)。
但是只能做一次连接,程序就结束了。可以将6-9步的代码,写到一个while循环中,就可以源源不断的接收新请求了。以下是完整的代码块。
三、完整代码块演示
import socket
# 1、生成套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、设置服务端的IP地址和端口
server_address = ("127.0.0.1", 8001)
# 3、绑定IP地址和端口
sock.bind(server_address)
# 4、开启监听,并设置等候最大连接数
sock.listen(5)
while True:
# 5、等待连接的请求申请
connection, address = sock.accept()
# 6、设置服务端可接收的信息字节数
connection.recv(1024)
# 7、连接成功后,基于http协议发送消息给对方
connection.send(b"HTTP/1.1 200 OK\r\n\r\n")
connection.send("浏览器的请求信息已收到,这是服务器返回的响应信息。".encode("utf-8"))
# 8、断开连接
connection.close()
四、通过pycharm模拟服务端及浏览器演示
1、通过pycharm新建一个纯python项目,然后在根目录下新建一个server.py文件,将以上代码复制进去。
2、点击pycharm右上角的运行按钮。
3、打开浏览器,输入127.0.0.1:8001,然后摁下回车键,返回结果如下图所示,表示模拟成功。