Python中的简单Web服务

2 投票
1 回答
624 浏览
提问于 2025-04-17 22:38

我正在尝试用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

你的代码创建了一个无限循环,只能发送一个文件,永远不会接受其他连接。

为了让图片显示,浏览器需要向图片的地址发送另一个请求,而你的代码并没有处理这个请求。

为了让你的服务器正常工作,你需要:

  1. 启动一个循环
  2. 监听连接
  3. 解析进入请求的头信息,然后做出相应的处理。假设你只处理GET请求,而不处理其他类型的请求,比如POST、HEAD、PUT等。
  4. 查看请求的资源(也就是URL)
  5. 在文件系统中找到这个资源(所以你需要解析这个URL)
  6. 把资源打包成一个HTTP响应(读取文件并设置合适的mime类型)
  7. 将响应发送回客户端,并附上合适的头信息(服务器响应头)
  8. 重复以上步骤

要显示一个包含图片的HTML页面,需要进行两个请求,一个是请求HTML页面,另一个是请求图片。如果HTML代码中有链接到CSS文件,那么你就需要三个请求——一个请求HTML页面,一个请求CSS文件,最后一个请求图片。所有这些请求都必须成功完成,浏览器才能正确显示页面。

你不需要手动完成这些工作,可以使用一个web开发框架,它会处理这些“无聊”的事情,这样你就可以专注于解决实际问题。

撰写回答