[英]Send image over http python
我需要在不使用 HTTP 库的情况下构建一个 http 服务器。
我的服务器正在运行并且一个 html 页面正在加载,但我的<img src="..."/>
标签没有被加载,我收到了调用但无法在页面中预设 png/JPEG。
# 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
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 的工作原理,但我很确定您没有研究在实现协议时应该执行的实际标准。 关于您的实施的一些注意事项:
\\r\\n
而不是\\n
。 对于来自服务器的响应作为来自客户端的请求,这都是正确的。recv
读取。 但是,请求可以具有任意长度,并且不能保证您在单个recv
获得所有请求(TCP 是流协议而不是消息协议)。Content-length
标头中包含Content-length
或使用分块传输编码。Content-Type
标头给出,即Content-type: text/html
用于 HTML 和Content-type: image/jpeg
用于 JPEG 图像。 如果没有这个浏览器可能会正确或错误地猜测类型可能是什么,或者根据上下文也可能会坚持正确的内容类型标头。除此之外,如果您调试此类问题,找出客户端和服务器之间实际交换的内容会很有帮助。 可能是您自己检查了这一点,但您没有将此类信息包含在您的问题中。 您唯一的错误描述是“...我收到了电话,但无法在页面中预设 png/JPEG” ,然后是您的代码的转储。
像这样结束:
while True:
# Wait for client connections
client_connection, client_address = server_socket.accept()
# Handle client request
request = client_connection.recv(10240).decode()
content = handle_request(request)
# Send HTTP response
if content:
if str(content).find("html") > 0:
client_connection.send('HTTP/1.1 200 OK\n\n'.encode())
client_connection.send(content.encode())
else:
client_connection.send('HTTP/1.1 200 OK\r\n'.encode())
client_connection.send("Content-Type: image/jpeg\r\n".encode())
client_connection.send("Accept-Ranges: bytes\r\n\r\n".encode())
client_connection.send(content)
else:
response = 'HTTP/1.1 404 NOT FOUND\r\nFile Not Found'
client_connection.close()
而 Get 方法如:
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.find("html") == -1:
image_data = open('htdocs/' + args, 'rb')
bytes = image_data.read()
# Content-Type: image/jpeg, image/png \n\n
content = bytes
fin.close()
return content
# Read file contents
content = fin.read()
fin.close()
return content
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.