Powering your website with realtime data Bert Van Hauwaert [email protected] - @tbotwit Sunday 26 February 2012
Jan 15, 2015
Powering your website with realtime data
Bert Van [email protected] - @tbotwit
Sunday 26 February 2012
Bert Van Hauwaert
• Live in Belgium
• Founder of be.coded
• Freelance web application developer & consultant
• ZCE 5.0
• Working on portal sites and realtime auction sites
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
The old days
• <meta http-equiv=”refresh” content=”5” />
• <script >
• AJAX
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Websockets
Source: http://caniuse.com/#feat=websockets
Sunday 26 February 2012
XMPP: what
• Extensible Messaging and Presence Protocol
• Jabber
• XML
• Client - Server - Component
Sunday 26 February 2012
XMPP: stanzas
• <presence>
• <message>
• <iq>
Sunday 26 February 2012
XMPP: stanzas
• <presence>
• <message>
• <iq>
Sunday 26 February 2012
XMPP: stanzas
• <presence>
• <message>
• <iq>
Sunday 26 February 2012
XMPP: stanzas
• <presence>
• <message>
• <iq>
Sunday 26 February 2012
XMPP: addressing
• JID (Jabber Identifier)
• Three main parts
• [ node "@" ] domain [ "/" resource ]
Sunday 26 February 2012
XMPP: extensions
• XMPP Extension Protocol - XEP
• http://xmpp.org/xmpp-protocols/xmpp-extensions/
Sunday 26 February 2012
XMPP: advantages
• Open
• Decentralized
• Secure
• Extensible
Sunday 26 February 2012
XMPP: disadvantages
• Statefulness
• Overhead
Sunday 26 February 2012
XMPP: example<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example
<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example<stream:stream>
<iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example
<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq>
<presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence />
<message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message>
<presence> <show>dnd</show> <status> Giving a talk @ PHP UK conference </status> </presence></stream:stream>
Sunday 26 February 2012
XMPP: example<stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="[email protected]" from="[email protected]/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status> Giving a talk @ PHP UK conference </status> </presence>
</stream:stream>
Sunday 26 February 2012
XMPP: XEP-0060 (1)
• PubSub (Publish / Subscribe)
• Bandwidth / resources
Sunday 26 February 2012
XMPP: XEP-0060 (2)
<iqfrom="[email protected]/car" id="ams9nz78"to="pubsub.holiday.com"type="set"><pubsub xmlns="http://jabber.org/protocol/pubsub"><subscribe node="are-we-there-yet" jid="[email protected]"/>
</pubsub></iq>
Sunday 26 February 2012
XMPP: XEP-0060 (3)
<iqfrom="[email protected]/car" id="wmn78e45a" to="pubsub.holiday.com"type="set"><pubsub xmlns="http://jabber.org/protocol/pubsub"><publish node="are-we-there-yet"><item><there xmlns="http://holiday.com/there-yet" status="true"/>
</item></publish>
</pubsub></iq>
Sunday 26 February 2012
XMPP: XEP-0060 (4)
<message from="pubsub.holiday.com" to="[email protected]"><event xmlns="http://jabber.org/protocol/pubsub#event"><items node="are-we-there-yet"><item id="ax78ui789q"><there xmlns="http://holiday.com/there-yet" status="true"/>
</item></items>
</event></message>
Sunday 26 February 2012
XMPP: XEP-0045 (1)
• MUC / Multi-User Chat
• “Multiplier”
Sunday 26 February 2012
XMPP: XEP-0045 (2)
<presencefrom="[email protected]/resource" to="[email protected]/nickname"><x xmlns="http://jabber.org/protocol/muc"/>
</presence>
Sunday 26 February 2012
XMPP: XEP-0045 (3)
<message to="[email protected]"from="[email protected]/resource" type="groupchat "><body>Lorem Ipsum</body>
</message>
<message to="[email protected]/resource"from="[email protected]/nickname" type="groupchat "><body>Lorem Ipsum</body></message>
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Install server: starting point
• Debian
• web server
• SQL database
• SSH server
Sunday 26 February 2012
Install server: apt sources
• apt-get install vim
• vim /etc/apt/sources.list
• deb http://ftp.belnet.be/debian/ squeeze main non-freedeb-src http://ftp.belnet.be/debian/ squeeze maindeb http://security.debian.org/ squeeze/updates main non-freedeb-src http://security.debian.org/ squeeze/updates maindeb http://packages.dotdeb.org stable alldeb-src http://packages.dotdeb.org stable all
Sunday 26 February 2012
Install server: prerequisites (1)
• wget http://www.dotdeb.org/dotdeb.gpg
• cat dotdeb.gpg | apt-key add -
• apt-get update
• apt-get install sun-java6-jre sun-java6-fonts ident2
Sunday 26 February 2012
Install server: prerequisites (2)
• apt-get install mysql-server mysql-client
• apt-get install php5 php5-cli php5-common php5-dev php5-mysql php5-curl php-pear
• Database & user
Sunday 26 February 2012
Install server: Openfire (1)
• Openfire 3.7.1
• http://www.igniterealtime.org/projects/openfire/
• wget -O openfire_3.7.1_all.deb http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_3.7.1_all.deb
• dpkg -i openfire_3.7.1_all.deb
Sunday 26 February 2012
Install server: Openfire (2)
• http://[server-ip]:9090/
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Install server: Openfire (3)
• Plugins
• User Service
• Monitoring Service
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Configure apache: why(1)
Client - polling
Server
Client - long polling
new data
no d
ata
no d
ata
no d
ata
data
data
Sunday 26 February 2012
Configure apache: why(2)
• BOSH (Bidirectional streams Over Synchronous HTTP)
Sunday 26 February 2012
Configure apache: proxy (1)
• cd /etc/apache2/mods-enabled/
• ln -s ../mods-available/proxy.load
• ln -s ../mods-available/proxy_http.load
• ln -s ../mods-available/rewrite.load
Sunday 26 February 2012
Configure apache: proxy (2)
<VirtualHost *:80> Options FollowSymLinks ServerAdmin [email protected] ServerName xmpp.dev.becoded.be ServerAlias static.xmpp.dev.becoded.be # Indexes + Directory Root. DirectoryIndex index.php DocumentRoot /var/www/vhost/xmpp.dev.becoded.be/htdocs/public/ php_admin_value open_basedir ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/library:../:/usr/share/php:/tmp" php_value include_path ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/library:/usr/share/php" php_admin_value upload_tmp_dir "/tmp" SetEnv APPLICATION_ENV development
# Logfiles ErrorLog /var/www/vhost/xmpp.dev.becoded.be/logs/error.log CustomLog /var/www/vhost/xmpp.dev.becoded.be/logs/access.log combined
# XMPP proxy ruleProxyRequests OffProxyPass /bind http://127.0.0.1:7070/http-bind/ProxyPassReverse /bind http://127.0.0.1:7070/http-bind/</VirtualHost>
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Libraries
• ZF - http://framework.zend.com
• jQuery - http://jquery.com/
• jQuery UI - http://jqueryui.com/
• XMPPHP - http://code.google.com/p/xmpphp
• Jaxl - http://jaxl.net
• Strophe.js - http://strophe.im
Sunday 26 February 2012
Libraries: XMPPHP
$connection = new XMPPHP_XMPP( $host, $port, $identifier->node, $identifier->password, $identifier->resource, $domain, $printlog, $loglevel);$connection->connect();$connection->processUntil('session_start');$connection->message('support@demo', 'Hello world');$connection->disconnect();
Sunday 26 February 2012
Libraries: Jaxl$connection = new JAXL(array( 'user' => $identifier->node, 'pass' => $identifier->password,
'host' => $host,'domain' => $domain,
'port' => $port, 'authType' => 'PLAIN', 'logLevel' => $loglevel ));$connection->addPlugin('jaxl_post_auth', '_postAuthHook');$connection->startCore("stream");
public function _postAuthHook ($payload, $jaxl) {$jaxl->sendMessage('support@demo', 'Hello world');$jaxl->shutdown();
}
Sunday 26 February 2012
Libraries: Strophe.jsvar connection = new Strophe.Connection('/bind');connection.connect( jid, password, function (status) { if (status == Strophe.Status.CONNECTED) { var msg = $msg({ to : 'support@demo', type : "chat" }).c('body').t('Hello world'); connection.send(msg); setTimeout(function () { connection.disconnect(); }, 500); } });
Sunday 26 February 2012
Overview
• The old days
• XMPP
• Install server
• Configure apache
• Libraries
• Examples
Sunday 26 February 2012
Examples: setup
Sunday 26 February 2012
Sunday 26 February 2012
Examples: messages
• Browser
• Log
• Adium
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: IQ ping pong (1)
this.statusHandler = function (status) { var me = this; if (status == Strophe.Status.CONNECTED) { me.connection.addHandler( function(msg) { //(Function) handler return me.handlePong(msg); },
null, //(String) ns 'iq', //(String) name null, //(String) type 'pingPong'); //(String) id me.sendPing(Strophe.getDomainFromJid(me.connection.jid)); } };
Sunday 26 February 2012
Example: IQ ping pong (2)
this.sendPing = function (to){ var me = this; var iq = $iq({ to: to, type : 'get', id : 'pingPong' }).c('ping',
{xmlns: 'urn:xmpp:ping'}); me.connection.send(iq);};
<iq to='demo' type='get' id='pingPong' xmlns='jabber:client'> <ping
xmlns='urn:xmpp:ping'/></iq>
Sunday 26 February 2012
Example: IQ ping pong (3)
this.handlePong = function (msg){ var me = this; var objMsg = $(msg); var from = objMsg.attr('from'); me.log('Receiving ' + objMsg.attr('type') + ' from "' + objMsg.attr('from') + '" with id "' + objMsg.attr('id') + '"'); me.connection.disconnect();};
<iq xmlns="jabber:client" type="result" id="pingPong" from="demo" to="demo1@demo/eeffca60"/>
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: support chat (1)
this.bindSendMessage = function (){ var me = this; var chatMsg = $('#message'); $('#sendMessage').bind('click', function() { me.sendChatMessage(chatMsg.val()); me.resetTextarea(chatMsg); }); chatMsg.keyup(function(event) { if (event.keyCode == 13 && event.shiftKey) { me.sendChatMessage(chatMsg.val()); me.resetTextarea(chatMsg); } });};
Sunday 26 February 2012
Example: support chat (2)
this.statusHandler = function (status){ var me = this; me.logStatus(status); if (status == Strophe.Status.CONNECTED) { me.connection.addHandler( function(msg) { //(Function) handler. return me.handleChatMessage(msg); }, null, //(String) ns 'message', //(String) name 'chat'); //(String) type }};
Sunday 26 February 2012
Example: support chat (3)
this.handleChatMessage = function (msg){ var me = this; var objMsg = $(msg); var from = objMsg.attr('from'); var nick = Strophe.getNodeFromJid(from); var body = objMsg.children('body').text(); me.addMessageToChat(nick, body); return true;};
Sunday 26 February 2012
Example: support chat (4)
this.addMessageToChat = function (nick, body){ var me = this; var container = $('#chat'); var atBottom =
container.scrollTop() >= container[0].scrollHeight - container.height();
container.append('<dt>'+ nick +'</dt><dd>'+
me.nl2br(body, true) +'</dd>'); if (atBottom) { container.scrollTop(container[0].scrollHeight); }};
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: statistics
this.handleHighChartData = function (msg){ var me = this; var objMsg = $(msg);
var body = objMsg.children('body').text(); me.chart.series[0].setData(jQuery.parseJSON(body)); return true;};
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: prebind BOSH (1)
• SID - RID
• Security
• User friendly
• Performance
• Persisting
Sunday 26 February 2012
Example: prebind BOSH(2)
this.initConnection = function (){ var me = this;
me.connection = new Strophe.Connection(me.httpBindUrl); me.connection.attach( me.options.service.jid, me.options.service.sid, me.options.service.rid, function (status) { me.statusHandler(status); });};
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Books
Sunday 26 February 2012
Thank you
• Code: https://github.com/becoded/talk-xmpp-demo
• Slides: Slideshare
• Rate / comments: http://joind.in
Sunday 26 February 2012
Questions
? ? ? ?
Sunday 26 February 2012