好吧,首先我想指出,不能使用任何网络库。我尝试做的目的是了解如何使用字符串操作/转换来提供http1.1标头和数据。在这种情况下,我试图提供一个带有url的.jpg文件:
http://127.0.0.1:8080/01.jpg
我的服务器已经收到GET请求,我的问题似乎来自文件i/o或我向客户端发送数据的方式。我承认我是python和HTTP的新手,所以请对我温柔一点;)。这是在ubuntu 14.04上的python 3.4上完成的。
相关代码:
file_data = open(file_directory,'rb')
...
# Other code in between exists
...
# res is a unicode string that contains the headers for the http response
header = bytes(res, 'ascii')
# Send Response header
client_sock.sendall(header)
# Send file data
client_sock.sendall(file_data)
问题:
是否预期.jpg文件的二进制读取为:
<_io.BufferedReader name='/home/website/html/01.jpg'>
我看到过来自多个来源的其他二进制值,它们看起来一点也不像这样。根据我的理解,数据需要是二进制的,以便服务器通过套接字将其发送到客户端。如果这不正确,我的文件I/o中缺少什么?如果这是正确的,我错过了什么步骤可以让我使用sendall()发送数据?
考虑到上面的问题,file_data如何影响sendall()?
client_sock.sendall(file_data) TypeError: '_io.BufferedReader' does not support the buffer interface
通过阅读python3文档第18.1节,我发现sendall()的参数应该是字节。file_data是否需要像头一样使用字节(xxx,"idk what encoding")进行编码?使用"ascii"根本不起作用。
- 您是否建议我使用字节数组来存储http响应标头和文件数据,以便在一个sendall()中同时发送这两个数据?或者这不是必要的吗
浏览器(Firefox)上的输出:
The image "http://127.0.0.1:8080/01.jpg" cannot be displayed because it contains erros.
谢谢大家。如果需要更多信息,请告诉我。
好吧,伙计们,看起来我的问题很简单。解决方案是使用下面的代码发送所有数据。
# Replace code for data send all with line below:
client_sock.sendall(filedata.read())
# This only creates a file type object that we can read.
# Not responsible for an actual read!
file_data = open(file_directory,'rb')
x.read()将根据open对文件对象x的定义实际读取该对象。
我现在意识到file_data不是读取数据,而是文件对象