前言:这段代码是有问题的,下面给出了解决方案。
import socket
import multiprocessing
import re
def service_client(new_socket):
"""为这个客户端返回数据"""
# 接收浏览器发送过来的请求, 即http请求
# GET / HTTP/1.1
# ......
request = new_socket.recv(1024).decode("utf8") # request:请求(的事物)
# print(">>>"*50)
# print(request)
# print(type(request))
request_lines = request.splitlines()
print("")
print(">"*20)
print(request_lines)
# GET /index.html HTTP/1.1
# get post put del
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0]) # + 表示匹配前一个字符至少出现1次
if ret:
file_name = ret.group(1)
print("*"*50, file_name)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式的数据,给浏览器
try:
print("fanfanfnafan")
file = open("./html" + file_name, "rb")
print("aiaiaiaia")
except:
"""如果找不到请求,即打不开请求文件,返回的请求头,请求空行,请求体"""
reponse = "HTTP/1.1 404 NOT FOUND \r\n"
response += "\r\n"
response += "----file not found----"
new_socket.send(response.encode("utf-8"))
else:
print("du?")
html_content = file.read()
print(html_content)
print("???")
file.close()
# 准备发送给浏览器的数据---header 请求空行
print("fa?")
response = "HTTP/1.1 200 ok\r\n"
response = "\r\n"
print("bufa?")
# 准备发送给浏览器的数据---body
# response += "hahahaha"
# header 是字符串,body是读出二进制,所以不能加了一起发送
# 将response header 发送给浏览器
print("you mei you ?")
new_socket.send(response.encode("utf-8"))
print("buzhidao ")
# 将response body 发送给浏览器
new_socket.send(html_content)
print("haiyou ?")
# 关闭套接字
# new_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, 1)
# 绑定端口
tcp_server_socket.bind(("", 4396))
# 变为监听套接字
tcp_server_socket.listen(128)
while True:
# 等待新客户端链接
new_socket, client_addr = tcp_server_socket.accept()
# service_client(new_socket)
# while True:
# 为这个客户端服务
p1 = multiprocessing.Process(target=service_client, args=(new_socket,)) # service:服务
p1.start()
new_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
这份代码的问题是:代码可以正常执行,但是无法正常给浏览器客户端返回数据,拒绝访问,如下图:
这个问题分析可知,代码一定出在了服务器端给浏览器返回数据时,那么可具体排查对应的代码块。
1、返回header头格式出问题:
2、单词拼错了
3、需要改为:decode(“utf-8”)。这里科普一下utf-8与utf8的区别:这两个本质上没什么区别,只是标准写法与非标准的问题,utf-8属于标准写法,所以建议改一下