ブログ管理者の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ページの記事もあわせてご覧ください。