Slide 1

Slide 1 text

גࣜձࣾϊʔεσΟςʔϧ ։ൃ%JWJTJPOٕज़ਪਐ(SPVQ UBDDL໦ݪ୎໵ !UBDDL 4B$44WPM TBDTT ࠓߋ8FC4PDLFUΛ ֶΜͰΈͨ࿩ ೥݄೔

Slide 2

Slide 2 text

!UBDDL 4B$44WPM TBDTT • ໊લ ໦ݪ ୎໵ / @tacck • ॴଐ גࣜձࣾϊʔεσΟςʔϧ
 ։ൃDivision ٕज़ਪਐGroup / Leader • ओ࠵ • ΏΔWebษڧձ@ࡳຈ • εϚʔτεϐʔΧʔͰ༡΅͏ձ@ࡳຈ • ޷͖ͳϑΟΪϡΞεέʔτͷٕ εϓϨουɾΠʔάϧ ୭ PHP Conference Hokkaido 2019

Slide 3

Slide 3 text

!UBDDL 4B$44WPM TBDTT 8FC4PDLFUͱ͸

Slide 4

Slide 4 text

!UBDDL 4B$44WPM TBDTT • WebΫϥΠΞϯτ - WebαʔόؒͰ࢖͑Δɺ
 ͓खܰͳ૒ํ޲௨৴ͷن֨ɻ • Webϒϥ΢β؍఺Ͱ͸ɺJavaScriptͷ
 ΠϕϯτϕʔεͰ࣮૷Մೳɻ
 → ΠϕϯττϦΨʔͰDOMߋ৽͕Ͱ͖Δ
 →→ νϟοτͳͲͷϦΞϧλΠϜΞϓϦ͕࡞Γ΍͍͢ɻ 8FC4PDLFUͱ͸

Slide 5

Slide 5 text

!UBDDL 4B$44WPM TBDTT )551௨৴ͱ͸

Slide 6

Slide 6 text

!UBDDL 4B$44WPM TBDTT ΫϥΠΞϯτͰ͢ αʔόʔͰ͢

Slide 7

Slide 7 text

!UBDDL 4B$44WPM TBDTT ௨৴ͯ͠΋͔͑͑? Ͱ͖ͱΔͰɻ ͑͑Αɻ ͦͬͪ͸४උ Ͱ͖ͱΔΜ͔? SYN ACK SYN-ACK ઀ଓ։࢝ TCP

Slide 8

Slide 8 text

!UBDDL 4B$44WPM TBDTT ͋Εͪΐ͏͍ͩɻ ͑͑Αɻ ड͚औͬͯ΍ɻ Request Response ৘ใऔಘ HTTP GET

Slide 9

Slide 9 text

!UBDDL 4B$44WPM TBDTT ͜Ε౉͢Θɻ ͑͑Αɻ ड͚औͬͨͰɻ Request Response ৘ใૹ৴ HTTP POST/PUT/ DELETE

Slide 10

Slide 10 text

!UBDDL 4B$44WPM TBDTT … … ઀ଓҡ࣋ HTTP KeepAlive

Slide 11

Slide 11 text

!UBDDL 4B$44WPM TBDTT ͑͑Ͱɻ ౉͢΋Μ౉ͨ͠͠ɺ ΋͏͑͑΍Ζɻ ઀ଓऴྃ TCP ΄ͳ·ͨͳɻ ΄ͳɺ͍͞ͳΒɻ ACK FIN ACK FIN

Slide 12

Slide 12 text

!UBDDL 4B$44WPM TBDTT • ϒϥ΢β͔Βαʔόʔʹݺͼ͔͚ͯ௨৴։࢝ (TCP) • ϒϥ΢βܖػͰαʔόʔͱσʔλૹड৴ (HTTP) • ΍ΓͱΓ͕ऴΘͬͯ΋গ͠͸ܨ͍ͩ·· (HTTP/1.1 KeepAlive) • ͠͹Β͘ܦͭͱ௨৴ऴྃ )551 ͷجຊ

Slide 13

Slide 13 text

!UBDDL 4B$44WPM TBDTT • ͠͹Β͘ܦͬͨ͋ͱʹ௨৴͠Α͏ͱ͢Δͱɺ
 ࠷ॳͷʮѫࡰʯ෦෼͔Β࢝·Δɻ • ͕͔͔࣌ؒΔɻ • ௨৴։࢝͸Ϛγϯతʹ΋ίετ͕ߴ͍ɻ • ʮΫϥΠΞϯτ͔Βʯ͔͠σʔλૹड৴։࢝Ͱ͖ͳ͍ɻ • αʔόʔ͔Β৘ใΛ఻͍͑ͨɺͱ͍͏γεςϜΛ
 ࣮ݱͰ͖ͳ͍ɻ )551 ͷ՝୊

Slide 14

Slide 14 text

!UBDDL 4B$44WPM TBDTT • ͠͹Β͘ܦͬͨ͋ͱʹ௨৴͠Α͏ͱ͢Δͱɺ
 ࠷ॳͷʮѫࡰʯ෦෼͔Β࢝·Δɻ • ͕͔͔࣌ؒΔɻ • ௨৴։࢝͸Ϛγϯతʹ΋ίετ͕ߴ͍ɻ • ʮΫϥΠΞϯτ͔Βʯ͔͠σʔλૹड৴։࢝Ͱ͖ͳ͍ɻ • αʔόʔ͔Β৘ใΛ఻͍͑ͨɺͱ͍͏γεςϜΛ
 ࣮ݱͰ͖ͳ͍ɻ • HTTP/2.0 ͔Βͷ࿩͸ɺࠓճׂѪɻ )551 ͷ՝୊

Slide 15

Slide 15 text

!UBDDL 4B$44WPM TBDTT • WebSocket Λ࢖͏ͱɺ
 αʔόʔܖػͰσʔλૹ৴Λߦͳ͑Δɻ
 (ैདྷͷ HTTP ͚ͩͰ͸Ͱ͖ͳ͔ͬͨɻ) • ΫϥΠΞϯτ͸ɺ JavaScript ͷΠϕϯτͱͯ͠
 ॲཧͰ͖ΔͷͰɺ࣮૷೉қ౓͸ͦ͜·Ͱߴ͘ͳ͍ɻ • αʔόʔͷ࣮૷΋ɺجຊ͸ͦ͜·Ͱ೉͘͠ͳ͍ɻ 8FC4PDLFUͰ՝୊ղܾ

Slide 16

Slide 16 text

!UBDDL 4B$44WPM TBDTT WebSocket ࢖Θͤͯ΍ Request Response WebSocket։࢝ HTTP GET ͑͑Ͱɻ ͔ͬ͜Βઌ͸ WebSocket΍Ͱɻ WebSocket

Slide 17

Slide 17 text

!UBDDL 4B$44WPM TBDTT ΫϥΠΞϯτ͔Β WebSocket ΫϦοΫ͞ΕͨͰ Message ͑͑ײ͡ͷॲཧ ͠ͱ͘Θɻ

Slide 18

Slide 18 text

!UBDDL 4B$44WPM TBDTT αʔόʔ͔Β WebSocket ͑͑ײ͡ͷॲཧ ͠ͱ͘Θɻ Message σʔλߋ৽͞ΕͨͰ

Slide 19

Slide 19 text

!UBDDL 4B$44WPM TBDTT ࣮ફ ؆୯ͳϦΞϧλΠϜ౤ථΞϓϦ

Slide 20

Slide 20 text

!UBDDL 4B$44WPM TBDTT • Webαʔό (Node.js) • “post”ϝοηʔδΛड͚औͬͨΒɺ
 idΛ֬ೝͯ͠Χ΢ϯτΞοϓɻ • Χ΢ϯτΞοϓޙʹɺ“selections”ϝοηʔδΛ
 શΫϥΠΞϯτʹ݁Ռૹ৴ɻ ؆୯ͳϦΞϧλΠϜ౤ථΞϓϦ

Slide 21

Slide 21 text

!UBDDL 4B$44WPM TBDTT socket.on('message', message => { console.log(message) const obj = JSON.parse(message) const type = obj.message const data = obj.data if (type === 'post') { selections[data.id].count++ } wss.clients.forEach(client => { client.send(JSON.stringify( { message: 'selections', data: selections } )) }) })

Slide 22

Slide 22 text

!UBDDL 4B$44WPM TBDTT • Webϒϥ΢β (Vue.js) • “selections”ϝοηʔδΛड͚औͬͨΒɺ
 બ୒ࢶͷத਎ͱΧ΢ϯτΛߋ৽ɻ • ϘλϯΫϦοΫͰɺ “post”ϝοηʔδૹ৴ɻ ؆୯ͳϦΞϧλΠϜ౤ථΞϓϦ

Slide 23

Slide 23 text

!UBDDL +BWB%PͰ͠ΐ͏ KBWBEP mounted() { this.ws = new WebSocket('wss://tacck-ws.herokuapp.com/') const self = this this.ws.addEventListener('message', message => { const obj = JSON.parse(message.data) const type = obj.message const data = obj.data if (type === 'selections') { self.selections = data } }) }, methods: { send(id) { this.ws.send(JSON.stringify( { message: 'post', data: { id: id } } )) } }

Slide 24

Slide 24 text

!UBDDL +BWB%PͰ͠ΐ͏ KBWBEP ࢼͦ͏ https://github.com/tacck/websocket-sample-client-vuejs https://github.com/tacck/websocket-sample-server-nodejs

Slide 25

Slide 25 text

!UBDDL 4B$44WPM TBDTT ࣮ફ ϦΞϧλΠϜ ΞϯέʔτγεςϜ

Slide 26

Slide 26 text

!UBDDL 4B$44WPM TBDTT ·ͱΊ

Slide 27

Slide 27 text

!UBDDL 4B$44WPM TBDTT • ैདྷͷ HTTP/1.0,1.1 Ͱ͸
 αʔόʔܖػͰσʔλૹड৴͕Ͱ͖ͳ͔ͬͨɻ • WebSocket ͰͦΕΛղܾՄೳɻ • ΑΓൃలͨ͠࢓૊Έ͸ HTTP/2.0 Ҏ߱ʹ͋Δ͕ɺ
 ͦΕ͸·ͨผͷ͓࿩ɻ ·ͱΊ

Slide 28

Slide 28 text

!UBDDL 4B$44WPM TBDTT FOE