0

まず、ネットワーク ライブラリは使用できないことを指摘しておきます。私がやろうとしていることの目的は、文字列操作/変換を使用して http 1.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 は、ヘッダーのように bytes(xxx, 'idk what encoding') を使用してエンコードする必要がありますか? 「ascii」を使用してもまったく機能しませんでした。

  1. バイト配列を使用して http 応答ヘッダーとファイル データの両方を格納し、両方を 1 つの sendall() で送信できるようにすることをお勧めしますか? それとも、これは必要ありませんか?

ブラウザ (Firefox) での出力:

The image "http://127.0.0.1:8080/01.jpg" cannot be displayed because it contains erros.

皆さん、ありがとうございました。さらに詳しい情報が必要な場合はお知らせください。

4

1 に答える 1

0

わかりました、私の問題は非常に単純だったようです。解決策は、データの sendall に以下のコードを使用することでした。

# 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 は読み取りデータではなく、ファイル オブジェクトであることに気付きました!!!

于 2014-09-28T09:09:12.310 に答える