我正在尝试用 Python 实现一个服务器。当浏览器连接到端口号为 9999 的 localhost 时,它会打开该页面中带有 images.jpg 的文件 index.html,但无法显示图像。如何让 Web 服务器也处理图像?
到目前为止,这是我的代码:
from socket import *
import os
serversocket = socket(AF_INET, SOCK_STREAM)
port = 5000
host = '127.0.0.1'
size = os.path.getsize("index.html")
myfile = open('index.html', 'rb')
mycontent = "Welcome to Very Simple Web Server"
size = len(mycontent)
header = "HTTP/1.0 200 OK \r\n Content_Length:" + str(size) + "\r\n\r\n"
mycontent = myfile.read()
serversocket.bind((host, port))
serversocket.listen(5)
print('Server is listening on port 9999')
while (1):
conn, addr = serversocket.accept()
print('Connected by', addr)
conn.send(bytes(header))
conn.send(mycontent)
conn.close()
请您参考如下方法:
您的代码创建了一个无限循环,它只会发送一个文件,并且永远不会接受其他连接。
为了显示图像,浏览器必须向图像的 URL 发送另一个请求,而您的代码未处理此请求。
为了让您的服务器正常工作,您需要:
- 开始循环
- 监听连接
- 解释传入请求的 header ,然后采取适当的行动。假设您只处理 GET 请求,而不处理 POST、HEAD、PUT 等其他请求。
- 查看请求的资源(URL)
- 在文件系统上找到资源(所以现在,你必须解析 URL)
- 将资源打包成 HTTP 响应(读取文件设置适当的 mime 类型)
- 使用适当的 header (服务器响应 header )将响应发送回客户端
- 重复
要显示带有一张图像的 HTML 页面,需要两个请求,一个用于 HTML 页面,另一个用于图像。如果 HTML 代码具有指向 CSS 文件的链接,那么现在您需要三个请求 - 一个用于 HTML 页面,一个用于 CSS 文件,最后一个用于图像。所有这些请求都需要成功完成,浏览器才能呈现页面。
您永远不需要手动执行此操作,使用 web development framework它将处理所有这些“无聊”的事情,这样您就可以解决实际问题。
