MUDAなことをしよう。MUDAなことをしよう。最近はおもちゃづくりばっかりやっていましたが、超超超久しぶりに、基礎勉強のお話です。自分の本業の兼ね合いもあって、PythonでWebSocketを扱えるようにしておきたいと思います。クラウド連携するおもちゃを作るときに役立つかもしれませんし。いうこともやらないと、できることの幅が広がらないのです。「そもそもWebSocketとは何ぞや?」という方は、以下の方がシンプルにまとめてくださっているので、ご参照ください。WebSocketについて調べてみた。自分はおぼろげに「WebSocketってプロトコルのレイヤ的にはHTTPの上位なんだっけ??」とか思っていたのですが、そうではなくて、レイヤ的にはHTTPと同列で、最初のハンドシェイクの部分だけをHTTPと同じ形にして、途中でプロトコルを切り替えるような感じなんですね。することによって、エンドツーエンドの間の機器たちにはあたかもただのHTTP通信が始まったかのように見えるという。考えた人はすごいなあ。WebSocketについては、既に先人の方が情報を公開してくださっています。WebSocket通信の仕方(サーバー側)WebSocket通信の仕方(クライアント側)以下では上記の内容をベースにさせて頂きつつ、サンプルコードを自分の勉強を兼ねてちょっとアレンジしていきたいと思います。サーバ側のプログラムの準備。Pi)の中で、サーバとクライアントを通信させます。以下のモジュールをインストールします。websocket-server”でもインストールできるみたいですが、公開元によれば、後者のやり方だとソースが最新ではないかもしれないとのことなので、このやり方でインストールしています。ソースコードは公開元のサンプルをベースに以下のようにしてみました。server.run_forever()ローカルホストのポート12345番で待ち受けるようにします。次に、クライアント側です。こちらは、以下のモジュールをインストールします。websocket-client公開元ではコネクションをすぐ切断する版と長く保つ版の二種類のサンプルソースが用意されているので、それぞれをベースに二種類作ってみます。'{}'".format(result))ws.close()logger.info("Close")続いて長く保つ版です。ws.run_forever()以上で準備ができましたので、動作確認していきます。Piに別々のシェルでログインしておきます。サーバ側を実行します。clients..ポート番号12345で待ち受けが始まりました。続いて、クライアント側の方のシェルで「コネクションをすぐ切断する版」を実行します。World”という文字列が返ってきていることがわかります。サーバ側の方もログが出力されています。left....何か同じようなログが重複して出力されていますね。loggingモジュールについては自分も勉強を始めたところですが、おそらく、サーバモジュールの方でルートロガーに対してbasicConfigを設定してしまっているのが原因ではないか、と思います。ログを見る限りは、こちらも問題なく動作していることが確認できます。続いて、「コネクションを長く保つ版」のクライアントを実行してみます。terminating...こちらも問題ないですね。ちなみに、ソースコードの39〜40行目のwebsocket.enableTraceの引数をFalseからTrueにすると、websocket-clientモジュールのログが出力されるようになり、最初のHTTPを利用したコネクション確立のやりとりが見られるようになります。Closeというわけで、同一ローカルマシン内での検証ですが、簡単にWebSocketをテストしてみました。今回はクライアント側からの送信要求に対してメッセージを返しているだけなので、動作としてはHTTPのリクエストとレスポンスとあんまり変わらないように見えるかもしれません。WebSocketのプロトコル自体は、一度クライアント側から接続してしまえば、後はサーバ側から自由にデータをプッシュできるようになっているので、必要に応じて、今回のサンプルをベースに拡張していけば良いかと思います。AMシンプルで読みやすい記事でした。無駄のない記事がとてもよかったです。適度なコメントによるコマンド説明も含めて。PMRock8123様ありがとうございます。PMわかりやすい記事をありがとうございます。参考にさせていただきました。一つ質問なのですが、ファイル送信をWebsocketで実施したいときはどのように書き換えを行えばよいでしょうか。可能であれば、JSON形式を送受信したいと考えております。初心者故に拙い質問で申し訳ありませんが、よろしくお願いします。PMmae様すみません、随分前の記事で、かつ最近自分がWeb技術界隈から離れてしまったため、お答えすることができません。直感ですが、JSON形式であれば結局のところ文字列として表現できるはずハズですので、とりあえず送信側はJSONファイルを読み込んで文字列として送信、受信側は受け取った文字列をJSONとしてパース、とすれば、やりとり自体はできそうな気がします。調べずに回答してしまっているため、不正確であれば申し訳ありません。コメントをキャンセルメールアドレスが公開されることはありません。hidaka_hirojiAmazonほしいものリストこちら自身の工作用に使いたいものがメインですが、必ずしも工作に使うわけではないのでご了承ください。MUDAなことをしよう。