Real Time applications with
WebSockets / WorkShop
Sergi Almar i graupera
@sergialmar

Romanian mobile systems community conference (mobos)
November 2013 - cluj Napoca
Agenda
•

Part 1 - Architecture and Dependency Injection with Android

•

Part 2 - Building the Server in Node.js and Socket.io

•

Part 3 - Building the Android client
Collaborative Apps
Multiplayer Games
Multimedia Chat
Social Feeds
Sports Updates
Financial Tickets
Clickstream Data
Online Education
Location-based Apps
Real-time data on the web
•

Polling

•

Long polling / Comet

•

Flash
Problem

Applications need two-way communication
Too many connections and overhead with ajax / comet
WebSockets
two-way real time communication
WebSockets
•

Real-time full duplex communication over TCP

•

Uses port 80 / 443 (URL scheme: ws:// and wss://)

•

Small overhead for text messages (frames)
•

•

0x00 for frame start, 0xFF for frame end (vs HTTP 1K)

Ping / pong frames for staying alive
WebSocket Handshake
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

client sends a WebSocket handshake request
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

server response
WebSocket API
var ws = new WebSocket('ws://www.romobos.com/ws');

!

// When the connection is open, send some data to the server
ws.onopen = function () {
ws.send('Ping'); // Send the message 'Ping' to the server
};

!

// Log errors
ws.onerror = function (error) {
ws.log('WebSocket Error ' + error);
};

!

// Log messages from the server
ws.onmessage = function (e) {
ws.log('Server: ' + e.data);
};
What we are gonna build
(real-time chat app)
websoc

kets

w

ckets
ebso
Dependency Injection
decouple components, flexible code, reduce
boilerplate, testable code
Dependency Injection in Android
•

RoboGuice

•

Dagger

•

Transfuse

•

Android annotations
RoboGuice
•

Dependency Injection framework

•

Uses Google Guice as the backbone

•

Supports JSR-330
Extending from RoboGuice
•

RoboActivity

•

RoboListActivity

•

RoboMapActivity

•

RoboPreferenceActivity

•

RoboFragmentActivity

•

RoboFragment

•

RoboService

•

…
Injecting Views
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
/>

@InjectView(R.id.text1) TextView mSampleText;
Injecting Resources
@InjectResource(R.anim.my_animation) Animation myAnimation;

!
@InjectResource(R.drawable.icon)
!

Drawable icon;

@InjectResource(R.string.app_name) String myName;
Injection POJOs
@Singleton
public class MyPojo {
private String myField;

!

public void myMethod() {
...
}

}

@Inject private MyPojo myPojo;
Custom Binding
public class MyModule implements Module {
@Override
public void configure(Binder binder) {
binder.bind(IFoo.class).to(SimpleFoo.class);
}
}

define a module
public class App extends Application {

!
!

@Override
public void onCreate() {
super.onCreate();

RoboGuice.setBaseApplicationInjector(this,
RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this),
new MyModule());
}
}

let RoboGuice know about it
Traditional Approach
class AndroidWay extends Activity {
TextView name;
ImageView thumbnail;
LocationManager loc;
Drawable icon;
String myName;

!

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
name
= (TextView) findViewById(R.id.name);
thumbnail = (ImageView) findViewById(R.id.thumbnail);
loc
= (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
icon
= getResources().getDrawable(R.drawable.icon);
myName
= getString(R.string.app_name);
name.setText( "Hello, " + myName );
}
}
RoboGuice Approach
@ContentView(R.layout.main)
class RoboWay extends RoboActivity {
@InjectView(R.id.name)
@InjectView(R.id.thumbnail)
@InjectResource(R.drawable.icon)
@InjectResource(R.string.app_name)
@Inject

!

TextView name;
ImageView thumbnail;
Drawable icon;
String myName;
LocationManager loc;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
name.setText( "Hello, " + myName );
}
}
Lab I
https://github.com/salmar/android-websocketsmobos2013/wiki
Part II
Building the Server with NodeJS
and Socket.io
Node.js
event driven, non-blocking server
side JS
Google V8 Engine
•

Open source JS engine by Google (used in Google
Chrome)

•

No JIT, all JS compiled to assembler

•

Optimisations like inlining, elision of runtime
properties…

•

Improved garbage collector
CommonJS
•

Set of specifications for JS outside the browser

•

Node.js implements some specifications
•

i.e modules
•

There should be a function called require

•

There should be a var called exports
Modules
•

Node.js provides some core modules like http, tcp, fs, sys…
•

will look for the module in the node_modules dir
hierarchically

•

if not found, will look in the paths outlined in
NODE_PATH

var http = require('http');
Module Example
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};

module definition in myModule.js

var myModule = require('./myModule.js');

include myModule.js in some other file
Dependency Management
Node packet manager (npm)
express (routing), socket.io (websockets)…
Sergis-MacBook-Air:tmp salmar$ npm install express
npm http GET https://registry.npmjs.org/express
npm http 200 https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/express/-/express-3.4.4.tgz
npm http 200 https://registry.npmjs.org/express/-/express-3.4.4.tgz
npm http GET https://registry.npmjs.org/connect/2.11.0
npm http GET https://registry.npmjs.org/commander/1.3.2
npm http GET https://registry.npmjs.org/methods/0.1.0
npm http GET https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/mkdirp/0.3.5
npm http GET https://registry.npmjs.org/cookie/0.1.0
npm http GET https://registry.npmjs.org/buffer-crc32/0.2.1
npm http GET https://registry.npmjs.org/fresh/0.2.0
npm http GET https://registry.npmjs.org/cookie-signature/1.0.1
npm http GET https://registry.npmjs.org/send/0.1.4
npm http GET https://registry.npmjs.org/debug
npm http 200 https://registry.npmjs.org/methods/0.1.0
npm http 304 https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/methods/-/methods-0.1.0.tgz
npm http 200 https://registry.npmjs.org/commander/1.3.2
npm http GET https://registry.npmjs.org/commander/-/commander-1.3.2.tgz
npm http 304 https://registry.npmjs.org/cookie/0.1.0
…

!

express@3.4.4 node_modules/express
├── methods@0.1.0
├── range-parser@0.0.4
├── cookie-signature@1.0.1
├── fresh@0.2.0
├── debug@0.7.4
├── buffer-crc32@0.2.1
├── cookie@0.1.0
├── mkdirp@0.3.5
├── commander@1.3.2 (keypress@0.1.0)
├── send@0.1.4 (mime@1.2.11)
└── connect@2.11.0 (methods@0.0.1, uid2@0.0.3, pause@0.0.1, qs@0.6.5, raw-body@0.0.3, bytes@0.2.1, negotiator@0.3.0,
package.json
{
"name": "Mobos Chat",
"version": "1.0.0",
"description": "Real time chat",
"author": "salmar",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"socket.io": "latest",
"express": "latest",
"jade": "latest"
}
}

npm install
Web Server in NodeJS
var http = require('http');

!

http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');

!

console.log('Server running at http://127.0.0.1:1337/');
Running the app
Sergis-MacBook-Air:tmp salmar$ node app.js
Server running at http://127.0.0.1:1337/
Express.js
sinatra inspired web framework for node.js
Express.js
var express = require('express');
var app = express();

!

app.get('/', function(req, res){
res.send('Hello World');
});

!

app.listen(3000);
Socket.io

abstraction layer for WebSockets
http://caniuse.com/#feat=websockets / Nov 2013
Socket.io
•

Abstraction layer for WebSockets

•

Fallback to:
•

Flash socket

•

AJAX Long-polling

•

AJAX multi-part streaming

•

JSONP polling

•

iFrame
Handling Events
io.sockets.on('connection', function(socket) {});

initial connection from client
socket.on('message', function(message) {})

message handler triggered when message is received
socket.on('disconnect', function() {})

triggered when socket disconnects
socket.on('custom_event', function(data) {})

event handler for custom event
Sending messages
socket.send(JSON.stringify({user:'sergi',
message: 'Welcome to Mobos'})
);

sends a message to the connected client
socket.broadcast.send(JSON.stringify({user:’sergi',
message: 'Welcome to Mobos'})
);

sends a message to all clients except the owner of the socket
Emitting Events
socket.emit('user:join', {name: 'sergi'});

triggers a custom event

socket.broadcast.emit('user:joined', data);

sends a message to all clients except the owner of the socket
Attach information to the socket

socket.set('nickname', data.name, <optional_callback>);
Lab II
https://github.com/salmar/android-websocketsmobos2013/wiki
Part III
Building the Android client with
Socket.io
Otto
enhanced event bus with emphasis on Android support
publish

subscribe

Activity
Activity

Activity
FRAGMENT
SERVICE
POJO

bus

Activity
FRAGMENT
Otto
•

Forked from Guava’s EventBus

•

Lightweight - 19k

•

Fast, optimised for Android
Publishing
Bus bus = new Bus();

creates the bus (better use dependency injection)

bus.post(new ServerMessage("This is awesome"));

publish the message
synchronous delivery
Subscribing
@Subscribe
public void receiveMessage(ServerMessage serverMessage) {
// TODO: React to the event somehow!
}
Otto API
•

register(), unregister(), post()

•

@Subscribe, @Produce

•

Thread confinement

•

Easy to test
SocketIO for Android
•

There’s no official library, but there are community
libraries, sometimes buggy :(
•

•

https://github.com/fatshotty/socket.io-java-client

Server-like API
Callbacks
!
!
!
!
!

public void onMessage(JsonElement json, IOAcknowledge ack) {
}
public void onMessage(String data, IOAcknowledge ack) {
}
public void onError(SocketIOException socketIOException) {
}
public void onDisconnect() {
}
public void onConnect() {
}
public void on(String event, IOAcknowledge ack, JsonElement... args) {
}
Lab III
https://github.com/salmar/android-websocketsmobos2013/wiki
Thank you!
@sergialmar

More Related Content

PDF
Why everyone is excited about Docker (and you should too...) - Carlo Bonamic...
PPTX
Json Web Token - JWT
PPTX
Python and EM CLI: The Enterprise Management Super Tools
ODP
Apache Kafka Demo
PPT
Logical Attacks(Vulnerability Research)
PPTX
Quartz Scheduler
PPTX
AngularJS Architecture
PDF
Performance Testing using Real Browsers with JMeter & Webdriver
Why everyone is excited about Docker (and you should too...) - Carlo Bonamic...
Json Web Token - JWT
Python and EM CLI: The Enterprise Management Super Tools
Apache Kafka Demo
Logical Attacks(Vulnerability Research)
Quartz Scheduler
AngularJS Architecture
Performance Testing using Real Browsers with JMeter & Webdriver

What's hot (15)

PPTX
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
PPTX
Introduction to asp.net
PDF
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
PDF
Delta Architecture
PDF
Monitoring microservices with Prometheus
PPTX
Kubernetes best practices with GKE
PDF
Java11 New Features
PPTX
Introduction to RxJS
PDF
The Patterns of Distributed Logging and Containers
PPTX
Learn to pen-test with OWASP ZAP
PDF
Angular & RXJS: examples and use cases
PPTX
SSRF For Bug Bounties
PDF
BugBounty Tips.pdf
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
PDF
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
Introduction to asp.net
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Delta Architecture
Monitoring microservices with Prometheus
Kubernetes best practices with GKE
Java11 New Features
Introduction to RxJS
The Patterns of Distributed Logging and Containers
Learn to pen-test with OWASP ZAP
Angular & RXJS: examples and use cases
SSRF For Bug Bounties
BugBounty Tips.pdf
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
Ad

Viewers also liked (9)

PPTX
Uber's new mobile architecture
PDF
Open-source Infrastructure at Lyft
PDF
Just Add Reality: Managing Logistics with the Uber Developer Platform
PDF
"Building Data Foundations and Analytics Tools Across The Product" by Crystal...
PDF
Taxi Startup Presentation for Taxi Company
PPTX
Kafka + Uber- The World’s Realtime Transit Infrastructure, Aaron Schildkrout
PDF
Geospatial Indexing at Scale: The 15 Million QPS Redis Architecture Powering ...
PDF
31 - IDNOG03 - Bergas Bimo Branarto (GOJEK) - Scaling Gojek
PPTX
Cassandra on Mesos Across Multiple Datacenters at Uber (Abhishek Verma) | C* ...
Uber's new mobile architecture
Open-source Infrastructure at Lyft
Just Add Reality: Managing Logistics with the Uber Developer Platform
"Building Data Foundations and Analytics Tools Across The Product" by Crystal...
Taxi Startup Presentation for Taxi Company
Kafka + Uber- The World’s Realtime Transit Infrastructure, Aaron Schildkrout
Geospatial Indexing at Scale: The 15 Million QPS Redis Architecture Powering ...
31 - IDNOG03 - Bergas Bimo Branarto (GOJEK) - Scaling Gojek
Cassandra on Mesos Across Multiple Datacenters at Uber (Abhishek Verma) | C* ...
Ad

Similar to Building Real-Time Applications with Android and WebSockets (20)

PPTX
HTML5 on Mobile
PDF
Analyzing the Performance of Mobile Web
PDF
[convergese] Adaptive Images in Responsive Web Design
PDF
[refreshaustin] Adaptive Images in Responsive Web Design
PPTX
Drive chrome(headless) with puppeteer
PPT
Mobile webapplication development
PDF
soft-shake.ch - Hands on Node.js
PPT
Naive application development
PPTX
Real World Lessons on the Pain Points of Node.JS Application
PDF
Whatever it takes - Fixing SQLIA and XSS in the process
PDF
[cssdevconf] Adaptive Images in RWD
PDF
[rwdsummit2012] Adaptive Images in Responsive Web Design
PDF
Scripting GeoServer
PDF
PDF
Cross Domain Web
Mashups with JQuery and Google App Engine
PDF
[html5tx] Adaptive Images in Responsive Web Design
PDF
Web Standards Support in WebKit
PDF
Persistent mobile JavaScript
PDF
Nodejs and WebSockets
PDF
Gmaps Railscamp2008
HTML5 on Mobile
Analyzing the Performance of Mobile Web
[convergese] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design
Drive chrome(headless) with puppeteer
Mobile webapplication development
soft-shake.ch - Hands on Node.js
Naive application development
Real World Lessons on the Pain Points of Node.JS Application
Whatever it takes - Fixing SQLIA and XSS in the process
[cssdevconf] Adaptive Images in RWD
[rwdsummit2012] Adaptive Images in Responsive Web Design
Scripting GeoServer
Cross Domain Web
Mashups with JQuery and Google App Engine
[html5tx] Adaptive Images in Responsive Web Design
Web Standards Support in WebKit
Persistent mobile JavaScript
Nodejs and WebSockets
Gmaps Railscamp2008

Recently uploaded (20)

PDF
CCUS-as-the-Missing-Link-to-Net-Zero_AksCurious.pdf
PDF
Peak of Data & AI Encore: Scalable Design & Infrastructure
PPTX
Slides World Game (s) Great Redesign Eco Economic Epochs.pptx
PDF
TicketRoot: Event Tech Solutions Deck 2025
PPTX
Strategic Picks — Prioritising the Right Agentic Use Cases [2/6]
PDF
Rooftops detection with YOLOv8 from aerial imagery and a brief review on roof...
PDF
Ebook - The Future of AI A Comprehensive Guide.pdf
PDF
Altius execution marketplace concept.pdf
PDF
Advancements in abstractive text summarization: a deep learning approach
PDF
Addressing the challenges of harmonizing law and artificial intelligence tech...
PPTX
From XAI to XEE through Influence and Provenance.Controlling model fairness o...
PDF
State of AI in Business 2025 - MIT NANDA
PDF
【AI論文解説】高速・高品質な生成を実現するFlow Map Models(Part 1~3)
PDF
Intravenous drug administration application for pediatric patients via augmen...
PDF
Decision Optimization - From Theory to Practice
PPTX
maintenance powerrpoint for adaprive and preventive
PDF
Revolutionizing recommendations a survey: a comprehensive exploration of mode...
PDF
Be ready for tomorrow’s needs with a longer-lasting, higher-performing PC
PDF
eBook Outline_ AI in Cybersecurity – The Future of Digital Defense.pdf
PDF
Slides World Game (s) Great Redesign Eco Economic Epochs.pdf
CCUS-as-the-Missing-Link-to-Net-Zero_AksCurious.pdf
Peak of Data & AI Encore: Scalable Design & Infrastructure
Slides World Game (s) Great Redesign Eco Economic Epochs.pptx
TicketRoot: Event Tech Solutions Deck 2025
Strategic Picks — Prioritising the Right Agentic Use Cases [2/6]
Rooftops detection with YOLOv8 from aerial imagery and a brief review on roof...
Ebook - The Future of AI A Comprehensive Guide.pdf
Altius execution marketplace concept.pdf
Advancements in abstractive text summarization: a deep learning approach
Addressing the challenges of harmonizing law and artificial intelligence tech...
From XAI to XEE through Influence and Provenance.Controlling model fairness o...
State of AI in Business 2025 - MIT NANDA
【AI論文解説】高速・高品質な生成を実現するFlow Map Models(Part 1~3)
Intravenous drug administration application for pediatric patients via augmen...
Decision Optimization - From Theory to Practice
maintenance powerrpoint for adaprive and preventive
Revolutionizing recommendations a survey: a comprehensive exploration of mode...
Be ready for tomorrow’s needs with a longer-lasting, higher-performing PC
eBook Outline_ AI in Cybersecurity – The Future of Digital Defense.pdf
Slides World Game (s) Great Redesign Eco Economic Epochs.pdf

Building Real-Time Applications with Android and WebSockets