Python WebSocket通信の仕方:クライアント編
ブログ管理者の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ページの記事もあわせてご覧ください。