SlideShare a Scribd company logo
WebSocket  +  Node.js
でつくるチャットアプリ
   2011/8/28  第2回  プログラミング勉強会
                kadoppe




               1
⾃自⼰己紹介

!  名前:kadoppe
   !  Twitter  twitter.com/kadoppe
   !  Blog  www.kadoppe.net
!  職業:プログラマ(iOS,  Web,  etc.)
!  HTML5-‐‑‒West.jp  コアメンバー
! about.me/kadoppe

                    2
質問
あなたとWebSocketの関係



       3
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                4
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                5
WebSocketとは?

!  Webブラウザ・サーバ間で双⽅方向通信
   を実現するためのプロトコル
!  元々はHTML5の仕様の⼀一部
 !  後に切切り離離されて独⽴立立




              6
双⽅方向通信
!  サーバ・クライアントの両⽅方からデー
   タ送信可能




         双⽅方向通信




           7
プロトコル概要(さらっと)

!  TCPの上で動作(not  HTTP)
 !   ※⽣生のTCPパケットを送信できるわけではない

!  80  or  443番ポートを使⽤用
!  UTF-‐‑‒8の⽂文字列列  or  バイナリデータを送
   信可能
!  Webプロキシを通過可能

                8
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                9
リアルタイムWebの実現

!  双⽅方向通信により実現
!  リアルタイムWebの例例
   !  チャット
   !  ホワイトボード共有
   !  オンライン格闘ゲーム
   !  ネット電話
   !  テレビ会議
            10
WebSocket  =  リアルタイムWeb
    を実現するための技術




           11
でも・・・



  12
昔からリアルタイムWebって
    あったよね?



      13
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                14
従来の双⽅方向通信技術

!  代表的なもの
   ! XMLHttpRequestによるPolling
   !  Comet(Long  Polling)
                     ざっくりまとめると



     HTTPを使ってリアルタイムWeb
          を実現する技術


                15
HTTP  vs.  WebSocket



         16
HTTPを使う⽅方式
!  複数のHTTPコネクションを使って通信




        HTTPコネクション




            17
HTTPを使う⽅方式の問題点

!  複数のHTTPコネクションを⽣生成
   !  サーバの負荷が⾼高くなる
   !  トラフィックが増える



 サーバスペック、通信回線が貧弱な環境
 では安定したサービスが提供しにくい


           18
WebSocket
!  単⼀一のTCPコネクションで双⽅方向通信




         TCPコネクション




            19
WebSocketの特徴

!  単⼀一のコネクション上で通信
   !  サーバの負荷が低くなる
   !  トラフィックが減る



 従来よりも効率率率的・安定した双⽅方向通信
       を実現可能!


           20
Demo
! WebSocket  Comparison  with  http  |  Ericsson  Labs  




  http://www.youtube.com/watch?v=Z897fkPn7Rw

                             21
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                22
WebSocketの標準化

!   The  WebSocket  Protocol
  !   通信プロトコルを定義
  !   IETFにより策定中(2011/7/11  Last  Call)

!   The  WebSocket  API
  !   ブラウザから利利⽤用するJavaScript  APIを定義
  !   W3Cにより策定中



                          23
ブラウザ対応状況  (PC)
プロトコル              IE       Firefox        Chrome   Safari   Opera

 hixie-‐‑‒75                                 4      5.0.0

hixie-‐‑‒76,  
                            4(無効)            6      5.0.1    11(無効)
hybi-‐‑‒00

                                6
 hybi-‐‑‒07
                           (Prefix付き)

                 HTML5  
 hybi-‐‑‒09
                  Labs

 hybi-‐‑‒10                     7
                                             14
(Last  Call)               (Prefix付き)

                            ※プロトコルの各リビジョン間の互換性はない。

                                      24
ブラウザ対応状況  (モバイル)


プロトコル            iOS        Android      BrackBerry

                       デフォルト⾮非対応
hixie-‐‑‒76,  
                 4.2     Firefox  7         OS7
hybi-‐‑‒00
                       Opera  mobile  




                       25
サーバ対応状況
!   Node.js
    ! Socket.io
    !   Node  Websocket  Server  (hybi-‐‑‒00)
    ! WebSocket-‐‑‒Node  (hybi-‐‑‒07,  hybi-‐‑‒09,  hybi-‐‑‒10)
!   Java
    !   Jetty  (hixie-‐‑‒75,  hybi-‐‑‒00,  hybi-‐‑‒07)
    ! CometD
!   PHP
    ! phpwebsocket
!   Python
    ! pywebsocket  (hixie-‐‑‒75,  hybi-‐‑‒00,  hybi-‐‑‒10)
!   その他多数


                                         26
◆アジェンダ◆

! WebSocketとは
! WebSocketでできること
! WebSocketでかわること
!  ブラウザ・サーバ対応状況
! WebSocket  +  Node.jsでつくるチャッ
  トアプリ

                27
技術紹介  
     +  
プチLive  Coding


      28
つくるもの
!  シンプルなチャットアプリ
!  ⽂文字⼊入⼒力力欄
!  Sendボタン
!  チャットログ




               29
つかうもの

!  ブラウザサイド
   !  Google  Chrome  13
   ! jQuery  1.6.1
!  サーバサイド
   ! Node.js  v0.4.10
   !   Express  –  Webフレームワーク


                    30
Node.js

!  サーバサイドJavaScript実装のひとつ
!  GoogleのJavaScriptエンジン「V8」上
   で動作
!  特徴
   !  シングルスレッド
   !  イベントループモデル
   !  ノンブロッキングI/O
              31
構成

!  ブラウザサイド
   ! chat.html
   ! chat.js
!  サーバサイド
   ! app.js



                 32
3パターンつくります
!   パターンA
    !   Node  WebSocket  Server  を使⽤用
    !   素のWebSocket  APIを使ったコーディングが楽しめます

!   パターンB
    ! Socket.IO  を使⽤用
    !   クロスブラウザ対応のリアルタイムWebアプリがとっても簡
        単に作れます

!   パターンC
    !   Pusher  を使⽤用
    ! WebSocketが動作するサーバが⽤用意できない⼈人でも
        WebSocketを使ったWebアプリが公開できます

                    33
お知らせ・おことわり
!   ひな形をベースに書いていきます。
 !   必要なモジュールなどもインストール済

!   詳しい説明は公式ドキュメントにおまかせ!

!   完成版のソースコードはGitHubにおいてあり
    ます。
 https://github.com/kadoppe/html5nado-‐‑‒websocket




                          34
パターンA

!  Node  WebSocket  Server
   ! WebSocket  プロトコルのサーバサイ
     ド実装のひとつ
   ! Node.jsのモジュールとして提供

 http://static.brandedcode.com/nws-‐‑‒docs/




                            35
システム構成


          WebSocket
ブラウザ


   WebSocket            Node  
      API             WebSocket
                       Server




                 36
サーバサイド
!   サーバインスタンスの⽣生成・起動
// モジュール読み込み!
var ws = require(“websocket-server”); !
!
var server = ws.createServer();!
server.listen(80); // 80番ポートで待機!

!   イベントハンドラの登録・データ送信
server.addListener("connection", function(connection){ !
  !connection.addListener("message", function(msg){ !
  ! !// 接続している全クライアントにデータ送信 ! !!
  ! !server.broadcast(msg);!
  !}); !
});!

                          37
ブラウザサイド  (WebSocket  API)

! WebSocketインスタンスの⽣生成
var ws = new WebSocket(“ws://example.com/chat/”);!


!   イベントハンドラの登録
ws.onopen = function() {};!
ws.onclose = function() {};!
ws.onmessage = function() {};!
ws.onerror = function() {};!

!   データ送信・切切断
ws.send(message);!
ws.close();!


                          38
パターンA  開発スタート!



      39
パターンA  開発完了了(?)



       40
気づいたこと

!   対応ブラウザが少ない
    !   IEでは使えない

!   メッセージ受信時のイベントが  onmessage  
    のみ  (WebSocket  API)
 !   メッセージの種類が増えたときにコードの
     分岐が増えそう



               41
パターンB
! Socket.IO
  !  クロスブラウザ環境で双⽅方向通信を実現
     するためのNode.jsモジュール
  !  ブラウザにより通信⽅方式を⾃自動切切替
   !   IE5.5以降降のブラウザに対応
 !  カスタムイベントに対応

 http://socket.io/


                     42
システム構成


             WebSocket
ブラウザ


        Socket.IO    Socket.IO
       クライアント
       ライブラリ




                43
サーバサイド
!   サーバインスタンスの⽣生成・起動
var io = require(‘socket.io’).listen(80)!
!
!
!   イベントハンドラの登録・データ送信
io.sockets.on('connection', function (socket) {

  !socket.on(‘message’, function(message) {!
  ! !// 接続している全クライアントにデータ送信!
  ! !io.sockets.send(message);!
  !});

});!
!



                          44
ブラウザサイド
!   ライブラリの読み込み
<script src="/socket.io/socket.io.js"></script>!
!

! Socket.IOインスタンスの⽣生成
var socket = io.connect(‘ws://example.com’);!


!   イベントハンドラの登録・データ送信
socket.on(’message', function (data) {!
  !// ...

  !socket.send(message);!
});

!
                          45
パターンB  開発スタート!



      46
パターンB  開発完了了(?)



       47
気づいたこと

!  素晴らしい
   !  対応ブラウザが多い
!  でも・・・
   ! WebSocketが使えないサーバ環境も
     存在
  !   例例)Heroku


                  48
パターンC
!   Pusher
    ! WebSocketサーバホスティングサービス
   !   20コネクション、1⽇日10万メッセージまでなら
       無料料
 ! WebSocketが利利⽤用できないブラウザでは
   Flash  Socketに⾃自動切切替
 !   サーバからのPUSH通信のみがWebSocket  

 http://pusher.com/

                      49
システム構成

               WebSocket
       ブラウザ                  Pusher

              クライアント
               ライブラリ


HTTP  POST                      REST  API

                Node.js
                サーバ
                            pusher
                           モジュール
                           (⾮非公式)
                  50
サーバサイド
!   Pusherインスタンスの⽣生成・設定
var Pusher = require('pusher');!
var pusher = new Pusher({!
  !appId: ‘YOUR_APP_ID’, // Pusherアカウントの各種情報!
  !appKey: 'YOUR_APP_KEY',!
  !secret: 'YOUR_APP_SECRET'!
});!
var channel = pusher.channel(‘chat’); // チャンネル設定!
!

!   Pusherへのデータ送信
channel.trigger('message', data);!
!
                        ※  https://github.com/fabrik42/pusher
                              で公開されているモジュールを使⽤用

                            51
ブラウザサイド
!   クライアントライブラリの読み込み
<script src=“http://js.pusherapp.com/1.8/
pusher.min.js"></script>!
!
!   Pusherインスタンスの⽣生成・設定
var pusher = new Pusher(YOUR_APP_KEY);!
var channel = pusher.subscribe('chat');!

!   イベントハンドラの登録
channel.bind('message', function(data) {!
  !//!
});!



                          52
パターンC  開発スタート!



      53
パターンC  開発完了了(?)



       54
気づいたこと

!  ホスティングできるのは魅⼒力力
!  クライアントからのデータ送信に時間
   がかかる
   !  アプリケーションが配備されている
      サーバを⼀一旦を経由するため



           55
まとめ
! WebSocket
  !  リアルタイムWebを実現するためのプ
     ロトコル
  !  従来の⽅方式よりも効率率率的な通信が⾏行行える
! Node.js  +  各種サービス・モジュールを
  使うことで簡単にリアルタイムWebアプ
  リが開発可能
  !  Letʼ’s  try!!

             56
参考資料料

!  The  WebSocket  protocol
 http://tools.ietf.org/html/draft-‐‑‒ietf-‐‑‒hybi-‐‑‒
 thewebsocketprotocol-‐‑‒10


!  The  WebSocket  API
 http://dev.w3.org/html5/websockets/




                                       57
ご清聴ありがとうございました。




      58

More Related Content

What's hot (20)

PDF
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
PDF
○○大学の本当にあった怖い話
idkqh7 Nishino
 
PDF
Webアプリでパスワード保護はどこまでやればいいか
Hiroshi Tokumaru
 
PPTX
Specification-of-tokens
Dattatray Gandhmal
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
PDF
Office 365 を活用してお手軽インシデント管理システムを構築しよう
Naokuni Yoshikawa
 
PPT
Query Decomposition and data localization
Hafiz faiz
 
PPTX
Database , 8 Query Optimization
Ali Usman
 
PDF
A5 SQL Mk-2の便利な機能をお教えします
ester41
 
PPT
RDBMS vs NoSQL
Murat Çakal
 
PPTX
X.75 Internetworking protocol
Pradnya Saval
 
PDF
DBMS unit-3.pdf
Prof. Dr. K. Adisesha
 
PPTX
Simple object access protocol(soap )
balamurugan.k Kalibalamurugan
 
PDF
Text classification-php-v4
Glenn De Backer
 
PDF
AWSとReactで始めるShopifyアプリ開発
Takaaki Kurasawa
 
PPTX
Product Cipher
SHUBHA CHATURVEDI
 
PPTX
Cloud computing pricing models
Hadi Fadlallah
 
PDF
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PPTX
平成生まれのための MINIX 講座
TAKANO Mitsuhiro
 
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
○○大学の本当にあった怖い話
idkqh7 Nishino
 
Webアプリでパスワード保護はどこまでやればいいか
Hiroshi Tokumaru
 
Specification-of-tokens
Dattatray Gandhmal
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
Office 365 を活用してお手軽インシデント管理システムを構築しよう
Naokuni Yoshikawa
 
Query Decomposition and data localization
Hafiz faiz
 
Database , 8 Query Optimization
Ali Usman
 
A5 SQL Mk-2の便利な機能をお教えします
ester41
 
RDBMS vs NoSQL
Murat Çakal
 
X.75 Internetworking protocol
Pradnya Saval
 
DBMS unit-3.pdf
Prof. Dr. K. Adisesha
 
Simple object access protocol(soap )
balamurugan.k Kalibalamurugan
 
Text classification-php-v4
Glenn De Backer
 
AWSとReactで始めるShopifyアプリ開発
Takaaki Kurasawa
 
Product Cipher
SHUBHA CHATURVEDI
 
Cloud computing pricing models
Hadi Fadlallah
 
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
平成生まれのための MINIX 講座
TAKANO Mitsuhiro
 

Similar to WebSocket + Node.jsでつくるチャットアプリ (20)

PDF
AndroidでWebSocket
Kohei Kadowaki
 
PDF
SocketStream入門
Kohei Kadowaki
 
PDF
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
 
PDF
これから利用拡大?WebSocket
AdvancedTechNight
 
PPTX
クラウドサービスを使って作る動画サイト?
Daichi Isami
 
PPTX
120512 metro styleapp_javascript
Takayoshi Tanaka
 
PPTX
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
 
PDF
Html5, Web Applications 2
totty jp
 
PDF
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
david9142
 
PPT
websocket-survery
hogemaru_
 
PDF
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
 
PDF
HTML5-pronama-study
Naoya Inada
 
PPTX
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 
PDF
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
崇之 清水
 
PDF
Vitochaを用いた Jail+VIMAGE Webインターフェイス
shutingrz
 
PDF
Firefox OS and Web server
Tomoaki Konno
 
PDF
OSC 2010 Tokyo/Fall MSセッション
Masaki Takeda
 
PPTX
HTML5とWeb開発に関する最新動向
Shumpei Shiraishi
 
PDF
Kilimanjaro Event
dynamis
 
PDF
OSC 2012 Microsoft Session [マイクロソフトの魅せるセンサー×クラウド技術]
Aya Tokura
 
AndroidでWebSocket
Kohei Kadowaki
 
SocketStream入門
Kohei Kadowaki
 
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
 
これから利用拡大?WebSocket
AdvancedTechNight
 
クラウドサービスを使って作る動画サイト?
Daichi Isami
 
120512 metro styleapp_javascript
Takayoshi Tanaka
 
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
 
Html5, Web Applications 2
totty jp
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
david9142
 
websocket-survery
hogemaru_
 
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
 
HTML5-pronama-study
Naoya Inada
 
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
崇之 清水
 
Vitochaを用いた Jail+VIMAGE Webインターフェイス
shutingrz
 
Firefox OS and Web server
Tomoaki Konno
 
OSC 2010 Tokyo/Fall MSセッション
Masaki Takeda
 
HTML5とWeb開発に関する最新動向
Shumpei Shiraishi
 
Kilimanjaro Event
dynamis
 
OSC 2012 Microsoft Session [マイクロソフトの魅せるセンサー×クラウド技術]
Aya Tokura
 
Ad

More from Kohei Kadowaki (15)

PDF
Pebble + JavaScriptでつくるスマートウォッチアプリ
Kohei Kadowaki
 
PDF
Firefox OSでSVGをつかってみた
Kohei Kadowaki
 
PDF
Inline SVG - トラブルとその対策
Kohei Kadowaki
 
PDF
Webでもできるデータビジュアライゼーション
Kohei Kadowaki
 
PDF
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki
 
PDF
D3.js と SVG によるデータビジュアライゼーション
Kohei Kadowaki
 
PDF
プログラマーのお仕事
Kohei Kadowaki
 
PDF
5分でわかる?Backbone.js ことはじめ
Kohei Kadowaki
 
PDF
SVGでつくるインタラクティブWebアプリケーション
Kohei Kadowaki
 
PDF
UnityでつくるはじめてのPONG
Kohei Kadowaki
 
PDF
インラインSVGをつかって地図っぽいものをつくってみる
Kohei Kadowaki
 
PDF
ShareWisをFirefoxで動かすためのSVG的とりくみ
Kohei Kadowaki
 
PDF
d3jsではじめるデータビジュアライゼーション入門
Kohei Kadowaki
 
PDF
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
Kohei Kadowaki
 
PDF
WebSocketことはじめ
Kohei Kadowaki
 
Pebble + JavaScriptでつくるスマートウォッチアプリ
Kohei Kadowaki
 
Firefox OSでSVGをつかってみた
Kohei Kadowaki
 
Inline SVG - トラブルとその対策
Kohei Kadowaki
 
Webでもできるデータビジュアライゼーション
Kohei Kadowaki
 
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki
 
D3.js と SVG によるデータビジュアライゼーション
Kohei Kadowaki
 
プログラマーのお仕事
Kohei Kadowaki
 
5分でわかる?Backbone.js ことはじめ
Kohei Kadowaki
 
SVGでつくるインタラクティブWebアプリケーション
Kohei Kadowaki
 
UnityでつくるはじめてのPONG
Kohei Kadowaki
 
インラインSVGをつかって地図っぽいものをつくってみる
Kohei Kadowaki
 
ShareWisをFirefoxで動かすためのSVG的とりくみ
Kohei Kadowaki
 
d3jsではじめるデータビジュアライゼーション入門
Kohei Kadowaki
 
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
Kohei Kadowaki
 
WebSocketことはじめ
Kohei Kadowaki
 
Ad

Recently uploaded (8)

PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 

WebSocket + Node.jsでつくるチャットアプリ