【发布时间】:2020-03-07 10:25:32
【问题描述】:
我需要在不使用 HTTP 库的情况下构建一个 http 服务器。
我的服务器正在运行并加载了一个 html 页面,但我的 <img src="..."/> 标签没有加载,我收到了调用但无法在页面中预设 png/JPEG。
httpServer.py
># Define socket host and port
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8000
# Create socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(1)
print('Listening on port %s ...' % SERVER_PORT)
while True:
# Wait for client connections
client_connection, client_address = server_socket.accept()
# Handle client request
request = client_connection.recv(1024).decode()
content = handle_request(request)
# Send HTTP response
if content:
response = 'HTTP/1.1 200 OK\n\n'
response += content
else:
response = 'HTTP/1.1 404 NOT FOUND\n\nFile Not Found'
client_connection.sendall(response.encode())
client_connection.close()
# Close socket
server_socket.close()
处理调用的函数
def handle_request(request):
http = HttpHandler.HTTPHandler
# Parse headers
print(request)
headers = request.split('\n')
get_content = headers[0].split()
accept = headers[6].split()
type_content = accept[1].split('/')
try:
# Filename
filename = get_content[1]
if get_content[0] == "GET":
content = http.get(None, get_content[1], type_content[0])
return content
except FileNotFoundError:
return None
处理http动词的类
class HTTPHandler:
def get(self, args, type):
if args == '/':
args = '/index.html'
fin = open('htdocs' + args)
if type != "image":
fin = open('htdocs/' + args)
if type == "image":
fin = open('htdocs/' + args, 'rb')
# Read file contents
content = fin.read()
fin.close()
return content
意识到我正在尝试制作 HTTP 1.1,如果您发现任何不正常的地方,请提前说声谢谢。
【问题讨论】:
-
你为什么不能使用
http.server。你这样做是为了学习吗?如果是这样,也许您可以通过查看http.server模块的源代码或 Python 2BaseHTTPServer获得一些想法。 -
也许我会失明,但我看不到该代码将标题行发送到浏览器的位置。
-
@PM2Ring 是的,我这样做是作为一个学习练习,你发送的链接,我可以返回一个字符串,这个代码没有问题,当页面加载时,如果我有
<img>标记浏览器再次调用资源,这就是问题出现的地方,我不知道如何发送图像 -
为了响应浏览器的请求,您需要发送正确的标头以及二进制图像数据。 This answer 显示标题的样子。
标签: python sockets http tcp get