# 开发服务器的完整流程
01-编写第一个服务器(实现返回固定页面)
预备知识
-
首先我们要清楚,当浏览器向服务器请求数据时,会发生以下两个动作
-
浏览器向服务器发送请求,请求的格式如代码片段1
-
服务器向浏览器返回响应数据(如代码片段2),这些数据渲染在浏览器上形成网页
这也就意味着我们编写一个服务器时,需要向浏览器返回如代码片段2的数据,而并不是所有内容都要返回,我们刚开始写一个服务器,可以只返回一些必须的数据,如下所示
HTTP/1.1 200 OK body部分
分为两个部分:header 和 body部分
body部分就是要向浏览器传输的数据
注意:header部分和body部分必须用一个空行来链接
话不多说,我们先开始编写一个简单的服务器吧!!
-
服务器----->浏览器的数据格式:
片段1
HTTP/1.1 200 OK
Content-Length: 53 Content-Type: text/plain;
charset=UTF-8 Date: Sat, 01 May 2021 07:53:18 GMT
浏览器----->服务器的数据格式:
片段2
b'GET / HTTP/1.1\r\nHost: 127.0.0.1:7890\r\nConnection: keep-alive\r\nsec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"\r\nsec-ch-ua-mobile: ?1\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Mobile Safari/537.36 Edg/90.0.818.46\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: none\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n\r\n'
# 完整代码如下
import socket
def service_client(new_socket):
"""为这个客户端返回数据"""
# 1.接收浏览器发送过来的请求,即http请求
# GET / HTTP/1.1
request = new_socket.recv(1024)
#会打印出如代码片段1的代码,这是浏览器发送给服务器的请求
print(request)
# 2.返回http格式的数据,给浏览器,这是重头戏
# 2.1 准备发送给浏览器的数据——header
response = "HTTP/1.1 200 OK\r\n" # 浏览器解析换行是\r\n,这里要记住,因为浏览器兼容问题,在写服务器时换行必须用“\r\n”表示
response += "\r\n" # 换行 区分header和body部分
# 2.2准备发送给浏览器的数据 ——body
response += "hahahah" #发送给浏览器的内容,也就是在浏览器要渲染出来的页面,读者可以尝试写不同数据加深理解
new_socket.send(response.encode("utf-8")) #send发送的必须是字节类型的数据,所以要进行utf-8编码
# 关闭套接字
new_socket.close()
def main():
"""用来完成整体的控制"""
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.绑定 本地IP 7890端口
tcp_server_socket.bind(("",7890))
# 3.变为监听套接字
tcp_server_socket.listen(128)
while True:
# 4.等待新客户的链接
new_socket , client_addr = tcp_server_socket.accept()
# 5.为这个客户端服务
service_client(new_socket)
#关闭监听套接字
tcp_server_socket.close()
if __name__== "__main__":
main()
总结
敲黑板!!代码注释非常详细,但还是想啰嗦几句
其实整个编写服务器的流程都十分清晰,简单
-
创建套接字
-
绑定IP,端口
-
变为监听套接字
-
等待新客户的连接,并为其服务
-
接收浏览器发送过来的请求
-
返回给浏览器数据,包括两个部分
header
body
-
-
关闭套接字
好了,各位小伙伴,一个简单服务器的完整建立过程就是这样,小伙伴快去试一试吧!!
我之前看到编写服务器都是在ubuntu里面,可是每次开ubuntu都特别麻烦
所以我就尝试了在pycharm进行运行,没想到真可以
所以,以下才是重点!!!
- 复制完整代码到pycharm并运行
- 在浏览器输入127.0.0.1:7890就可以看到你发送的数据了