Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Python WebSocket通信の仕方:サーバー編

websocket server

ブログ管理者のP.Hです!

今回はPythonでWebSocket通信をする方法を紹介したいと思います。WebSocket通信ができるようになるとネットワークを介して、リアルタイムでデータのやりとりができるようになります。IotでWebアプリとやりとりしたい場合に最適です。この記事ではサーバー側のコードの説明をしてきます。

それではWebsocket通信のサーバー側のサンプルコードを紹介します。

WebSocketとは

WebSocketとは、Webアプリケーションにおいて双方向通信をする規格です。WebSocket通信を使うと、Webページの数値(センサー取得値等)をリアルタイムで更新することができます。

構成

  • サーバー      :Raspberry Pi IPアドレス 192.168.1.10 使用ポート:9001
  • クライアント:Raspberry Pi IPアドレス 192.168.1.10 使用ポート:9001

Raspberry Piをふたつ用意できなかったので、サーバーもクライアントも同じRaspberry Piです。もちろんサーバーとクライアントを別々の機器にすることも可能です。

websocket-serverモジュールのインストール

下記コマンドでwebsocket-serverモジュールをインストールします。

$ pip install git+https://github.com/Pithikos/python-websocket-server

注意事項

  • pip install websocket-serverコマンドでインストールすると最新バージョンがインストールされません。かならず上記のコマンドでインストールしてください。

上記モジュールについて詳しく知りたい方は下記ページを参照してください。
https://github.com/Pithikos/python-websocket-server

WebSocketサーバーのPythonコード

下記がサンプルコード(ws_server.py)になります。 コード内にコメントを記載していますので、参考にしてください。

from websocket_server import WebsocketServer
import logging

class Websocket_Server():

    def __init__(self, host, port):
        self.server = WebsocketServer(port, host=host, loglevel=logging.DEBUG)

    # クライアント接続時に呼ばれる関数
    def new_client(self, client, server):
        print("new client connected and was given id {}".format(client['id']))
        # 全クライアントにメッセージを送信
        self.server.send_message_to_all("hey all, a new client has joined us")

    # クライアント切断時に呼ばれる関数
    def client_left(self, client, server):
        print("client({}) disconnected".format(client['id']))

    # クライアントからメッセージを受信したときに呼ばれる関数
    def message_received(self, client, server, message):
        print("client({}) said: {}".format(client['id'], message))
        # 全クライアントにメッセージを送信
        self.server.send_message_to_all(message)
    
    # サーバーを起動する
    def run(self):
        # クライアント接続時のコールバック関数にself.new_client関数をセット
        self.server.set_fn_new_client(self.new_client)
        # クライアント切断時のコールバック関数にself.client_left関数をセット
        self.server.set_fn_client_left(self.client_left)
    # メッセージ受信時のコールバック関数にself.message_received関数をセット
        self.server.set_fn_message_received(self.message_received) 
        self.server.run_forever()

IP_ADDR = "192.168.1.10" # IPアドレスを指定
PORT=9001 # ポートを指定
ws_server = Websocket_Server(IP_ADDR, PORT)
ws_server.run()

それではコードの説明をします。

  • ws_server = Websocket_Server(IP_ADDR, PORT)
    サーバーのIPアドレスとポート番号を引数に指定して、Websocket_Serverクラスを生成します。

  • ws_server.run()
    下記の3つのコールバック関数の設定を行った後、WebSocketサーバーを起動します。

  • self.server.set_fn_new_client(self.new_client)
    クライアントが接続したときに、呼ばれる関数(コールバック関数)を設定します。クライアントが接続したときに、引数で指定したself.new_client関数が呼ばれます。new_client関数は、すべてのクライアントに"hey all, a new client has joined us"とメッセージを送信します。

  • self.server.set_fn_client_left(self.client_left)
    クライアントが切断したときに、呼ばれる関数(コールバック関数)を設定します。クライアントが切断したときに、引数で指定したself.client_left関数が呼ばれます。self.client_left関数は、切断したclient idをprint文で表示します。

  • self.server.set_fn_message_received(self.message_received)
    クライアントからメッセージを受信したときに、呼ばれる関数(コールバック関数)を設定します。メッセージを受信したときに、引数で指定したsend_msg_allclient関数が呼ばれます。send_msg_allclient関数では、すべてのクライアントに受信したメッセージを送信します。

クライアントからサーバーにメッセージを送ると、サーバーはそのメッセージを接続している全てのクライアントに送信します。

これでWebSocketのサーバー側のコードは完成です。下記のWebSocketクライアント、Webページの記事もあわせてご覧ください。

www.raspberrypirulo.net

www.raspberrypirulo.net