03-服务器端返回固定页面
目标¶
- 能够实现返回一个
固定的html页面
给浏览器 的Web服务器
1. 实现效果¶
2. 功能分析¶
1、Web服务器能够绑定固定端口
2、Web服务器端能够接收浏览器请求
3、Web服务器遵守HTTP协议,并返回网页index.html 的内容给浏览器
4、当浏览器关闭后,Web服务器能够显示断开连接
5、Web服务器短时间内重启,不会提示 address already in use 错误
3. 实现步骤¶
1、导入socket模块
2、创建tcp套接字
3、设置地址重用
4、绑定端口
5、设置监听,最大允许客户端连接数128(套接字有主动变为被动)
6、等待客户端连接(能够接受多个客户端连接)
7、定义函数,实现客户端信息接收和响应
8、接收浏览器请求,并判断请求是否为空
9、拼接响应报文
10、定义变量保存响应报文内容
11、打开index.html 文件,并且读取其内容返回给客户端
12、发送响应报文给客户端浏览器(注意转码问题)
13、关闭此次连接的套接字
4. 代码实现¶
import socket
def request_handler(new_client_socket):
""" 响应客户端请求的核心函数 """
request_data = new_client_socket.recv(1024)
# 判断客户端是否已经断开链接
if not request_data:
print("客户端已经断开连接!")
# 关闭当前连接
new_client_socket.close()
# 退出,代码不再向后执行
return
# 开始拼接响应数据
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:Python-Web1.0\r\n"
response_blank = "\r\n"
# response_content = "HelloWorld!"
# 读取指定路径文件,并且返回
with open("static/index.html", "rb") as file:
# 读取文件的二进制数据
response_content = file.read()
# 拼接响应头
response_data = (response_line + response_header + response_blank).encode() + response_content
# 发送数据
new_client_socket.send(response_data)
# 关闭socket
new_client_socket.close()
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP 和端口
tcp_server_socket.bind(("", 8080))
# 设置套接字为被动套接字,主要接收客户端链接
tcp_server_socket.listen(128)
while True:
# 接受客户端链接
new_client_socket, ip_port = tcp_server_socket.accept()
print("[新客户端上线]", ip_port)
# 相应客户端请求,发送数据给客户端
request_handler(new_client_socket)
if __name__ == '__main__':
main()