まずは、Hello HTTP(01)

Raspberry Pi 3 model BにOSをインストールしたらhttp.server を持ったpython3が同時にインストールされました。このライブラリを使うとhttpサーバを簡単に立ち上げる事が出来ます。カスタマイズ出来る軽いサーバとしてかなり重宝しています。

プログラムを書く前に

Raspberry Piで何か開発する場合Raspberry Piで全て行っても良いのですが、プログラムはデスクトップで実行のみRaspberry Piとした方が開発の効率が上がります。そこで、SSHSambaを使って、両者をつなぎます。

  • デスクトップからRaspberry Pi にSSHを使って接続。接続後、開発用のディレクトリに移動。
  • Sambaの共有フォルダを開発用のディレクトリに設定し、デスクトップと共有。
  • デスクトップのエディタを使用しプログラムを書き、Raspberry Piの共有フォルダに保存
  • その後、SSHの画面からプログラムを実行する。

Pi 3 model BはWiFiを持っているので、Pi 3には電源ケーブルをつなぐだけで開発が出来ます。
今回のネット環境は下記の様にRaspberry Pi とデスクトップPCは1つのルータにつながっている状態です。

先ずは、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”をクライアントに送信し送信完了。
  • 12行目: host = ”
    • ここは、ホスト名を指定する箇所ですが、この様に指定して下さい。
    • これで、サーバーへのアクセスは以下の様になります。
      • Raspberry Piから=>”localhost”
      • 他のコンピュータから=>”raspberrypi.local”
  • 13行目: 通信に使うポートを指定します。今回は8080.
  • 14行目: ここでサーバが起動します。
  • 15行目: これで、サーバが無限ループとなる様です。

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

ブラウザ側ですが、今回はポートに8080ポートを指定しているので

  • 違うPCからアクセスする場合: ”raspberrypi.local:8080″と入力
  • Raspberry Piからアクセスする場合: ”localhost:8080″と入力

”Hello HTTP!”が表示されました。簡単に動作の説明をすると

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

です。

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

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