SlideShare a Scribd company logo
Using SockJS(Websocket) with Sencha Ext JS
Sencha Ext JS上のWebSocket実装の形
小堤 一弘

株式会社ゼノフィ
Xenophy.CO.,LTD
本日のアジェンダ
自己紹介
SockJSをSencha Ext JSで使うための準備
メッセージ交換と、マウス位置共有の設計
デモ
まとめ
自己紹介

こつつみ   かずひろ

小堤 一弘
株式会社ゼノフィ 代表取締役
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 実践開発ガイド (監修)
SockJSをSencha Ext JSで使うための準備

まず、普通にSockJSでWebSocket通信を
するための準備をする。
Vert.x + SockJS Serverの環境構築について
昨日、 html5jエンタープライズ部
で、紹介させてもらった、
SPA のための Web サーバ構築ノウハウ
を参照してください。
http://www.slideshare.net/kotsutsumi/spa-web
SockJS Serverの作成

// Vert.x読み込み
var vertx = require('vertx');
!

// HTTPサーバー生成
var server = vertx.createHttpServer();
!

// SockJSサーバー生成
var sockJSServer = vertx.createSockJSServer(server);
SockJS Serverの作成

// Vert.x読み込み
var vertx = require('vertx');
!

// HTTPサーバー生成
var server = vertx.createHttpServer();
!

// SockJSサーバー生成
var sockJSServer = vertx.createSockJSServer(server);
SockJS Serverの作成

// Vert.x読み込み
var vertx = require('vertx');
!

// HTTPサーバー生成
var server = vertx.createHttpServer();
!

// SockJSサーバー生成
var sockJSServer = vertx.createSockJSServer(server);
SockJS Serverの作成

// Vert.x読み込み
var vertx = require('vertx');
!

// HTTPサーバー生成
var server = vertx.createHttpServer();
!

// SockJSサーバー生成
var sockJSServer = vertx.createSockJSServer(server);
SockJS Serverの作成
// ブリッジ設定
sockJSServer.bridge(
!

// コンフィグ
{prefix : ‘/eventbus’},

);

// セキュリティ設定
[{address : ‘demo.orderMgr'}],
[{address : ‘demo.orderMgr'}]
SockJS Serverの作成
// ブリッジ設定
sockJSServer.bridge(
!

// コンフィグ
{prefix : ‘/eventbus’},

);

// セキュリティ設定
[{address : ‘demo.orderMgr'}],
[{address : ‘demo.orderMgr'}]
SockJS Serverの作成
// ブリッジ設定
sockJSServer.bridge(
!

// コンフィグ
{prefix : ‘/eventbus’},

);

// セキュリティ設定
[{address : ‘demo.orderMgr'}],
[{address : ‘demo.orderMgr'}]
SockJS Serverの作成
// ブリッジ設定
sockJSServer.bridge(
!

// コンフィグ
{prefix : ‘/eventbus’},

);

// セキュリティ設定
[{address : ‘demo.orderMgr'}],
[{address : ‘demo.orderMgr'}]
SockJS Serverの作成
// ブリッジ設定
sockJSServer.bridge(
!

// コンフィグ
{prefix : ‘/eventbus’},
// セキュリティ設定
[{address : ‘demo.orderMgr'}],
[{address : ‘demo.orderMgr'}]

);

ブリッジはデフォルトのすべてを拒否するポリシーを
持つファイアウォールの一種のように動作します。
SockJS Serverの作成
// リスン
server.listen(8081);
SockJS Serverの起動

vertx run extjs-sockjs.js
クラスター起動する場合は、後ろに-clusterをつける
無事、起動!!
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>
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>
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>
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>
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>
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
SockJSアプリケーション作成 - sockjs-app.js
// イベントバス生成
var eb = new vertx.EventBus(
'http://[Vert.xサーバーIP]:8081/eventbus'
);
SockJSアプリケーション作成 - sockjs-app.js
// イベントバス生成
var eb = new vertx.EventBus(
'http://[Vert.xサーバーIP]:8081/eventbus'
);
SockJSアプリケーション作成 - sockjs-app.js
// イベントバス生成
var eb = new vertx.EventBus(
'http://[Vert.xサーバーIP]:8081/eventbus'
);
これが、さっきサーバーサイドで設定したprefixね!

!

{prefix : '/eventbus'}
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)
);
}
);
}
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)
);
}
);
}
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)
);
}
);
}
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)
);
}
);
}
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)
);
}
);
}
実行すると、こんな感じ
SockJSで、WebSocket繋がったね!
やったねっ!
これ前回…
html5j エンタープライズ部でやったやつ…
を、ちょっと詳しく説明しただけ…
デス!!
続きまして…
メッセージ交換と、マウス位置共有の設計

SockJSをSencha Ext JSのクラスシステムで
ラッピングする
Sencha Cmdを利用してワークスペースを作成する

SDKまでのパス

sencha
-s ~/Library/Sencha/ext-4.2.2.1144
generate app MyApp ./
Sencha Cmdを利用してワークスペースを作成する

チンッ!!
ext-sockjsを作る

SockJSをラッピングして、Sencha Ext JSのクラスシステムとして
利用できるようにする。
ext-sockjsを作る
Controller A
EventBus A
Controller B

Controller C

Component A

Component B

Manager

EventBus B

EventBus C
ext-sockjsを作る

大体こんな感じの、Sencha Ext JSでは、
普通のExt.AbstractManagerを継承したクラス構成
ext-sockjsを作る

というのも、粗いので、ソースを見ていきましょう…
ext-sockjsを作る

Ext.sockjs.Manager
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,
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,
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,
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,
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,
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,
Ext.sockjs.Manager
constructor: function() {
var me = this;
me.eventbuses = new Ext.util.MixedCollection();
me.mixins.observable.constructor.call(me);
},
Ext.sockjs.Manager
constructor: function() {
var me = this;
me.eventbuses = new Ext.util.MixedCollection();
me.mixins.observable.constructor.call(me);
},
Ext.sockjs.Manager
constructor: function() {
var me = this;
me.eventbuses = new Ext.util.MixedCollection();
me.mixins.observable.constructor.call(me);
},
Ext.sockjs.Manager
constructor: function() {
var me = this;
me.eventbuses = new Ext.util.MixedCollection();
me.mixins.observable.constructor.call(me);
},
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)
);
},
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)
);
},
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)
);
},
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)
);
},
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)
);
},
Ext.sockjs.Manager
get: function(name) {
var me = this;
return me.eventbuses.get(name);
}
}, function() {
Ext.SockJS = Ext.sockjs.Manager;
});
Ext.sockjs.Manager
get: function(name) {
var me = this;
return me.eventbuses.get(name);
}
}, function() {
Ext.SockJS = Ext.sockjs.Manager;
});
Ext.sockjs.Manager
get: function(name) {
var me = this;
return me.eventbuses.get(name);
}
}, function() {
Ext.SockJS = Ext.sockjs.Manager;
});
Ext.sockjs.Manager
get: function(name) {
var me = this;
return me.eventbuses.get(name);
}
}, function() {
Ext.SockJS = Ext.sockjs.Manager;
});
ext-sockjsを作る

Managerはできたので、次は管理される側を…
ext-sockjsを作る

Ext.sockjs.EventBus
Ext.sockjs.EventBus
Ext.define('Ext.sockjs.EventBus', {
mixins: {
observable: 'Ext.util.Observable'
},
Ext.sockjs.EventBus
Ext.define('Ext.sockjs.EventBus', {
mixins: {
observable: 'Ext.util.Observable'
},
Ext.sockjs.EventBus
Ext.define('Ext.sockjs.EventBus', {
mixins: {
observable: 'Ext.util.Observable'
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
},
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);
}
});
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);
}
});
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);
}
});
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);
}
});
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);
}
});
メッセージのやりとりをする

最初に解説した、素のSockJSサンプルと同じ事を
Sencha Ext JS上で、作ったクラスを使ってやってみま
しょう。
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

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);
});
サンプルコード

this.control({
'button[action=publish]': {
click: function() {
eb.publish('testdata');
}
},
});
サンプルコード

this.control({
'button[action=publish]': {
click: function() {
eb.publish('testdata');
}
},
});
サンプルコード

this.control({
'button[action=publish]': {
click: function() {
eb.publish('testdata');
}
},
});
サンプルコード

this.control({
'button[action=publish]': {
click: function() {
eb.publish('testdata');
}
},
});
サンプルコード

this.control({
'button[action=publish]': {
click: function() {
eb.publish('testdata');
}
},
});
デモ
共有オブジェクト(仮)

メッセージのやりとりができたので、
今度は、Ext.window.Windowを表示して、
複数のブラウザで位置やサイズを共有してみましょう。
サンプルコード

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;
サンプルコード

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;
サンプルコード

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;
サンプルコード

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;
サンプルコード
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;
});
サンプルコード
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;
});
サンプルコード
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;
});
サンプルコード
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;
});
サンプルコード

this.control({
'button[action=createwindow]': {
click: function() {
win = Ext.widget('window', {
itemId: 'hoge',
autoShow: true,
width: 300,
height: 200
});
サンプルコード

this.control({
'button[action=createwindow]': {
click: function() {
win = Ext.widget('window', {
itemId: 'hoge',
autoShow: true,
width: 300,
height: 200
});
サンプルコード

this.control({
'button[action=createwindow]': {
click: function() {
win = Ext.widget('window', {
itemId: 'hoge',
autoShow: true,
width: 300,
height: 200
});
サンプルコード

});

}

}

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
});
}
});
サンプルコード

});

}

}

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
});
}
});
サンプルコード

});

}

}

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
});
}
});
デモ
まとめ

SockJSのクライアントライブラリと、EventBusをラッピングして
しまえば、Sencha クラスシステム上で違和感なく利用できる。
メッセージングで処理する内容を、コンポーネントの共有(共有オ
ブジェクト)や、データストアなどSencha クラスシステム上の構
造に乗せていくと、よりリアルタイムにおもしろいアプリケーショ
ンが作れそう。
まとめ

インフラは、前回html5j エンタープライズ部で話した、vert.xでス
ケールもできてEventBusに乗せとけば、あまり細かいこと考えなく
ても良さそう。
素のWebSocket使ってやるより、良くない?
使う技術に翻弄されず、
やりたいことを迅速に実現しよう!
今日、紹介したソースコードは、GitHubにて公開してあります。

が!まだまだSencha Ext JSクラスっぽく無いので鋭意作成中…

https://github.com/xenophy/ext-sockjs
Sencha フレームワーク SockJS
まだまだ、可能性がありそうだねっ!
ご清聴ありがとうございました!

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