Python中非常简单的Web服务

时间:2014-03-17 08:22:17

标签: python sockets

我正在尝试用Python实现一个服务器。当浏览器使用端口号9999连接到localhost时,它将打开该页面中index.html的文件images.jpg,但无法显示该图像。如何让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()

1 个答案:

答案 0 :(得分:1)

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

为了显示图像,浏览器必须向图像的URL发送另一个请求,并且您的代码不会为此请求提供服务。

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

  1. 开始循环
  2. 倾听连接
  3. 解释传入请求的标头,然后采取适当的措施。让我们假设您只处理GET请求而不处理其他事情,如POST,HEAD,PUT等。
  4. 查看请求的资源(URL)
  5. 在文件系统上查找资源(现在,您必须解析URL)
  6. 将资源打包成HTTP响应(读取文件集合适的mime类型)
  7. 使用适当的标头(服务器响应标头)
  8. 将响应发送回客户端
  9. 重复
  10. 要显示包含一个图像的HTML页面,需要两个请求,一个用于HTML页面,另一个用于图像。如果HTML代码有一个指向CSS文件的链接,那么现在需要三个请求 - 一个用于HTML页面,一个用于CSS文件,最后一个用于图像。所有这些请求都需要成功完成,以便浏览器呈现页面。

    您永远不需要手动执行此操作,使用web development framework来处理所有这些"无聊"所以你可以解决实际问题。