まずは、Hello HTTP(01)

python3のhttp.server を使用すると簡単にhttpサーバを立ち上げる事が出来ます。カスタマイズ出来る軽いサーバとしてかなり重宝しています。

プログラムを書く前に

SSHSambaを使えばプログラムの編集をデスクトップで実行をRaspberry Piで行う事が出来ます。Raspberry Piのみで開発するより開発の効率が上がります。この環境ではPi 3 model Bに電源を入れるだけで開発が出来ます。

サーバの立ち上げ

先ずは、アクセスすると”Hello HTTP”と表示するサーバを立ち上げます。プログラムは非常に簡単です。

hello.py

from http.server import HTTPServer, SimpleHTTPRequestHandler

class MyHandler(SimpleHTTPRequestHandler):
            
    def do_GET(self):

        self.send_response(200)
        self.send_header('Content-type', "text/html")
        self.end_headers()
        self.wfile.write("<h1>Hello HTTP!</h1> \n".encode())

host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()
  • 1行目: from http.server import HTTPServer, SimpleHTTPRequestHandler
    • HTTPServer :サーバ本体のモジュール
    • SimpleHTTPRequestHandler: GETやPOST等コマンド関係のモジュール
  • 3行目: class MyHandler(SimpleHTTPRequestHandler):
    • SimpleHTTPRequestHandlerクラスを基底にした新しいクラスの宣言
    • ここで、クライアントからの要求を処理。
    • 5行目: def do_GET(self):
      • クライアントから、”GET”要求が有った場合、この関数が実行される。
      • 7行目: クライアントに、”GET”要求を受けた事を返答。
      • 8行目: これから送るデータは、”HTML”形式
      • 9行目: 先ずはヘッダーをクライアントに送信
      • 10行目: ”<h1> Hello HTTP!</h1> \n”をクライアントに送信し送信完了。
  • 14行目: HTTPServer()関数の引数は、server_addressと RequestHandlerClassです。
    • server_address: host(文字列)と port(数字) からなるタプル型変数
      • host: サーバーがリッスンするアドレス
        • 12行目: hostに ”(空文字列)を指定するとすべての利用可能なインターフェースを
               意味します。
      • port: 通信に使うポート番号。
        • 13行目: 今回は8080を指定
    • RequestHandlerClass: リクエストの処理。 MyHandlerを指定しています。
  • 15行目: これで、サーバが無限ループ。

プログラムは、”hello.py” と保存して下さい。SSHで同じディレクトリに移動し、$ sudo python3 hello.py と実行して下さい。これでサーバが立ち上がります。

ブラウザからアクセス

ホスト名”raspberrypi”でOSをインストールしているので、ブラウザにURL欄に”raspberrypi.local:8080″と入力すると”Hello HTTP!”と表示されます。また、Raspberry Piからアクセスする場合は”localhost:8080″と入力しても同じ結果になります。

  • ブラウザのURL欄に ”raspberrypi.local:8080″ と入力
  • Raspberry Piからアクセスする場合: ”localhost:8080″と入力

今回の環境ではルーターのDNS機能によりraspberry pi立ち上げ時自動でIPアドレスが割り当てられます。HTTPServer()関数の引数hostに ”(空文字列)を指定すると自動で割り当てられたIPアドレスがサーバにものと判断されプログラムが実行されます。つまりDNSでサーバのIPアドレスが自動で割り当てられる時にはhostに ”(空文字列)を、固定IPの時にはそのIPアドレスを(‘192.168.1.3’等)指定します。

簡単に動作の説明をすると以下の通り

  1.  ブラウザのURL欄に、”raspberrypi.local:8080″または、”localhost:8080″を入力するとサーバにGETリクエストが送信。
  2.  GETリクエストを受けたサーバは、 do_GET(self)を実行します。
    • do_GET(self)では、クライアントに
      • GETリクエストを受けた事をself.send_response(200)で返し、
      • ”Hello HTTP!”を送信
  3.  送信後サーバはクライアントからのリクエスト待ループに入る。
  4.  サーバからのデータを受けたクライアントのブラウザの画面には、”Hello HTTP!”が表示される。

HTTPサーバはSSHの画面で、”Ctrl+C” を押せば停止します。

次回は、HTMLをファイルに保存して、”index.html”をクライアントに送ってみようと思います。

<<Before