Socket.IOʹೖͨ͠@orisano
View Slide
Socket.IOͬͯΔਓ
Socket.IOͬͨ͜ͱ͋Δਓ
Socket.IOΕΔਓ
ΰʔϧSocket.IO͕ΕΔΑ͏ʹͳΔ
ͦͦSocket.IOͱ
Socket.IO• FEATURING THE FASTEST AND MOSTRELIABLE REAL-TIME ENGINE• ૣͯ͘৴པͰ͖ΔϦΞϧλΠϜΤϯδϯ• ϦΞϧλΠϜͰํͷevent-basedͳ௨৴
Socket.IO• Node.jsͰ࣮͞Ε͍ͯΔ• ࠓversion 2.0• ϒϥβͰϦΞϧλΠϜ௨৴ͳΒ͜Εͱ͍͏• ΩϥʔΞϓϦͩͬͨ
Α͋͘Δޡղͱͯ͠Socket.IO == WebSocket
Socket.IO !== WebSocket
Socket.IO• Ή͠ΖWebSocketͷରԠঢ়گ͕ѱ͔ͬͨ࣌ظʹಉ༷ͷ͜ͱΛ͢ΔͨΊͷͷͩͬͨ• TransportWebSocketͰͳͯ͘Α͍• TransportEngine.IOͰநԽ͞Ε͍ͯΔ
Engine.IO• Socket.IOͷͨΊʹ࡞ΒΕͨRealtime Engine• ௨৴ϨΠϠʔ·Ͱ͔͠ݟͳ͍• eventͱ͔ͦ͏͍͏ػೳଘࡏ͠ͳ͍
Engine.IO• WebSocket [packet]• Polling [payload]• XMLHttpRequest• JSONP• MUST support three transport
8FC4PDLFU 9.-)UUQ3FRVFTU +40/1&OHJOF*04PDLFU*0#SPXTFS$MJFOU
͑ͬ໘ष͞ࠓͷ࣌WebSocketͰ͍͍Ͱ͠ΐ
https://blog.jxck.io/entries/2016-08-22/websocket-connectivity.html
·ͱΊ• RFCʹଇͬͨWebSocketIE11͔Β• Connection: UpgradeΛམͱ͢ϛυϧϘοΫε• HTTPͰ࣌ؒுΓͬͺͳ͠ͷίωΫγϣϯΛΔϛυϧϘοΫε
·ͱΊ• RFCʹଇͬͨWebSocketIE11͔Β• Connection: UpgradeΛམͱ͢ϛυϧϘοΫε• HTTPͰ࣌ؒுΓͬͺͳ͠ͷίωΫγϣϯΛΔϛυϧϘοΫεIEͬͯͳΜͰ͔͢ʁ
·ͱΊ• RFCʹଇͬͨWebSocketIE11͔Β• Connection: UpgradeΛམͱ͢ϛυϧϘοΫε• HTTPͰ࣌ؒுΓͬͺͳ͠ͷίωΫγϣϯΛΔϛυϧϘοΫεIEͬͯͳΜͰ͔͢ʁ҉߸Խ͢Εͳ͍Ͱ͢. wssΛ͏.
·ͱΊ• RFCʹଇͬͨWebSocketIE11͔Β• Connection: UpgradeΛམͱ͢ϛυϧϘοΫε• HTTPͰ࣌ؒுΓͬͺͳ͠ͷίωΫγϣϯΛΔϛυϧϘοΫεIEͬͯͳΜͰ͔͢ʁ҉߸Խ͢Εͳ͍Ͱ͢. wssΛ͏.Ͳ͏ʹͳΒͳ͍
·ͱΊ• ࣮ࡍͲͷఔଘࡏ͢Δͷ͔Θ͔Βͳ͍• ͍ΜͨʔͶͬͱ͍͠ͷͰଞͷݪҼ͋Δ• ϦΞϧλΠϜ௨৴͕؊Ͱ͍ΖΜͳڥͷϢʔβʹͬͯΒ͍͍ͨ߹Socket.IO
େઢ͠·͕ͨ͠
Socket.IOΛΔʹ
ਓ͕ؒWebSocketΔͷ“””͍͠”””
ͦΕΑΓ্ͷϨΠϠʔͱ͍͏͜ͱʹ͠·͢
·ͣEngine.IOΛΔ
Engine.IO• https://github.com/socketio/engine.io-protocol• ࠓrevision: 3• ͘͢͝γϯϓϧͰ໋ྩ͕7छྨ͔͠ͳ͍• [data] ୯७ͳformat
Engine.IO• 0 open, αʔό͔Β࠷ॳʹૹΒΕͯ͘Δ• 1 close, அ͢Δͱ͖ʹૹΔ• 2 ping, ͪ͜Β͔ΒૹΔੜଘใࠂ• 3 pong, pingΛड͚औͬͨ࣌ʹαʔό͔Βฦͬͯ͘Δ• 4 message, σʔλΛૹड৴͢Δ࣌ʹ͏• 5 upgrade, transportΛม͑Δ࣌ʹૹΔ• 6 noop, ͳʹ͠ͳ͍
git clone https://github.com/orisano/socketio-handsoncd socketio-handsonnpm inpm run serve:eionpm run conn:eio
Engine.IO• < 0******* // open• > 2 // ping• < 3 // pong• > 4hello. engine.io // message• < 4reply:hello
͜ΕͰEngine.IOᘳ
͋ͱSocket.IO͕ΕΕ
Socket.IO• https://github.com/socketio/socket.io-protocol• ࠓrevision: 4• ͘͢͝γϯϓϧͰ໋ྩ͕7छྨ͔͠ͳ͍• formatͷৄࡉʹ͍ͭͯ͋·Γॻ͍ͯͳ͍
Socket.IO• socket.io-parserͷ࣮ΛݟΔ• [(attachments)-][(namespace:/),][id][data]• ͏Μ, simple
Socket.IO• 0 CONNECT, αʔό͔Β࠷ॳʹૹΒΕͯ͘Δ• 1 DISCONNECT, அ͢Δͱ͖ʹૹΔ• 2 EVENT, Πϕϯτ͕ى͖ͨ࣌ʹૹड৴͢Δ• 3 ACK,ಛఆͷύέοτʹରͯ͠ฦ৴͢Δ࣌ʹ͏• 4 ERROR,Τϥʔ͕ى͖ͨ࣌ʹ͏• 5 BINARY_EVENT, όΠφϦΛૹΔ࣌ͬͪ͜• 6 BINARY_ACK, όΠφϦΛฦ࣌ͬͪ͢͜
npm run serve:sionpm run conn:sio
Socket.IO• > 0 // e:open• > 40 // e:message s:connect• < 42[“message”,”hello”] // e:message s:event data• > 42[“reply”,”?hello”] // e:message s:event data• < 41 // e:message s:disconnect• < 42[“message”,”hello”] // e:message s:event data• < 40 // e:message s:connect• < 42[“message”,”hello”] // e:message s:event data• > 42[“reply”,”?hello”] // e:message s:event data
͜ΕͰSocket.IOᘳ
ͦͦ
ͳΜͰSocket.IOͷʁ
https://github.com/orisano/gomasiosocket.io-clientͷgolang࣮Λ࡞ͬͨͷͰએ