Python中的简单Web服务
我正在尝试用Python实现一个服务器。当浏览器连接到本地地址(localhost)并使用9999端口时,它会打开一个叫做index.html
的文件,这个页面里有images.jpg
的图片,但图片却无法显示。我该如何让这个网页服务器也能处理图片呢?
这是我目前的代码:
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()
1 个回答
1
你的代码创建了一个无限循环,只能发送一个文件,永远不会接受其他连接。
为了让图片显示,浏览器需要向图片的地址发送另一个请求,而你的代码并没有处理这个请求。
为了让你的服务器正常工作,你需要:
- 启动一个循环
- 监听连接
- 解析进入请求的头信息,然后做出相应的处理。假设你只处理GET请求,而不处理其他类型的请求,比如POST、HEAD、PUT等。
- 查看请求的资源(也就是URL)
- 在文件系统中找到这个资源(所以你需要解析这个URL)
- 把资源打包成一个HTTP响应(读取文件并设置合适的mime类型)
- 将响应发送回客户端,并附上合适的头信息(服务器响应头)
- 重复以上步骤
要显示一个包含图片的HTML页面,需要进行两个请求,一个是请求HTML页面,另一个是请求图片。如果HTML代码中有链接到CSS文件,那么你就需要三个请求——一个请求HTML页面,一个请求CSS文件,最后一个请求图片。所有这些请求都必须成功完成,浏览器才能正确显示页面。
你不需要手动完成这些工作,可以使用一个web开发框架,它会处理这些“无聊”的事情,这样你就可以专注于解决实际问题。