Raspberry Pi & Python 開発ブログ ☆彡

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

Python WebSocket通信の仕方:クライアント編

websocket client

ブログ管理者の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-clientモジュールのインストール

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

$ sudo pip install websocket-client

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

WebSocketサーバーのPythonコード

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

import websocket
try:
    import thread
except ImportError:
    import _thread as thread
import time

class Websocket_Client():

    def __init__(self, host_addr):

        # デバックログの表示/非表示設定
        websocket.enableTrace(True)

        # WebSocketAppクラスを生成
        # 関数登録のために、ラムダ式を使用
        self.ws = websocket.WebSocketApp(host_addr,
            on_message = lambda ws, msg: self.on_message(ws, msg),
            on_error   = lambda ws, msg: self.on_error(ws, msg),
            on_close   = lambda ws: self.on_close(ws))
        self.ws.on_open = lambda ws: self.on_open(ws)

    # メッセージ受信に呼ばれる関数
    def on_message(self, ws, message):
        print("receive : {}".format(message))

    # エラー時に呼ばれる関数
    def on_error(self, ws, error):
        print(error)

    # サーバーから切断時に呼ばれる関数
    def on_close(self, ws):
        print("### closed ###")

    # サーバーから接続時に呼ばれる関数
    def on_open(self, ws):
        thread.start_new_thread(self.run, ())

    # サーバーから接続時にスレッドで起動する関数
    def run(self, *args):
        while True:
            time.sleep(0.1)
            input_data = input("send data:") 
            self.ws.send(input_data)
    
        self.ws.close()
        print("thread terminating...")
    
    # websocketクライアント起動
    def run_forever(self):
        self.ws.run_forever()


HOST_ADDR = "ws://192.168.1.10:9001/"
ws_client = Websocket_Client(HOST_ADDR)
ws_client.run_forever()

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

  • ws_client = Websocket_Client(HOST_ADDR)
    サーバーのIPアドレスとポート番号を引数にして、Websocket_Clientクラスをnewします。

  • ws_client.run_forever()
    __init__関数で、on_***メゾット(イベントハンドラ)に関数の登録を行い、WebSocketクライアントを起動します。

  • def on_message(self, ws, message):
    サーバーからのメッセージ受信に呼ばれる関数です。受信したメッセージをprint文で表示します。

  • def on_error(self, ws, error):
    エラー時に呼ばれる関数です。エラーメッセージをprint文で表示します。

  • def on_close(self, ws):
    サーバーから切断した時に呼ばれる関数です。"### closed ###"とprint文で表示します。

  • def on_open(self, ws):
    サーバーに接続した時に呼ばれる関数です。スレッドで、self.run関数を起動します。

  • def run(self, *args):
    サーバーに接続した時に呼ばれる関数(on_open関数からスレッド起動)です。プロントから入力された文字をサーバーに送信します。

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

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

www.raspberrypirulo.net

www.raspberrypirulo.net