以二进制形式读取http服务器python 3.4的图像



好吧,首先我想指出,不能使用任何网络库。我尝试做的目的是了解如何使用字符串操作/转换来提供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)

问题:

  1. 是否预期.jpg文件的二进制读取为:

    <_io.BufferedReader name='/home/website/html/01.jpg'>
    

我看到过来自多个来源的其他二进制值,它们看起来一点也不像这样。根据我的理解,数据需要是二进制的,以便服务器通过套接字将其发送到客户端。如果这不正确,我的文件I/o中缺少什么?如果这是正确的,我错过了什么步骤可以让我使用sendall()发送数据?

  1. 考虑到上面的问题,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"根本不起作用。

  1. 您是否建议我使用字节数组来存储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不是读取数据,而是文件对象

相关内容

  • 没有找到相关文章

最新更新