Submit Search
Using SockJS(Websocket) with Sencha Ext JS
4 likes
5,088 views
Kazuhiro Kotsutsumi
1 of 132
Download now
Downloaded 21 times
1
2
3
4
5
6
Most read
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
More Related Content
What's hot
(20)
PDF
第1回Webサーバ勉強会 - 212-223 ブラウザマッチ処理
Seiichiro Ishida
PDF
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
KEY
おすすめ gem
chocoby
PDF
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Shigeo Ueda
PPT
第1回鹿児島node.jsの会資料_内村
Koichi Uchimura
PDF
Start React with Browserify
Muyuu Fujita
PDF
「html5 boilerplate」から考える、これからのマークアップ
Yasuhito Yabe
PDF
Tide - SmalltalkでSPA
Masashi Umezawa
PDF
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
PPT
サーバー実装いろいろ
kjwtnb
PDF
ISUCONの話(夏期講習2014)
SATOSHI TAGOMORI
PDF
Windows スクリプトセミナー WMI編 VBScript&WMI
junichi anno
PPTX
CategoLJについて
Toshiaki Maki
PPTX
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
Kiyoshi Sawada
PPTX
EWD 3トレーニングコース#4 ewd-xpressのインストールと構成
Kiyoshi Sawada
PDF
丸の内MongoDB勉強会#20LT 2.8のストレージエンジン動かしてみました
Ryuji Tamagawa
PDF
Progressive Framework Vue.js 2.0
Toshiro Shimizu
PDF
これから利用拡大?WebSocket
AdvancedTechNight
PPTX
20081003
小野 修司
KEY
Wight: Phantom’s Perl friend - YAPC::Asia 2012
Hiroshi Shibamura
第1回Webサーバ勉強会 - 212-223 ブラウザマッチ処理
Seiichiro Ishida
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
おすすめ gem
chocoby
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Shigeo Ueda
第1回鹿児島node.jsの会資料_内村
Koichi Uchimura
Start React with Browserify
Muyuu Fujita
「html5 boilerplate」から考える、これからのマークアップ
Yasuhito Yabe
Tide - SmalltalkでSPA
Masashi Umezawa
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
サーバー実装いろいろ
kjwtnb
ISUCONの話(夏期講習2014)
SATOSHI TAGOMORI
Windows スクリプトセミナー WMI編 VBScript&WMI
junichi anno
CategoLJについて
Toshiaki Maki
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
Kiyoshi Sawada
EWD 3トレーニングコース#4 ewd-xpressのインストールと構成
Kiyoshi Sawada
丸の内MongoDB勉強会#20LT 2.8のストレージエンジン動かしてみました
Ryuji Tamagawa
Progressive Framework Vue.js 2.0
Toshiro Shimizu
これから利用拡大?WebSocket
AdvancedTechNight
20081003
小野 修司
Wight: Phantom’s Perl friend - YAPC::Asia 2012
Hiroshi Shibamura
Viewers also liked
(20)
ODP
SockJS Intro
Ngoc Dao
PDF
WebSockets with Spring 4
Sergi Almar i Graupera
PDF
Make social media work for you
October Communications
PDF
Realtime web application with java
JeongHun Byeon
PPT
WebSockets and Java
Bozhidar Bozhanov
PDF
讓「文字型簡報」可讀性更高
sliDEsign
PDF
把握每個人生機會 創造自我高峰 | 莊淑芬 Shenan Chuang
sliDEsign
PPTX
Websockets and SockJS, Real time chatting
University of Alabama at Birmingham
PDF
SKET Servise Guide
SKET
PPTX
日本都市再生15年回顧
Chih-Cheng Ting
PPTX
Spring + WebSocket integration
Oleksandr Semenov
PDF
デザイン提案の参考資料
Tsutomu Sogitani
PDF
Webライティング11のルール
Tsutomu Sogitani
PDF
Digital Leadership, Reputation and Being Your Best Self
Paul Brown
PDF
REST vs. Messaging For Microservices
Eberhard Wolff
PPT
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
Shoe-g Ueyama
PDF
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
Tsutomu Sogitani
PDF
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
MOCKS | Yuta Morishige
PDF
Social Media Best Practices, Part 1
David King
PDF
Top Non Profits On Social Media Q4 2015
Unmetric
SockJS Intro
Ngoc Dao
WebSockets with Spring 4
Sergi Almar i Graupera
Make social media work for you
October Communications
Realtime web application with java
JeongHun Byeon
WebSockets and Java
Bozhidar Bozhanov
讓「文字型簡報」可讀性更高
sliDEsign
把握每個人生機會 創造自我高峰 | 莊淑芬 Shenan Chuang
sliDEsign
Websockets and SockJS, Real time chatting
University of Alabama at Birmingham
SKET Servise Guide
SKET
日本都市再生15年回顧
Chih-Cheng Ting
Spring + WebSocket integration
Oleksandr Semenov
デザイン提案の参考資料
Tsutomu Sogitani
Webライティング11のルール
Tsutomu Sogitani
Digital Leadership, Reputation and Being Your Best Self
Paul Brown
REST vs. Messaging For Microservices
Eberhard Wolff
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
Shoe-g Ueyama
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
Tsutomu Sogitani
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
MOCKS | Yuta Morishige
Social Media Best Practices, Part 1
David King
Top Non Profits On Social Media Q4 2015
Unmetric
Ad
Similar to Using SockJS(Websocket) with Sencha Ext JS
(20)
PPTX
SL囲む会東京5 Nodejs×Silverlightではまったこと
normalian
PPTX
JavaOne2014報告会資料
Mitsuyasu Tsuhako
PDF
Nodejs Introduction
Jxck Jxck
PDF
20130315 abc firefox_os
Tomoaki Konno
PPTX
120512 metro styleapp_javascript
Takayoshi Tanaka
PDF
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
PDF
WebSocket Chat App Hands On on Microsoft Azure
Yoshio Terada
PDF
WebSocket + Node.jsでつくるチャットアプリ
Kohei Kadowaki
PDF
Web socketドロンくん その後-
Yuuichi Akagawa
PDF
Bp study39 nodejs
Yohei Sasaki
PDF
第4回鹿児島node.jsの会資料_内村
Koichi Uchimura
PDF
Playで作るwebsocketサーバ
ke-m kamekoopa
ODP
Node handson
Makoto Kishimoto
PPTX
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
PDF
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
Kazuhiro Hara
PDF
「Tiのソケットで待ってる」Titanium Nagoya Chatroom Vol.2
Akira Suzuki
PPT
websocket-survery
hogemaru_
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
PDF
SocketStream入門
Kohei Kadowaki
PDF
後期第七回ネットワークチーム講座資料
densan_teacher
SL囲む会東京5 Nodejs×Silverlightではまったこと
normalian
JavaOne2014報告会資料
Mitsuyasu Tsuhako
Nodejs Introduction
Jxck Jxck
20130315 abc firefox_os
Tomoaki Konno
120512 metro styleapp_javascript
Takayoshi Tanaka
PlayFramework1.2.4におけるWebSocket
Kazuhiro Hara
WebSocket Chat App Hands On on Microsoft Azure
Yoshio Terada
WebSocket + Node.jsでつくるチャットアプリ
Kohei Kadowaki
Web socketドロンくん その後-
Yuuichi Akagawa
Bp study39 nodejs
Yohei Sasaki
第4回鹿児島node.jsの会資料_内村
Koichi Uchimura
Playで作るwebsocketサーバ
ke-m kamekoopa
Node handson
Makoto Kishimoto
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
Kazuhiro Hara
「Tiのソケットで待ってる」Titanium Nagoya Chatroom Vol.2
Akira Suzuki
websocket-survery
hogemaru_
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
SocketStream入門
Kohei Kadowaki
後期第七回ネットワークチーム講座資料
densan_teacher
Ad
Recently uploaded
(8)
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
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
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
Using SockJS(Websocket) with Sencha Ext JS
1.
Using SockJS(Websocket) with
Sencha Ext JS Sencha Ext JS上のWebSocket実装の形 小堤 一弘 株式会社ゼノフィ Xenophy.CO.,LTD
2.
本日のアジェンダ 自己紹介 SockJSをSencha Ext JSで使うための準備 メッセージ交換と、マウス位置共有の設計 デモ まとめ
3.
自己紹介 こつつみ かずひろ 小堤 一弘 株式会社ゼノフィ
代表取締役 Sencha 公式トレーニング認定トレーナー Japan Sencha User Group 主宰 html5jエンタープライズ部 ! Twitter @kotsutsumi ! Facebook https://www.facebook.com/kotsutsumi Books Ext JS Data-Driven Application Design Sencha Ext JS 4 実践開発ガイド Sencha Ext JS 4 実践開発ガイド 2 Sencha Touch 2 実践開発ガイド (監修)
4.
SockJSをSencha Ext JSで使うための準備 まず、普通にSockJSでWebSocket通信を するための準備をする。
5.
Vert.x + SockJS
Serverの環境構築について 昨日、 html5jエンタープライズ部 で、紹介させてもらった、 SPA のための Web サーバ構築ノウハウ を参照してください。 http://www.slideshare.net/kotsutsumi/spa-web
6.
SockJS Serverの作成 // Vert.x読み込み var
vertx = require('vertx'); ! // HTTPサーバー生成 var server = vertx.createHttpServer(); ! // SockJSサーバー生成 var sockJSServer = vertx.createSockJSServer(server);
7.
SockJS Serverの作成 // Vert.x読み込み var
vertx = require('vertx'); ! // HTTPサーバー生成 var server = vertx.createHttpServer(); ! // SockJSサーバー生成 var sockJSServer = vertx.createSockJSServer(server);
8.
SockJS Serverの作成 // Vert.x読み込み var
vertx = require('vertx'); ! // HTTPサーバー生成 var server = vertx.createHttpServer(); ! // SockJSサーバー生成 var sockJSServer = vertx.createSockJSServer(server);
9.
SockJS Serverの作成 // Vert.x読み込み var
vertx = require('vertx'); ! // HTTPサーバー生成 var server = vertx.createHttpServer(); ! // SockJSサーバー生成 var sockJSServer = vertx.createSockJSServer(server);
10.
SockJS Serverの作成 // ブリッジ設定 sockJSServer.bridge( ! //
コンフィグ {prefix : ‘/eventbus’}, ); // セキュリティ設定 [{address : ‘demo.orderMgr'}], [{address : ‘demo.orderMgr'}]
11.
SockJS Serverの作成 // ブリッジ設定 sockJSServer.bridge( ! //
コンフィグ {prefix : ‘/eventbus’}, ); // セキュリティ設定 [{address : ‘demo.orderMgr'}], [{address : ‘demo.orderMgr'}]
12.
SockJS Serverの作成 // ブリッジ設定 sockJSServer.bridge( ! //
コンフィグ {prefix : ‘/eventbus’}, ); // セキュリティ設定 [{address : ‘demo.orderMgr'}], [{address : ‘demo.orderMgr'}]
13.
SockJS Serverの作成 // ブリッジ設定 sockJSServer.bridge( ! //
コンフィグ {prefix : ‘/eventbus’}, ); // セキュリティ設定 [{address : ‘demo.orderMgr'}], [{address : ‘demo.orderMgr'}]
14.
SockJS Serverの作成 // ブリッジ設定 sockJSServer.bridge( ! //
コンフィグ {prefix : ‘/eventbus’}, // セキュリティ設定 [{address : ‘demo.orderMgr'}], [{address : ‘demo.orderMgr'}] ); ブリッジはデフォルトのすべてを拒否するポリシーを 持つファイアウォールの一種のように動作します。
15.
SockJS Serverの作成 // リスン server.listen(8081);
16.
SockJS Serverの起動 vertx run
extjs-sockjs.js クラスター起動する場合は、後ろに-clusterをつける
17.
無事、起動!!
18.
SockJS ClientのHTML作成 <html> <head> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script
src="vertxbus-2.1.js"></script> <script src="sockjs-app.js"></script> </head> <body> <h1>SockJS Client without Sencha Ext JS</h1> <button onclick="ebSend();">Send Message</button> </body> </html>
19.
SockJS ClientのHTML作成 <html> <head> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script
src="vertxbus-2.1.js"></script> <script src="sockjs-app.js"></script> </head> <body> <h1>SockJS Client without Sencha Ext JS</h1> <button onclick="ebSend();">Send Message</button> </body> </html>
20.
SockJS ClientのHTML作成 <html> <head> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script
src="vertxbus-2.1.js"></script> <script src="sockjs-app.js"></script> </head> <body> <h1>SockJS Client without Sencha Ext JS</h1> <button onclick="ebSend();">Send Message</button> </body> </html>
21.
SockJS ClientのHTML作成 <html> <head> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script
src="vertxbus-2.1.js"></script> <script src="sockjs-app.js"></script> </head> <body> <h1>SockJS Client without Sencha Ext JS</h1> <button onclick="ebSend();">Send Message</button> </body> </html>
22.
SockJS ClientのHTML作成 <html> <head> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script
src="vertxbus-2.1.js"></script> <script src="sockjs-app.js"></script> </head> <body> <h1>SockJS Client without Sencha Ext JS</h1> <button onclick="ebSend();">Send Message</button> </body> </html>
23.
SockJSクライアントに必要なリソース sockjs-0.3.4.min.js http://cdn.sockjs.org/sockjs-0.3.4.min.js vertxbus-2.1.js vert.x-2.1M2.tar.gzを解凍したディレクトリに格納されている ので、HTMLからアクセスできるところに配置する。 vert.x-2.1M2/client/vertxbus-2.1.js
24.
SockJSアプリケーション作成 - sockjs-app.js //
イベントバス生成 var eb = new vertx.EventBus( 'http://[Vert.xサーバーIP]:8081/eventbus' );
25.
SockJSアプリケーション作成 - sockjs-app.js //
イベントバス生成 var eb = new vertx.EventBus( 'http://[Vert.xサーバーIP]:8081/eventbus' );
26.
SockJSアプリケーション作成 - sockjs-app.js //
イベントバス生成 var eb = new vertx.EventBus( 'http://[Vert.xサーバーIP]:8081/eventbus' ); これが、さっきサーバーサイドで設定したprefixね! ! {prefix : '/eventbus'}
27.
SockJSアプリケーション作成 - sockjs-app.js //
openイベントハンドラ eb.onopen = function() { console.log('open'); eb.registerHandler( 'demo.orderMgr', function(message) { console.log( 'received a message: ' + JSON.stringify(message) ); } ); }
28.
SockJSアプリケーション作成 - sockjs-app.js //
openイベントハンドラ eb.onopen = function() { console.log('open'); eb.registerHandler( 'demo.orderMgr', function(message) { console.log( 'received a message: ' + JSON.stringify(message) ); } ); }
29.
SockJSアプリケーション作成 - sockjs-app.js //
openイベントハンドラ eb.onopen = function() { console.log('open'); eb.registerHandler( 'demo.orderMgr', function(message) { console.log( 'received a message: ' + JSON.stringify(message) ); } ); }
30.
SockJSアプリケーション作成 - sockjs-app.js //
openイベントハンドラ eb.onopen = function() { console.log('open'); eb.registerHandler( 'demo.orderMgr', セキュリティ設定で指定したaddress function(message) { console.log( 'received a message: ' + JSON.stringify(message) ); } ); }
31.
SockJSアプリケーション作成 - sockjs-app.js //
openイベントハンドラ eb.onopen = function() { console.log('open'); eb.registerHandler( 'demo.orderMgr', function(message) { メッセージを受信したときのコールバック関数 console.log( 'received a message: ' + JSON.stringify(message) ); } ); }
32.
実行すると、こんな感じ
33.
SockJSで、WebSocket繋がったね!
34.
やったねっ!
35.
これ前回… html5j エンタープライズ部でやったやつ…
36.
を、ちょっと詳しく説明しただけ…
37.
デス!!
38.
続きまして…
39.
メッセージ交換と、マウス位置共有の設計 SockJSをSencha Ext JSのクラスシステムで ラッピングする
40.
Sencha Cmdを利用してワークスペースを作成する SDKまでのパス sencha -s ~/Library/Sencha/ext-4.2.2.1144 generate
app MyApp ./
41.
Sencha Cmdを利用してワークスペースを作成する チンッ!!
42.
ext-sockjsを作る SockJSをラッピングして、Sencha Ext JSのクラスシステムとして 利用できるようにする。
43.
ext-sockjsを作る Controller A EventBus A Controller
B Controller C Component A Component B Manager EventBus B EventBus C
44.
ext-sockjsを作る 大体こんな感じの、Sencha Ext JSでは、 普通のExt.AbstractManagerを継承したクラス構成
45.
ext-sockjsを作る というのも、粗いので、ソースを見ていきましょう…
46.
ext-sockjsを作る Ext.sockjs.Manager
47.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
48.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
49.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
50.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
51.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
52.
Ext.sockjs.Manager Ext.define('Ext.sockjs.Manager', { extend: 'Ext.AbstractManager', requires:
[ 'Ext.util.MixedCollection', 'Ext.sockjs.EventBus' ], mixins: { observable: 'Ext.util.Observable' }, singleton: true,
53.
Ext.sockjs.Manager constructor: function() { var
me = this; me.eventbuses = new Ext.util.MixedCollection(); me.mixins.observable.constructor.call(me); },
54.
Ext.sockjs.Manager constructor: function() { var
me = this; me.eventbuses = new Ext.util.MixedCollection(); me.mixins.observable.constructor.call(me); },
55.
Ext.sockjs.Manager constructor: function() { var
me = this; me.eventbuses = new Ext.util.MixedCollection(); me.mixins.observable.constructor.call(me); },
56.
Ext.sockjs.Manager constructor: function() { var
me = this; me.eventbuses = new Ext.util.MixedCollection(); me.mixins.observable.constructor.call(me); },
57.
Ext.sockjs.Manager addEventBus: function(config) { var
me = this; config = config || {}; Ext.applyIf(config, { url: '', addr: '' }); me.eventbuses.add( config.addr, Ext.create('Ext.sockjs.EventBus', config) ); },
58.
Ext.sockjs.Manager addEventBus: function(config) { var
me = this; config = config || {}; Ext.applyIf(config, { url: '', addr: '' }); me.eventbuses.add( config.addr, Ext.create('Ext.sockjs.EventBus', config) ); },
59.
Ext.sockjs.Manager addEventBus: function(config) { var
me = this; config = config || {}; Ext.applyIf(config, { url: '', addr: '' }); me.eventbuses.add( config.addr, Ext.create('Ext.sockjs.EventBus', config) ); },
60.
Ext.sockjs.Manager addEventBus: function(config) { var
me = this; config = config || {}; Ext.applyIf(config, { url: '', addr: '' }); me.eventbuses.add( config.addr, Ext.create('Ext.sockjs.EventBus', config) ); },
61.
Ext.sockjs.Manager addEventBus: function(config) { var
me = this; config = config || {}; Ext.applyIf(config, { url: '', addr: '' }); me.eventbuses.add( config.addr, Ext.create('Ext.sockjs.EventBus', config) ); },
62.
Ext.sockjs.Manager get: function(name) { var
me = this; return me.eventbuses.get(name); } }, function() { Ext.SockJS = Ext.sockjs.Manager; });
63.
Ext.sockjs.Manager get: function(name) { var
me = this; return me.eventbuses.get(name); } }, function() { Ext.SockJS = Ext.sockjs.Manager; });
64.
Ext.sockjs.Manager get: function(name) { var
me = this; return me.eventbuses.get(name); } }, function() { Ext.SockJS = Ext.sockjs.Manager; });
65.
Ext.sockjs.Manager get: function(name) { var
me = this; return me.eventbuses.get(name); } }, function() { Ext.SockJS = Ext.sockjs.Manager; });
66.
ext-sockjsを作る Managerはできたので、次は管理される側を…
67.
ext-sockjsを作る Ext.sockjs.EventBus
68.
Ext.sockjs.EventBus Ext.define('Ext.sockjs.EventBus', { mixins: { observable:
'Ext.util.Observable' },
69.
Ext.sockjs.EventBus Ext.define('Ext.sockjs.EventBus', { mixins: { observable:
'Ext.util.Observable' },
70.
Ext.sockjs.EventBus Ext.define('Ext.sockjs.EventBus', { mixins: { observable:
'Ext.util.Observable' },
71.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
72.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
73.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
74.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
75.
Ext.sockjs.EventBus constructor: function(config) { var
me = this; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
76.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
77.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
78.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
79.
Ext.sockjs.EventBus constructor: function(config) { var
me = this, conn; Ext.apply(me, config); Ext.applyIf(me, { id : Ext.id(null, 'eventbus-'), conn : new vertx.EventBus(config.url) }); Ext.apply(me.conn, { onopen : Ext.Function.pass(me.onOpen, [], me), onmessage : Ext.Function.pass(me.onMessage, [], me), onclose : Ext.Function.pass(me.onClose, [], me) }); me.mixins.observable.constructor.call(me, config); },
80.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
81.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
82.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
83.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
84.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
85.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
86.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
87.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
88.
Ext.sockjs.EventBus onOpen: function(eventbus) { var
me = this; me.fireEvent('open'); me.conn.registerHandler(me.addr, Ext.Function.pass(me.onReceive, [], me)); }, onReceive: function(message) { var me = this; me.fireEvent('receive', message); }, onMessage: function(e) { var me = this; me.fireEvent('message', e); console.log('message', e.data); },
89.
Ext.sockjs.EventBus onClose:function() { var me
= this; me.fireEvent('close'); console.log('close'); }, publish: function(o) { var me = this; me.conn.publish(me.addr, o); } });
90.
Ext.sockjs.EventBus onClose: function() { var
me = this; me.fireEvent('close'); console.log('close'); }, publish: function(o) { var me = this; me.conn.publish(me.addr, o); } });
91.
Ext.sockjs.EventBus onClose: function() { var
me = this; me.fireEvent('close'); console.log('close'); }, publish: function(o) { var me = this; me.conn.publish(me.addr, o); } });
92.
Ext.sockjs.EventBus onClose: function() { var
me = this; me.fireEvent('close'); console.log('close'); }, publish: function(o) { var me = this; me.conn.publish(me.addr, o); } });
93.
Ext.sockjs.EventBus onClose: function() { var
me = this; me.fireEvent('close'); console.log('close'); }, publish: function(o) { var me = this; me.conn.publish(me.addr, o); } });
94.
メッセージのやりとりをする 最初に解説した、素のSockJSサンプルと同じ事を Sencha Ext JS上で、作ったクラスを使ってやってみま しょう。
95.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); eb.on('receive', function(o) { console.log(o); });
96.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
97.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
98.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
99.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
100.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
101.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
102.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
103.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr); ! eb.on('receive', function(o) { console.log(o); });
104.
サンプルコード this.control({ 'button[action=publish]': { click: function()
{ eb.publish('testdata'); } }, });
105.
サンプルコード this.control({ 'button[action=publish]': { click: function()
{ eb.publish('testdata'); } }, });
106.
サンプルコード this.control({ 'button[action=publish]': { click: function()
{ eb.publish('testdata'); } }, });
107.
サンプルコード this.control({ 'button[action=publish]': { click: function()
{ eb.publish('testdata'); } }, });
108.
サンプルコード this.control({ 'button[action=publish]': { click: function()
{ eb.publish('testdata'); } }, });
109.
デモ
110.
共有オブジェクト(仮) メッセージのやりとりができたので、 今度は、Ext.window.Windowを表示して、 複数のブラウザで位置やサイズを共有してみましょう。
111.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr), win, lock = false;
112.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr), win, lock = false;
113.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr), win, lock = false;
114.
サンプルコード Ext.SockJS.addEventBus({ url : 'http://xxx.xxx.xxx.xxx:8081/eventbus', addr : 'demo.orderMgr' }); ! var
addr = 'demo.orderMgr', eb = Ext.SockJS.get(addr), win, lock = false;
115.
サンプルコード eb.on('receive', function(o) { if(!lock)
{ win.suspendEvents(false); if(o.x || o.y) { win.setPosition(o.x, o.y); } else if(o.width || o.height) { win.setSize(o.width, o.height); } win.resumeEvents(); } lock = false; });
116.
サンプルコード eb.on('receive', function(o) { if(!lock)
{ win.suspendEvents(false); if(o.x || o.y) { win.setPosition(o.x, o.y); } else if(o.width || o.height) { win.setSize(o.width, o.height); } win.resumeEvents(); } lock = false; });
117.
サンプルコード eb.on('receive', function(o) { if(!lock)
{ win.suspendEvents(false); if(o.x || o.y) { win.setPosition(o.x, o.y); } else if(o.width || o.height) { win.setSize(o.width, o.height); } win.resumeEvents(); } lock = false; });
118.
サンプルコード eb.on('receive', function(o) { if(!lock)
{ win.suspendEvents(false); if(o.x || o.y) { win.setPosition(o.x, o.y); } else if(o.width || o.height) { win.setSize(o.width, o.height); } win.resumeEvents(); } lock = false; });
119.
サンプルコード this.control({ 'button[action=createwindow]': { click: function()
{ win = Ext.widget('window', { itemId: 'hoge', autoShow: true, width: 300, height: 200 });
120.
サンプルコード this.control({ 'button[action=createwindow]': { click: function()
{ win = Ext.widget('window', { itemId: 'hoge', autoShow: true, width: 300, height: 200 });
121.
サンプルコード this.control({ 'button[action=createwindow]': { click: function()
{ win = Ext.widget('window', { itemId: 'hoge', autoShow: true, width: 300, height: 200 });
122.
サンプルコード }); } } win.on({ move: function(win, x,
y) { lock = true; eb.publish({ x: x, y: y }); }, resize: function(win, width, height) { lock = true; eb.publish({ width: width, height: height }); } });
123.
サンプルコード }); } } win.on({ move: function(win, x,
y) { lock = true; eb.publish({ x: x, y: y }); }, resize: function(win, width, height) { lock = true; eb.publish({ width: width, height: height }); } });
124.
サンプルコード }); } } win.on({ move: function(win, x,
y) { lock = true; eb.publish({ x: x, y: y }); }, resize: function(win, width, height) { lock = true; eb.publish({ width: width, height: height }); } });
125.
デモ
126.
まとめ SockJSのクライアントライブラリと、EventBusをラッピングして しまえば、Sencha クラスシステム上で違和感なく利用できる。 メッセージングで処理する内容を、コンポーネントの共有(共有オ ブジェクト)や、データストアなどSencha クラスシステム上の構 造に乗せていくと、よりリアルタイムにおもしろいアプリケーショ ンが作れそう。
127.
まとめ インフラは、前回html5j エンタープライズ部で話した、vert.xでス ケールもできてEventBusに乗せとけば、あまり細かいこと考えなく ても良さそう。
128.
素のWebSocket使ってやるより、良くない?
129.
使う技術に翻弄されず、 やりたいことを迅速に実現しよう!
130.
今日、紹介したソースコードは、GitHubにて公開してあります。 が!まだまだSencha Ext JSクラスっぽく無いので鋭意作成中… https://github.com/xenophy/ext-sockjs
131.
Sencha フレームワーク SockJS まだまだ、可能性がありそうだねっ!
132.
ご清聴ありがとうございました!
Download