[解決済み】Python HTTP Server/Client: リモートエンドが応答なしで接続を閉じたエラー
質問
で簡単なHTTPサーバを作りました。
BaseHTTPRequestHandler
. 問題は、クライアントからのリクエストを使ってデータを投稿したい場合、次のようなことが起こることです。
ConnectionError
. 単純なリクエストは
{コード
libのドキュメントです。また、面白いことに、HTTPサーバーはクライアントからデータを受け取り、それをコンソールに表示します。どうしてそんなことが可能なのか理解できないのですが。
クライアント
プレrequests
HTTPサーバーです。
def post_data():
"""Client method"""
json_data = {
'sender': 'User',
'receiver': 'MY_SERVER',
'message': 'Hello server! Sending some data.'}
data_headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
data_payload = json.dumps(json_data)
try:
post = requests.post('http://localhost:8080/post', data=data_payload,
headers=data_headers)
print(post.status_code)
except ConnectionError as e:
print("CONNECTION ERROR: ")
print(e)
サーバーの結果です。
def do_POST(self):
"""Server method"""
self.send_response(200)
print("Receiving new data ...")
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print(post_data)
クライアントの結果
C:\Users\mypc\Projects\PythonFiles\httpserver>python server.py
Fri Jan 5 01:09:12 2018: HTTP Server started on port 8080.
127.0.0.1 - - [05/Jan/2018 01:09:21] "POST /post HTTP/1.1" 200 -
Receiving new data ...
b'{"sender": "User", "receiver": "MY_SERVER", "message": "Hello server! Sending some data."}'
例外ブロックのないエラー。
C:\Users\mypc\Projects\PythonFiles\httpserver>python client.py
CONNECTION ERROR:
('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
C:\Users\mypc\Projects\PythonFiles\httpserver>
解決するには?
サーバーが完全な応答を送信せずに、接続を早期に終了しているように見えます。ドキュメントをざっと読んでみましたが、これが問題だと思います(強調)。
Traceback (most recent call last): File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen chunked=chunked) File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 387, in _make_request six.raise_from(e, None) File "<string>", line 2, in raise_from File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 383, in _make_request httplib_response = conn.getresponse() File "C:\Python36\lib\http\client.py", line 1331, in getresponse response.begin() File "C:\Python36\lib\http\client.py", line 297, in begin version, status, reason = self._read_status() File "C:\Python36\lib\http\client.py", line 266, in _read_status raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Python36\lib\site-packages\requests\adapters.py", line 440, in send timeout=timeout File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen _stacktrace=sys.exc_info()[2]) File "C:\Python36\lib\site-packages\urllib3\util\retry.py", line 357, in increment raise six.reraise(type(error), error, _stacktrace) File "C:\Python36\lib\site-packages\urllib3\packages\six.py", line 685, in reraise raise value.with_traceback(tb) File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen chunked=chunked) File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 387, in _make_request six.raise_from(e, None) File "<string>", line 2, in raise_from File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 383, in _make_request httplib_response = conn.getresponse() File "C:\Python36\lib\http\client.py", line 1331, in getresponse response.begin() File "C:\Python36\lib\http\client.py", line 297, in begin version, status, reason = self._read_status() File "C:\Python36\lib\http\client.py", line 266, in _read_status raise RemoteDisconnected("Remote end closed connection without" urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "client.py", line 137, in <module> start_parser() File "client.py", line 101, in start_parser send_requests(args.get, args.post) File "client.py", line 51, in send_requests post_data() File "client.py", line 129, in post_data headers=data_headers) File "C:\Python36\lib\site-packages\requests\api.py", line 112, in post return request('post', url, data=data, json=json, **kwargs) File "C:\Python36\lib\site-packages\requests\api.py", line 58, in request return session.request(method=method, url=url, **kwargs) File "C:\Python36\lib\site-packages\requests\sessions.py", line 508, in request resp = self.send(prep, **send_kwargs) File "C:\Python36\lib\site-packages\requests\sessions.py", line 618, in send r = adapter.send(request, **kwargs) File "C:\Python36\lib\site-packages\requests\adapters.py", line 490, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
に応答ヘッダを追加する。 ヘッダーバッファに記録し、受け入れられたリクエストをログに記録します。HTTP レスポンス行 が内部バッファに書き込まれ、その後にServerとDateが続く。 ヘッダを表示します。この2つのヘッダの値は version_string() と date_time_string() メソッドをそれぞれ使用します。もし サーバは他のヘッダを送信するつもりはありません。 send_header()メソッドの後に、send_response()を実行する必要があります。 end_headers() を呼び出します。
バージョン3.3で変更:ヘッダーは内部バッファに格納され end_headers() を明示的に呼び出す必要があります。
というわけで、おそらくはこの呼び出しを
send_response(code, message=None)
. もしあなたが古い例(Python 3.3以前)を読んでいたなら、これは必要なかったでしょう。
関連
-
pythonを使ったオフィス自動化コード例
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
PythonはWordの読み書きの変更操作を実装している
-
Python 入出力と高次代入の基礎知識
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
Python Pillow Image.save jpg画像圧縮問題
-
Python 入出力と高次代入の基礎知識
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].