Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ws
Search
Masahiro
May 24, 2026
Programming
48
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ws
情報科学実験A第1部のスライド担当部分
Masahiro
May 24, 2026
More Decks by Masahiro
See All by Masahiro
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
100
EffectDeck_KC3_2026.pdf
satomasahiro2005
0
290
part2_slides_public.pdf
satomasahiro2005
0
50
Other Decks in Programming
See All in Programming
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
210
ActionController meets Protocol Buffers
sorah
0
440
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
25
29k
Domain-Driven Transformation
hschwentner
2
2.3k
ChromeでローカルLLM
ryu1013
0
140
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
150
Simple Storage Service(S3) is not simple
iwatsukayura
0
280
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Event is what happens
moro
2
680
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
280
A Soul's Torment
seathinner
8
3.8k
Crafting Experiences
bethany
1
380
Marketing to machines
jonoalderson
1
5.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Transcript
機能拡張:WebSocket (WebScoketはWSと略記します)
WSとは •ブラウザとサーバの間でリアルタイムな 双方向通信を行うためのプロトコル •チャットやゲームでよく採用されている •Discord, Mattermost •Slither.io, Krunker.io
HTTPとの関係 •Devtoolsで ふつうに見れる • HTTPから プロトコルを 切り替える
HTTPとの関係 •Devtoolsで ふつうに見れる • HTTPから プロトコルを 切り替える
WSにアップグレードする •GETリクエストをClient •Connection: Upgrade付きのリクエスト がくる GET / HTTP/1.1 Host: 169.254.157.182:10001
Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36 Upgrade: websocket Origin: http://169.254.157.182:10001 Sec-WebSocket-Version: 13
WSにアップグレードする •WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header Sec-WebSocket-Accept
の計算 1. クライアントから Sec-WebSocket-Key を受け取る 2. その文字列の後ろに、固定のGUIDを連結する 3. 連結した文字列を SHA-1 でハッシュする 4. SHA-1の結果を Base64 エンコードする 5. それを Sec-WebSocket-Accept として返す
•WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header WSにアップグレードする
•WSハンドシェイク •Sec-Websocket-Keyから Sec-Websocket-Acceptを 作って検証する Request Header Response Header HTTPdaemonは 計算しない
WSにアップグレードする
HTTPdaemonは何をするんだ WSdaemonがあるのか? ない
HTTPdaemonは何をするんだ WSdaemonがあるのか? •HTTPサーバとWSサーバの役割は 全然違う •WSはアプリケーション •Connection: Upgrade付きの リクエストが来たらHTTPdaemonは バックエンドにProxyするだけでいい (apache/httpdやnignx/nignxはちゃんとWSフレームを読んで色々やってる)
WSのことは WSサーバ(バックエンド)に任せよう •Sec-Websocket-Acceptの計算とか •WSフレームの解析とか •WSのサーバーはNodeとかRailsとかで 簡単に用意する •より詳しく知りたいならMDNの記事を 見るといい↓ https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
WSのことは WSサーバ(バックエンド)に任せよう •Sec-Websocket-Acceptの計算とか •WSフレームの解析とか •WSのサーバーはNodeとかRailsとかで 簡単に用意する •より詳しく知りたいならMDNの記事を 見るといい↓ https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API/Writing_WebSocket_servers HTTPサーバー
の授業だし
すること •ヘッダー解析・WebSocketの判定 •リバースプロキシの実装 •Javascript 対応(フロントエンド) •簡易チャットアプリの用意 (バックエンドWSサーバ含む)
ヘッダー解析 •ヘッダーを最初の1行だけでなく すべて(\r\n\r\nまで)読む •ヘッダーを1行ずつ見てWebSocketに 必要な値を保存する
WebSocketの判定 •メソッドがGET •Upgradeがwebsocket •Connectionにupgradeが含まれる •Sec-WebSocket-Keyが存在する •Sec-WebSocket-Versionが13 →リバースプロキシに分岐
リバースプロキシの実装 •exp1_tcp_connectで転送先サーバーに TCP接続する •ブラウザから受け取ったUpgrade リクエストを転送先へそのまま送る •selectで両方のソケットを監視し 受信したデータを反対側へsendする
JS対応 •これを足すだけ }else if(pext != NULL && strcmp(pext, ".js") ==
0){ strcpy(info->type, "application/javascript"); }
簡易チャットアプリの用意をして…… •動く
注意点 •2048byteの固定長バッファを使ってい るので大きいヘッダーに対応していない •WebSocketが開き続けるので複数接続 に対応しておく必要がある など
将来の展望? •WebSocketの実装やその他の実装が不 十分で実現することはできなかったが Mattermostのような複雑なWebアプリ をセルフホストできたらいい •というかそもそもPOSTリクエストに 対応していない