Python HTTPServer 〜Soket送信時のエラー対処〜

イントロダクション

PythonのSocketからHTTPServerへのデータ送信後にレスポンスを返そうとするとエラーになる、ちなみにURLにブラウザでアクセスしたときは問題なく表示する。

<エラーメッセージ>

Exception happened during processing of request from ('127.0.0.1', 50519)
  ・
  ・
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

<HTTPServer>

class MyMinimumServerHandler(BaseHTTPRequestHandler):
    def do_PSOT(self):
        print(self.headers)
        file_path = os.getcwd() + "/first.html"
        print("*******" + file_path + "********")
        print("*******" + self.path + "********")
        try:
            self.path = os.getcwd()
            print("File Open: " + file_path)
            #file = open(file_path)
            self.send_response(200)
            self.send_header('Content-type','text-html')
            self.end_headers()
            print("Created Header!")
            self.wfile.write("Hello")
            #self.wfile.write(file.read())
            #file.close()
            print("File CLosed!")
            return
        except  IOError:
                self.send_error(400, 'File Nout Found...')

<送信側:Socket>

def sendServer(msg):
    HOST = "localhost"
    PORT = 8000
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send("GET / HTTP/1.1\r\n\r\n")
    s.send(msg)
    data = s.recv(1024)
    print(repr(data))
    s.close()

このエラーは、上の赤い字の部分に原因がありエンコードを指定しないといけないようでした。

解決1

self.wfile.write("Hello") → self.wfile.write(message.encode('utf-8')

※「message」は変数です。出力する文字をエンコード処理すると言うことです。

エラー2

一難去ってまた一難。。。

code 501, message Unsupported method ('POST')

上のようなエラーメッセージが出ました。

解決2

メソッドの定義ミスでした。サーバー「do_PSOT」→「do_POST」が正しい

エラー3

error: [Errno 32] Broken pipe

これはこのサイトを参照しました。が解決には至らず。。。

これは、ブラウザに返信の処理を行う場合はエラーが出ず、Socket送信した時に出るエラーなのですが、よく考えてみれば表示(出力)先がないならエラーになるよなぁ。。。

結果

レスポンスを返却する時に受けるもの(ブラウザなど)がないとエラーになる!当たり前か。。。


関連ページ一覧

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す