まず、ネットワーク ライブラリは使用できないことを指摘しておきます。私がやろうとしていることの目的は、文字列操作/変換を使用して 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)
質問:
.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 は、ヘッダーのように bytes(xxx, 'idk what encoding') を使用してエンコードする必要がありますか? 「ascii」を使用してもまったく機能しませんでした。
- バイト配列を使用して http 応答ヘッダーとファイル データの両方を格納し、両方を 1 つの sendall() で送信できるようにすることをお勧めしますか? それとも、これは必要ありませんか?
ブラウザ (Firefox) での出力:
The image "http://127.0.0.1:8080/01.jpg" cannot be displayed because it contains erros.
皆さん、ありがとうございました。さらに詳しい情報が必要な場合はお知らせください。