モチベーション
- django で web app を作っているときにトランプゲームアプリを作りたくなった
- オンラインで対戦できる仕様にしたい
- server からの送信も必要となり、双方向の通信ができるようにしたい
- そこで WebSocket を使う、、、
まとめスライド
WebSocket Study
2020/05/11
Index
WebSocket とは
HTTP との比較
通信の仕組み
ハンドシェイク
双方向通信の実現
Python での利用
Django での利用
ASGI
WebSocket とは
プロトコルの一種
Webにおいて双方向通信を低コストで行うための仕組み
WebSocket は HTTP 上の相乗りプロトコル
確立済みの HTTP/HTTPS 回線上で任意長・任意フォーマットデータの双方向通信
RFC WebSocket Protocol (日本語 非公式)
HTTPとの比較
HTTP
1つのコネクションで1つのリクエスト
リクエストはクライアントからしか送ることができない
WebSocket
一度コネクションを確立したあとは、サーバとクライアントのどちらからも通信を行うことが可能(サーバプッシュ機能)
一度コネクションを確立するとそのコネクション上で通信を行う
通信の仕組み ~ ハンドシェイク
ハンドシェイクはHTTP通信によって行われる。
リクエスト
HTTPのUpgradeヘッダを使用し、プロトコルの変更を行う。
レスポンス
ステータスコード101「Switching Protocols」が返る。
ハンドシェイクによってコネクションが確立し、これ以降はHTTPではなくWebSocketのプロトコルで通信が行われることになる。
通信の仕組み ~ 双方向通信の実現
ハンドシェイクによってコネクションが確立すると、双方向通信をWebSocketプロトコルで行うことができるようになる。
送信データはフレームという単位で扱われる。
Python での利用
library
websocket_client
websockets
Django での利用
library
channels
ASGI
Asynchronous Server Gateway Interface
WSGI を継承
asyncioを介して非同期で実行される
複数のプロトコルをサポート
Channels の独自規格?
Reference
調査まとめ
今さら聞けないWebSocket~WebSocketとは~
WebSocket のはなし