SlideShare a Scribd company logo
Javaプログラマのための
WebSocket概要
           2013/1/31 Java ♡ HTML5 Night

   株式会社オープンウェブ・テクノロジー
          白石 俊平(@Shumpei)
自己紹介

   白石俊平と申します。
   HTML5開発者コミュニティhtml5j.org管理人(会員
    数5,000名超)
   HTML5とか勉強会主催(毎月一回、100名を動員)
   Google API Expert (HTML5)
   Microsoft Most Valuable Professional (IE9)
   Twitter: @Shumpei
   著書:HTML5&API入門
WebSocketとは何か?
WebSocketとは何か?
   リアルタイム・ウェブをもたらす技術として
    非常に期待されている
   実態は、TCP上に構築された双方向のソケッ
    ト通信プロトコル
   HTTPをベースにしているため、Webとの親和
    性が非常に高い
     Webブラウザからの利用を主眼としている

     ファイアウォールを超えられる
WebSocketの動作原理
1.   通常のHTTP GETリクエストを用いて、サーバ
     に接続
2.   サーバがWebSocketに対応していれば、その接
     続をそのままWebSocketの通信経路として「張
     りっぱなし」にする。

            Server         Server
              TCP




                             TCP
     HTTP            双方向
     GET      接       通信     接
              続              続
クライアントとサーバの対称性
   一度接続が確立してしまえば、クライアントと
    サーバの間で役割やできることの違いはほとんど
    ない
              ・テキスト送受信
              ・バイナリ送受信
              ・通信の圧縮
              ・ping
              ・...
     クライアント              サーバ
WebSocketの利用例
   オンライン黒板
WebSocketの利用例
   BrowserQuest
WebSocketの利用例
   Technitone
技術面から見たWebSocket
仕様
   プロトコル
     IETFにより標準化(RFC6455)

   JavaScript API
     W3Cにより標準化(The
                 WebSocket API)
     勧告候補というステータス
WebSocketのエンドポイント
   URL・・・ws://もしくはwss://で始まる
   ポート・・・80番(ws)/443番(wss)
WebSocketハンドシェイク
   Upgradeヘッダ付きのGETリクエストに対し、
    サーバが「101 Switching Protocols」で応答す
    れば、接続確立

GET /chat HTTP/1.1             HTTP/1.1 101 Switching Protocols
Host: server.example.com       Upgrade: websocket
Upgrade: websocket             Connection: Upgrade
Connection: Upgrade            Sec-WebSocket-Accept: YYY
Sec-WebSocket-Key: XXX         Sec-WebSocket-Protocol: chat
Origin: http://example.com
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
フレームフォーマット
   6-14バイトの小さなヘッダを付与
   ペイロード長は最大2^64バイト

                                            バイト長

               1                     2                    3                     4

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
        R R R         M
        S S S         A
     FI V V V         S
     N 1 2 3   opcode K    ペイロード長            拡張ペイロード長(ペイロード長が126の場合)

                          拡張ペイロード長(ペイロード長が127の場合)

     拡張ペイロード長(ペイロード長が127の場合)                                     マスクキー

                     マスクキー                                       データ本体

                                          データ本体…
プロトコルの拡張が可能
     圧縮やマルチプレクサなどの拡張が提案され
      ている


GET /chat HTTP/1.1                        HTTP/1.1 101 Switching Protocols
Host: server.example.com                  Upgrade: websocket
Upgrade: websocket                        Connection: Upgrade
Connection: Upgrade                       Sec-WebSocket-Extensions: deflate-
Sec-WebSocket-Key: XXX                    frame
Origin: http://example.com                Sec-WebSocket-Accept: YYY
Sec-WebSocket-Extensions: deflate-frame   Sec-WebSocket-Protocol: chat
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
サブプロトコル
   WebSocketは、接続確立後はシンプルなTCP
    ソケット通信とみなすことが可能。
   →WebSocket上で新たなプロトコルが構築さ
    れることを当初から想定している
GET /chat HTTP/1.1             HTTP/1.1 101 Switching Protocols
Host: server.example.com       Upgrade: websocket
Upgrade: websocket             Connection: Upgrade
Connection: Upgrade            Sec-WebSocket-Accept: YYY
Sec-WebSocket-Key: XXX         Sec-WebSocket-Protocol: chat
Origin: http://example.com
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
WebSocketのJavaScript API
WebSocketのJavaScript API
   WebSocket APIは比較的実装が進んでいる




     IE    Firefox   Chrome   Safari   Opera    iOS     Android
                                               Safari   Browser
    10.0     ○         ○       6.0     12.1     6.0       ×
JavaScript APIの使用法

まず、WebSocket接続を確立する。

// WebSocket接続を開始
var ws = new WebSocket('ws://localhost:2000/chat');

// 接続が確立したら呼び出される
ws.onopen = function() {
  // 初期化処理
};
JavaScript APIの使用法

データの送信
// sendメソッドにより、サーバにデータを送信できる
// sendメソッドは文字列だけではなく、ArrayBufferや
// Blobも送信可能
ws.send('Hello');



データの受信
// データが到着したら呼び出される
ws.onmessage = function(e) {
  // dataプロパティに受信データが格納
  var data = e.data;
  …
};
JavaScript APIの使用法

接続のクローズ(クライアントから)
// クライアントから接続を切断
ws.close();



接続のクローズ(サーバから)
// データが到着したら呼び出される
ws.onclose = function(e) {
  var wasClean = e.wasClean; // 正常終了か
  var code = e.code; // ステータスコード
  var reason = e.reason; // 切断理由
};
ぼくはここまで!



  ご清聴ありがとうございました!
       @Shumpei

More Related Content

What's hot (20)

書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト
ryohji ikebe
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
shiracamus
 
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
勇 中津留
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
JSON Web Token
JSON Web TokenJSON Web Token
JSON Web Token
Deddy Setyadi
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
nasa9084
 
これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)
Isaac Mathis
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向
shigeki_ohtsu
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Svetlin Nakov
 
現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン
cmaraiyusuke
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
 
Modern API Security with JSON Web Tokens
Modern API Security with JSON Web TokensModern API Security with JSON Web Tokens
Modern API Security with JSON Web Tokens
Jonathan LeBlanc
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
Yoshio Hanawa
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
pospome
 
Session管理とRailsのcookie store
Session管理とRailsのcookie storeSession管理とRailsのcookie store
Session管理とRailsのcookie store
Kamimura Taichi
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト
ryohji ikebe
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
shiracamus
 
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
IDA ユーザなら知っておくべきマントノン侯爵夫人にモテる 7つの法則
勇 中津留
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
nasa9084
 
これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)
Isaac Mathis
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向
shigeki_ohtsu
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Svetlin Nakov
 
現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン現場で使えるDynamoDBと冪等デザインパターン
現場で使えるDynamoDBと冪等デザインパターン
cmaraiyusuke
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
 
Modern API Security with JSON Web Tokens
Modern API Security with JSON Web TokensModern API Security with JSON Web Tokens
Modern API Security with JSON Web Tokens
Jonathan LeBlanc
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
Yoshio Hanawa
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
pospome
 
Session管理とRailsのcookie store
Session管理とRailsのcookie storeSession管理とRailsのcookie store
Session管理とRailsのcookie store
Kamimura Taichi
 

Similar to JavaプログラマのためのWebSocket概要 (20)

これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocket
AdvancedTechNight
 
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
Takakiyo Tanaka
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
 
Html5, Web Applications 2
Html5, Web Applications 2Html5, Web Applications 2
Html5, Web Applications 2
totty jp
 
websocket-survery
websocket-surverywebsocket-survery
websocket-survery
hogemaru_
 
WebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリWebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリ
Kohei Kadowaki
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
Shin Sekaryo
 
WebRTCの技術解説 第二版 公開版 本編
WebRTCの技術解説 第二版 公開版 本編WebRTCの技術解説 第二版 公開版 本編
WebRTCの技術解説 第二版 公開版 本編
Contest Ntt-west
 
OpenStack base public cloud service by GMO Internet Inc., at 2013/12/12 Okin...
OpenStack base public cloud service by GMO Internet Inc.,  at 2013/12/12 Okin...OpenStack base public cloud service by GMO Internet Inc.,  at 2013/12/12 Okin...
OpenStack base public cloud service by GMO Internet Inc., at 2013/12/12 Okin...
Naoto Gohko
 
Gaeja20121130
Gaeja20121130Gaeja20121130
Gaeja20121130
Shinichiro Takezaki
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTC
yoshikawa_t
 
SL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×SilverlightではまったことSL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×Silverlightではまったこと
normalian
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
david9142
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
mganeko
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
 
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
You_Kinjoh
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
崇之 清水
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
Kohei Kadowaki
 
これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocket
AdvancedTechNight
 
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
Takakiyo Tanaka
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
 
Html5, Web Applications 2
Html5, Web Applications 2Html5, Web Applications 2
Html5, Web Applications 2
totty jp
 
websocket-survery
websocket-surverywebsocket-survery
websocket-survery
hogemaru_
 
WebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリWebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリ
Kohei Kadowaki
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
Shin Sekaryo
 
WebRTCの技術解説 第二版 公開版 本編
WebRTCの技術解説 第二版 公開版 本編WebRTCの技術解説 第二版 公開版 本編
WebRTCの技術解説 第二版 公開版 本編
Contest Ntt-west
 
OpenStack base public cloud service by GMO Internet Inc., at 2013/12/12 Okin...
OpenStack base public cloud service by GMO Internet Inc.,  at 2013/12/12 Okin...OpenStack base public cloud service by GMO Internet Inc.,  at 2013/12/12 Okin...
OpenStack base public cloud service by GMO Internet Inc., at 2013/12/12 Okin...
Naoto Gohko
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTC
yoshikawa_t
 
SL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×SilverlightではまったことSL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×Silverlightではまったこと
normalian
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
david9142
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
mganeko
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
 
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
You_Kinjoh
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
崇之 清水
 

More from Shumpei Shiraishi (20)

俺的GEB概論(前半)
俺的GEB概論(前半)俺的GEB概論(前半)
俺的GEB概論(前半)
Shumpei Shiraishi
 
コンセプトのつくりかた - アイデアをかたちにする技術
コンセプトのつくりかた - アイデアをかたちにする技術コンセプトのつくりかた - アイデアをかたちにする技術
コンセプトのつくりかた - アイデアをかたちにする技術
Shumpei Shiraishi
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
Shumpei Shiraishi
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
Shumpei Shiraishi
 
JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門
Shumpei Shiraishi
 
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Shumpei Shiraishi
 
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Shumpei Shiraishi
 
Angular2実践入門
Angular2実践入門Angular2実践入門
Angular2実践入門
Shumpei Shiraishi
 
WebRTCがビデオ会議市場に与えるインパクトを探る
WebRTCがビデオ会議市場に与えるインパクトを探るWebRTCがビデオ会議市場に与えるインパクトを探る
WebRTCがビデオ会議市場に与えるインパクトを探る
Shumpei Shiraishi
 
変身×フランツ・カフカ
変身×フランツ・カフカ変身×フランツ・カフカ
変身×フランツ・カフカ
Shumpei Shiraishi
 
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んでイラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
Shumpei Shiraishi
 
「1秒でわかる!アパレル業界ハンドブック」を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで「1秒でわかる!アパレル業界ハンドブック」を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで
Shumpei Shiraishi
 
HTML5時代のフロントエンド開発入門
HTML5時代のフロントエンド開発入門HTML5時代のフロントエンド開発入門
HTML5時代のフロントエンド開発入門
Shumpei Shiraishi
 
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
Shumpei Shiraishi
 
はじめにことばありき
はじめにことばありきはじめにことばありき
はじめにことばありき
Shumpei Shiraishi
 
HTML5がもたらすアプリ開発へのインパクト
HTML5がもたらすアプリ開発へのインパクトHTML5がもたらすアプリ開発へのインパクト
HTML5がもたらすアプリ開発へのインパクト
Shumpei Shiraishi
 
この人と結婚していいの?を読んで
この人と結婚していいの?を読んでこの人と結婚していいの?を読んで
この人と結婚していいの?を読んで
Shumpei Shiraishi
 
コンセプトのつくりかた - アイデアをかたちにする技術
コンセプトのつくりかた - アイデアをかたちにする技術コンセプトのつくりかた - アイデアをかたちにする技術
コンセプトのつくりかた - アイデアをかたちにする技術
Shumpei Shiraishi
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
Shumpei Shiraishi
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
Shumpei Shiraishi
 
JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門
Shumpei Shiraishi
 
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Shumpei Shiraishi
 
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Shumpei Shiraishi
 
WebRTCがビデオ会議市場に与えるインパクトを探る
WebRTCがビデオ会議市場に与えるインパクトを探るWebRTCがビデオ会議市場に与えるインパクトを探る
WebRTCがビデオ会議市場に与えるインパクトを探る
Shumpei Shiraishi
 
変身×フランツ・カフカ
変身×フランツ・カフカ変身×フランツ・カフカ
変身×フランツ・カフカ
Shumpei Shiraishi
 
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んでイラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
Shumpei Shiraishi
 
「1秒でわかる!アパレル業界ハンドブック」を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで「1秒でわかる!アパレル業界ハンドブック」を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで
Shumpei Shiraishi
 
HTML5時代のフロントエンド開発入門
HTML5時代のフロントエンド開発入門HTML5時代のフロントエンド開発入門
HTML5時代のフロントエンド開発入門
Shumpei Shiraishi
 
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
Shumpei Shiraishi
 
はじめにことばありき
はじめにことばありきはじめにことばありき
はじめにことばありき
Shumpei Shiraishi
 
HTML5がもたらすアプリ開発へのインパクト
HTML5がもたらすアプリ開発へのインパクトHTML5がもたらすアプリ開発へのインパクト
HTML5がもたらすアプリ開発へのインパクト
Shumpei Shiraishi
 
この人と結婚していいの?を読んで
この人と結婚していいの?を読んでこの人と結婚していいの?を読んで
この人と結婚していいの?を読んで
Shumpei Shiraishi
 

JavaプログラマのためのWebSocket概要

  • 1. Javaプログラマのための WebSocket概要 2013/1/31 Java ♡ HTML5 Night 株式会社オープンウェブ・テクノロジー 白石 俊平(@Shumpei)
  • 2. 自己紹介  白石俊平と申します。  HTML5開発者コミュニティhtml5j.org管理人(会員 数5,000名超)  HTML5とか勉強会主催(毎月一回、100名を動員)  Google API Expert (HTML5)  Microsoft Most Valuable Professional (IE9)  Twitter: @Shumpei  著書:HTML5&API入門
  • 4. WebSocketとは何か?  リアルタイム・ウェブをもたらす技術として 非常に期待されている  実態は、TCP上に構築された双方向のソケッ ト通信プロトコル  HTTPをベースにしているため、Webとの親和 性が非常に高い  Webブラウザからの利用を主眼としている  ファイアウォールを超えられる
  • 5. WebSocketの動作原理 1. 通常のHTTP GETリクエストを用いて、サーバ に接続 2. サーバがWebSocketに対応していれば、その接 続をそのままWebSocketの通信経路として「張 りっぱなし」にする。 Server Server TCP TCP HTTP 双方向 GET 接 通信 接 続 続
  • 6. クライアントとサーバの対称性  一度接続が確立してしまえば、クライアントと サーバの間で役割やできることの違いはほとんど ない ・テキスト送受信 ・バイナリ送受信 ・通信の圧縮 ・ping ・... クライアント サーバ
  • 7. WebSocketの利用例  オンライン黒板
  • 11. 仕様  プロトコル  IETFにより標準化(RFC6455)  JavaScript API  W3Cにより標準化(The WebSocket API)  勧告候補というステータス
  • 12. WebSocketのエンドポイント  URL・・・ws://もしくはwss://で始まる  ポート・・・80番(ws)/443番(wss)
  • 13. WebSocketハンドシェイク  Upgradeヘッダ付きのGETリクエストに対し、 サーバが「101 Switching Protocols」で応答す れば、接続確立 GET /chat HTTP/1.1 HTTP/1.1 101 Switching Protocols Host: server.example.com Upgrade: websocket Upgrade: websocket Connection: Upgrade Connection: Upgrade Sec-WebSocket-Accept: YYY Sec-WebSocket-Key: XXX Sec-WebSocket-Protocol: chat Origin: http://example.com Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13
  • 14. フレームフォーマット  6-14バイトの小さなヘッダを付与  ペイロード長は最大2^64バイト バイト長 1 2 3 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 R R R M S S S A FI V V V S N 1 2 3 opcode K ペイロード長 拡張ペイロード長(ペイロード長が126の場合) 拡張ペイロード長(ペイロード長が127の場合) 拡張ペイロード長(ペイロード長が127の場合) マスクキー マスクキー データ本体 データ本体…
  • 15. プロトコルの拡張が可能  圧縮やマルチプレクサなどの拡張が提案され ている GET /chat HTTP/1.1 HTTP/1.1 101 Switching Protocols Host: server.example.com Upgrade: websocket Upgrade: websocket Connection: Upgrade Connection: Upgrade Sec-WebSocket-Extensions: deflate- Sec-WebSocket-Key: XXX frame Origin: http://example.com Sec-WebSocket-Accept: YYY Sec-WebSocket-Extensions: deflate-frame Sec-WebSocket-Protocol: chat Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13
  • 16. サブプロトコル  WebSocketは、接続確立後はシンプルなTCP ソケット通信とみなすことが可能。  →WebSocket上で新たなプロトコルが構築さ れることを当初から想定している GET /chat HTTP/1.1 HTTP/1.1 101 Switching Protocols Host: server.example.com Upgrade: websocket Upgrade: websocket Connection: Upgrade Connection: Upgrade Sec-WebSocket-Accept: YYY Sec-WebSocket-Key: XXX Sec-WebSocket-Protocol: chat Origin: http://example.com Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13
  • 18. WebSocketのJavaScript API  WebSocket APIは比較的実装が進んでいる IE Firefox Chrome Safari Opera iOS Android Safari Browser 10.0 ○ ○ 6.0 12.1 6.0 ×
  • 19. JavaScript APIの使用法 まず、WebSocket接続を確立する。 // WebSocket接続を開始 var ws = new WebSocket('ws://localhost:2000/chat'); // 接続が確立したら呼び出される ws.onopen = function() { // 初期化処理 };
  • 20. JavaScript APIの使用法 データの送信 // sendメソッドにより、サーバにデータを送信できる // sendメソッドは文字列だけではなく、ArrayBufferや // Blobも送信可能 ws.send('Hello'); データの受信 // データが到着したら呼び出される ws.onmessage = function(e) { // dataプロパティに受信データが格納 var data = e.data; … };
  • 21. JavaScript APIの使用法 接続のクローズ(クライアントから) // クライアントから接続を切断 ws.close(); 接続のクローズ(サーバから) // データが到着したら呼び出される ws.onclose = function(e) { var wasClean = e.wasClean; // 正常終了か var code = e.code; // ステータスコード var reason = e.reason; // 切断理由 };