Socket.IOについて簡単にまとめたり試してみたりした

今回は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などの言語でも使うことができます

詳しいことは下記の公式サイトを参考にしてください

What Socket.IO isSocket.IO is a library that enables real-time, bidirectional and event-based communication between the browser and the server. It consists of: ...

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が圧倒的に使いやすいです

ホットリロード機能が標準であるのでわざわざサーバーを起動しなくても良いところが大変良いです

socketIOを行う自己的なサンプルプログラム. Contribute to Momijinn/mySampleSocketIO development by creating an account on GitHub.

必要なモジュールなどはGitHubを見てもらえれば良いとして、中に入っているファイルについて説明します

ファイル構成は以下になっております

Server:Socket.IOサーバーとなるもの

Client:ワンライナーサーバーで起動するもの

解説というメモ

プログラム自体の解説は読んでくれーとしか言いようがありませんが、作っていた時に躓いた点や注意した方いいところを書いていきます

サーバー、クライアントともに明示的に決まっているイベントがある

それはconenctとdisconnectです(確かもう一つあった気がする)

これらはサーバー(またはクライアント)を確立したとき、また切断されたときに発火するイベントです

クライアント側でcdnからjavascirptのライブラリをインポートする

サーバー側にて特定の人に送るには特定の人のSessionIDを引数roomに指定してあげて、emitすればよい

SessionIDの取得はrequest.sidで取得できる

とても参考になるサイト

Socket.IOを使ってみて

実際に実装してみると簡単に双方向通信に必要な機能を実装することができたと感じました

とりあえず双方向通信をしたいのであればWebSocketで作るのが非常に簡単ですが、ルーム機能や再接続処理などの機能がほしいとなるとSocket.IOに軍配が上がります

これからはこちらを使用して実装していきたいと思います

参考

スポンサーリンク