今回はSocket.IOについて簡単にまとめてみた&簡単なサンプルプログラムを作ってみましたという記事です
前々からWebsocketを用いてWeb上で双方向通信を行っていました
この技術は学生時のイベントでも大変お世話になった通信方式です
この上位互換的なものがあり、それがSocket.IOというやつです
双方向通信行う機会があり、Socket.IOを使ってみたいということで調査したこととPythonで簡単なサンプルアプリを作ってみましたのでメモ程度に残しておきます
Socket.IOとは
Socket.IOとはリアルタイムで双方向通信を行うことができるWebアプリケーション用のJavaScirpt用のライブラリです
一度long-polingで接続確立後、最適な通信路(long-poling, web socketなど )にて双方向通信を行います
その他、Socket.IOには以下の機能を有しています(一部抜粋)
- 再接続
- 切断検知
- ルーム機能(部屋を作りその中にいる人でメッセージを送信しあえる)
- JSONパースしてくれる
Socket.IOはJavaScirptライブラリですが、JavaやC++、Pythonなどの言語でも使うことができます
詳しいことは下記の公式サイトを参考にしてください
Socket.IOに関連する記事は下記のサイトが非常に参考になります
ざっくりまとめると、Socket.IOは双方向通信ができるライブラリであり、通信状況に応じて切り替えてくれ、再接続を行うことができ、さらには特定の人(達)にメッセージを送信するといった双方向通信に必要な機能を簡単に扱えるものではないでしょうか(個人的なまとめ)
実際にやってみましたが確かに使いやすいものでした
Socket.IOを体験してみた
Socket.IOがすげーことはわかったので実際にプログラムを作ってみました
構築方法は下記のように、Socket.IOサーバーとワンライナーのサーバーとしました
Socket.IOサーバーではない、ワンライナーのサーバーにてSocket.IOへアクセスしても双方向通信ができるか確認したいためです
プログラム
プログラムはGitHubにあげております
Socket.IOのサーバーについては、Flask-SocketIOにて実装をしました
動作としては、
メッセージが空欄だとDialogにてエラーエラーメッセージが出力されます
メッセージに文字を入力して送信すると接続されているクライアントにすべて送信されます(brodcast)
送信先を指定すると送信をしたいクライアントへメッセージを送信します(いない場合はエラーが帰ってきます)
というようになっております
クライアントの名前はランダム生成ですが、お手軽実装なので同一の名前になる可能性があります
ワンライナーのサーバー(One Liner Server)についてはLive-Serverでの起動を想定していますが、ワンライナーであればなんでも良いと思います
私自身、いろんなワンライナーのサーバーを使ってみましたがLive-Serverが圧倒的に使いやすいです
ホットリロード機能が標準であるのでわざわざサーバーを起動しなくても良いところが大変良いです
必要なモジュールなどはGitHubを見てもらえれば良いとして、中に入っているファイルについて説明します
ファイル構成は以下になっております
Server:Socket.IOサーバーとなるもの
Client:ワンライナーサーバーで起動するもの
解説というメモ
プログラム自体の解説は読んでくれーとしか言いようがありませんが、作っていた時に躓いた点や注意した方いいところを書いていきます
サーバー、クライアントともに明示的に決まっているイベントがある
それはconenctとdisconnectです(確かもう一つあった気がする)
これらはサーバー(またはクライアント)を確立したとき、また切断されたときに発火するイベントです
@socketio.on("connect", namespace="/test") def connect(): print("Clinet connected") @socketio.on("disconnect", namespace="/test") def disconnect(): print("Client disconnected")
クライアント側でcdnからjavascirptのライブラリをインポートする
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
サーバー側にて特定の人に送るには特定の人のSessionIDを引数roomに指定してあげて、emitすればよい
sid = "generate sesstion id" emit("response", {"data": message["data"]}, room=sid)
SessionIDの取得はrequest.sidで取得できる
from flask import request request.sid
とても参考になるサイト
Socket.IOを使ってみて
実際に実装してみると簡単に双方向通信に必要な機能を実装することができたと感じました
とりあえず双方向通信をしたいのであればWebSocketで作るのが非常に簡単ですが、ルーム機能や再接続処理などの機能がほしいとなるとSocket.IOに軍配が上がります
これからはこちらを使用して実装していきたいと思います
コメント