SlideShare a Scribd company logo
Getting Started with
WebSocket and Server-Sent
Event in Java
Arun Gupta
Director, Developer Advocacy, Red Hat
blog.arungupta.me, @arungupta

1Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

Insert Picture Here
Program
Agenda

 WebSocket Primer
 Getting Started with WebSocket
 Server-Sent Event Primer
 Getting Started with Server-Sent Event
 Resources

2

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Interactive Web Sites
HTTP is half-duplex
HTTP is verbose
Hacks for Server Push
●
Polling
●

Long Polling

●

Comet/Ajax

Complex, Inefficient, Wasteful

3

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
WebSocket to the Rescue
TCP based, bi-directional, full-duplex messaging
Originally proposed as part of HTML5
IETF-defined Protocol: RFC 6455
●
Handshake
●

Data Transfer

W3C defined JavaScript API
Candidate Recommendation

4

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Establish a connection
Handshake Request

Client

Server
Handshake Response

5

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Handshake Request
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

6

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Handshake Response
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

7

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Establishing a Connection
Handshake Request

Client

Server
Handshake Response

Connected !

8

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
WebSocket Lifecycle

Connected !

open

Peer
(client)

open

message
message
message

message
error
message

close

Disconnected
9

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

Peer
(server)
WebSocket API
www.w3.org/TR/websockets/

10

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Browser Support

11

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

http://caniuse.com/websockets
12

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Java API for WebSocket Features
API for WebSocket Server/Client Endpoints
●
Annotated (@ServerEndpoint, @ClientEndpoint)
●

Programmatic (Endpoint)
●

WebSocket opening handshake negotiation

Lifecycle callback handlers
Packaging with Java EE applications

13

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Annotated Endpoint
import javax.websocket.*;
@ServerEndpoint("/hello")
public class HelloBean {
@OnMessage
public String sayHello(String name) {
return “Hello “ + name;
}
}

14

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Annotations
Annotation

Level

Purpose

@ServerEndpoint

class

Turns a POJO into a WebSocket Endpoint

@ClientEndpoint

class

POJO wants to act as client

@OnMessage
@PathParam

method

Intercepts WebSocket Message events

method
Flags a matched path segment of a URI-template
parameter

@OnOpen

Intercepts WebSocket Open events

@OnClose

method

Intercepts WebSocket Close events

@OnError
15

method

method

Intercepts errors during a conversation

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
@ServerEndpoint Attributes

value
decoders

list of message decoder classnames

encoders

list of message encoder classnames

subprotocols

16

Relative URI or URI template
e.g. “/hello” or “/chat/{subscriber-level}”

list of the names of the supported subprotocols

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Custom Payloads
@ServerEndpoint(
value="/hello",
encoders={MyMessage.class},
decoders={MyMessage.class}
)
public class MyEndpoint {
. . .
}

17

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Custom Payloads – Text
public class MyMessage implements Decoder.Text<MyMessage>, Encoder.Text<MyMessage> {
private JsonObject jsonObject;
public MyMessage decode(String s) {
jsonObject = Json.createReader(new StringReader(s)).readObject();
return this;
}
public boolean willDecode(String string) {
return true; // Only if can process the payload
}
public String encode(MyMessage myMessage) {
return myMessage.jsonObject.toString();
}
}

18

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Custom Payloads – Binary
public class MyMessage implements Decoder.Binary<MyMessage>, Encoder.Binary<MyMessage> {
public MyMessage decode(byte[] bytes) {
. . .
return this;
}
public boolean willDecode(byte[] bytes) {
. . .
return true; // Only if can process the payload
}
public byte[] encode(MyMessage myMessage) {
. . .
}
}

19

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Which methods can be @OnMessage ?
Exactly one of the following
● Text: String, Java primitive or equivalent class, String and boolean, Reader,
any type for which there is a decoder
● Binary: byte[], ByteBuffer, byte[] and boolean, ByteBuffer and boolean,
InptuStream, any type for which there is a decoder
● Pong messages: PongMessage
An optional Session parameter
0..n String parameters annotated with @PathParam
Return type: String, byte[], ByteBuffer, Java primitive or class equivalent or any
type for which there is a encoder

20

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Sample Messages
void m(String s);
void m(Float f, @PathParam(“id”)int id);
Product m(Reader reader, Session s);
void m(byte[] b); or void m(ByteBuffer b);
Book m(int i, Session s, @PathParam(“isbn”)String isbn,
@PathParam(“store”)String store);

21

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Chat Server
@ServerEndpoint("/chat")
public class ChatBean {
static Set<Session> peers = Collections.synchronizedSet(…);
@OnOpen
public void onOpen(Session peer) {
peers.add(peer);
}
@OnClose
public void onClose(Session peer) {
peers.remove(peer);
}
. . .

22

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Chat Server
. . .
@OnMessage
public void message(String message, Session client) {
for (Session peer : peers) {
peer.getBasicRemote().sendObject(message);
}
}
}

23

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
https://blogs.oracle.com/arungupta/entry/collaborative_whiteboard_using_websocket_in

24Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
WebSocket Client
@ClientEndpoint
public class HelloClient {
@OnMessage
public void message(String message, Session session) {
// process message from server
}
}
WebSocketContainer c = ContainerProvider.getWebSocketContainer();
c.connectToServer(HelloClient.class, “hello”);

25

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Programmatic Endpoint
public class MyEndpoint extends Endpoint {
@Override
public void onOpen(Session session) {
session.addMessageHandler(new MessageHandler.Text() {
public void onMessage(String name) {
try {
session.getBasicRemote().sendText(“Hello “ + name);
} catch (IOException ex) {
}
}
});
}
}

26

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
How to view WebSocket messages ?
Capture traffic on loopback

27

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
How to view WebSocket messages ?
chrome://net-internals -> Sockets -> View live sockets

28

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Server-Sent Events
Part of HTML5 Specification
Server-push notifications
Cross-browser JavaScript API: EventSource
Message callbacks
MIME type: text/eventstream

29

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
EventSource API
dev.w3.org/html5/eventsource/

30

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Server-Sent Events Example
Client-side

var url = ‘webresources/items/events’;
var source = new EventSource(url);
source.onmessage = function (event) {
console.log(event.data);
}
source.addEventListener(“size”, function(event) {
console.log(event.name + ‘ ‘ + event.data);
}

31

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Server-Sent Events Example
private final SseBroadcaster BROADCASTER = new SseBroadcaster();
@GET
@Path("events”)
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput fruitEvents() {
final EventOutput eventOutput = new EventOutput();
BROADCASTER.add(eventOutput);
return eventOutput;
}

32

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Server-Sent Events Example
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void addFruit(@FormParam("fruit")String fruit) {
FRUITS.add(fruit);
// Broadcasting an un-named event with the name of the newly added item in data
BROADCASTER.broadcast(new OutboundEvent.Builder().data(String.class,
fruit).build());
// Broadcasting a named "add" event with the current size of the items collection in
data
BROADCASTER.broadcast(new OutboundEvent.Builder().name("size").data(Integer.class,
FRUITS.size()).build());
}

33

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
WebSocket and Server-Sent Event
Competing technologies ?

WebSocket
Over a custom protocol

Over simple HTTP

Full Duplex, Bi-directional

Server-Push Only, Client->Server
is out-of-band (higher latency)

Native support in most browsers

Can be poly-filled to backport

Not straight forward protocol

34

Server-Sent Event

Simpler protocol

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
WebSocket and Server-Sent Event
Competing technologies ?

WebSocket
Pre-defined message handlers

Arbitrary events

Application-specific

Built-in support for re-connection
and event id

Require server and/or proxy
configurations

No server or proxy changes
required

ArrayBuffer and Blob

35

Server-Sent Event

No support for binary types

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

More Related Content

PDF
Getting Started with WebSocket and Server-Sent Events in Java
PDF
Getting Started with WebSocket and Server-Sent Events using Java by Arun Gupta
PDF
Getting started with Websocket and Server-sent Events using Java - Arun Gupta
ODP
Server Sent Events, Async Servlet, Web Sockets and JSON; born to work together!
KEY
The HTML5 WebSocket API
PDF
Server-Side Programming Primer
PPTX
WebSockets in JEE 7
PPTX
HTML5 WebSocket Introduction
Getting Started with WebSocket and Server-Sent Events in Java
Getting Started with WebSocket and Server-Sent Events using Java by Arun Gupta
Getting started with Websocket and Server-sent Events using Java - Arun Gupta
Server Sent Events, Async Servlet, Web Sockets and JSON; born to work together!
The HTML5 WebSocket API
Server-Side Programming Primer
WebSockets in JEE 7
HTML5 WebSocket Introduction

What's hot (19)

PDF
Realtime web application with java
PDF
Grizzly 20080925 V2
PPTX
vlavrynovych - WebSockets Presentation
PPT
HTML5 WebSocket: The New Network Stack for the Web
PPTX
Android and REST
PPTX
Play + scala + reactive mongo
PDF
WebSockets wiith Scala and Play! Framework
PPS
J web socket
PDF
HTML5 Server Sent Events/JSF JAX 2011 Conference
PPTX
Connection Pooling
ODP
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
PDF
WebSockets with Spring 4
PPTX
The Full Power of ASP.NET Web API
PDF
Service-Oriented Integration With Apache ServiceMix
PDF
Jetty Continuation - 이상민
PDF
JAX-RS 2.1 Reloaded @ Devoxx
PPTX
Java Servlets
PPTX
Servletarchitecture,lifecycle,get,post
PPT
An Introduction to Apache ServiceMix 4 - FUSE ESB
Realtime web application with java
Grizzly 20080925 V2
vlavrynovych - WebSockets Presentation
HTML5 WebSocket: The New Network Stack for the Web
Android and REST
Play + scala + reactive mongo
WebSockets wiith Scala and Play! Framework
J web socket
HTML5 Server Sent Events/JSF JAX 2011 Conference
Connection Pooling
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
WebSockets with Spring 4
The Full Power of ASP.NET Web API
Service-Oriented Integration With Apache ServiceMix
Jetty Continuation - 이상민
JAX-RS 2.1 Reloaded @ Devoxx
Java Servlets
Servletarchitecture,lifecycle,get,post
An Introduction to Apache ServiceMix 4 - FUSE ESB
Ad

Similar to Getting Started with WebSockets and Server-Sent Events (20)

PDF
Java API for WebSocket 1.0: Java EE 7 and GlassFish
PDF
WebSockets - Realtime em Mundo Conectado
PPTX
Enhancing Mobile User Experience with WebSocket
PPT
PPT
JUG louvain websockets
PDF
WebSocket in Enterprise Applications 2015
PDF
Web sockets in java EE 7 - JavaOne 2013
PPTX
Client server chat application
PDF
WebSockets: The Current State of the Most Valuable HTML5 API for Java Developers
PDF
Lecture 6 Web Sockets
PDF
WebSockets in Enterprise Applications
PDF
What's next for Java API for WebSocket (JSR 356)
PDF
Building Next Generation Real-Time Web Applications using Websockets
PDF
WebSocket Push Fallback - Transcript.pdf
PPTX
Fight empire-html5
PDF
WebSocket
PDF
WebSocket Perspectives and Vision for the Future
PPTX
Asynchronous Web Programming with HTML5 WebSockets and Java
PDF
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
PPS
WebSockets - Boosting Web Communication - SDC 2011
Java API for WebSocket 1.0: Java EE 7 and GlassFish
WebSockets - Realtime em Mundo Conectado
Enhancing Mobile User Experience with WebSocket
JUG louvain websockets
WebSocket in Enterprise Applications 2015
Web sockets in java EE 7 - JavaOne 2013
Client server chat application
WebSockets: The Current State of the Most Valuable HTML5 API for Java Developers
Lecture 6 Web Sockets
WebSockets in Enterprise Applications
What's next for Java API for WebSocket (JSR 356)
Building Next Generation Real-Time Web Applications using Websockets
WebSocket Push Fallback - Transcript.pdf
Fight empire-html5
WebSocket
WebSocket Perspectives and Vision for the Future
Asynchronous Web Programming with HTML5 WebSockets and Java
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
WebSockets - Boosting Web Communication - SDC 2011
Ad

More from Arun Gupta (20)

PDF
5 Skills To Force Multiply Technical Talents.pdf
PPTX
Machine Learning using Kubernetes - AI Conclave 2019
PDF
Machine Learning using Kubeflow and Kubernetes
PPTX
Secure and Fast microVM for Serverless Computing using Firecracker
PPTX
Building Java in the Open - j.Day at OSCON 2019
PPTX
Why Amazon Cares about Open Source
PDF
Machine learning using Kubernetes
PDF
Building Cloud Native Applications
PDF
Chaos Engineering with Kubernetes
PDF
How to be a mentor to bring more girls to STEAM
PDF
Java in a World of Containers - DockerCon 2018
PPTX
The Serverless Tidal Wave - SwampUP 2018 Keynote
PDF
Introduction to Amazon EKS - KubeCon 2018
PDF
Mastering Kubernetes on AWS - Tel Aviv Summit
PDF
Top 10 Technology Trends Changing Developer's Landscape
PDF
Container Landscape in 2017
PDF
Java EE and NoSQL using JBoss EAP 7 and OpenShift
PDF
Docker, Kubernetes, and Mesos recipes for Java developers
PDF
Thanks Managers!
PDF
Migrate your traditional VM-based Clusters to Containers
5 Skills To Force Multiply Technical Talents.pdf
Machine Learning using Kubernetes - AI Conclave 2019
Machine Learning using Kubeflow and Kubernetes
Secure and Fast microVM for Serverless Computing using Firecracker
Building Java in the Open - j.Day at OSCON 2019
Why Amazon Cares about Open Source
Machine learning using Kubernetes
Building Cloud Native Applications
Chaos Engineering with Kubernetes
How to be a mentor to bring more girls to STEAM
Java in a World of Containers - DockerCon 2018
The Serverless Tidal Wave - SwampUP 2018 Keynote
Introduction to Amazon EKS - KubeCon 2018
Mastering Kubernetes on AWS - Tel Aviv Summit
Top 10 Technology Trends Changing Developer's Landscape
Container Landscape in 2017
Java EE and NoSQL using JBoss EAP 7 and OpenShift
Docker, Kubernetes, and Mesos recipes for Java developers
Thanks Managers!
Migrate your traditional VM-based Clusters to Containers

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Machine learning based COVID-19 study performance prediction
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Cloud computing and distributed systems.
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Approach and Philosophy of On baking technology
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
cuic standard and advanced reporting.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
20250228 LYD VKU AI Blended-Learning.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Machine learning based COVID-19 study performance prediction
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Cloud computing and distributed systems.
Reach Out and Touch Someone: Haptics and Empathic Computing
The AUB Centre for AI in Media Proposal.docx
Understanding_Digital_Forensics_Presentation.pptx
MYSQL Presentation for SQL database connectivity
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Approach and Philosophy of On baking technology
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Programs and apps: productivity, graphics, security and other tools
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
cuic standard and advanced reporting.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf

Getting Started with WebSockets and Server-Sent Events

  • 1. Getting Started with WebSocket and Server-Sent Event in Java Arun Gupta Director, Developer Advocacy, Red Hat blog.arungupta.me, @arungupta 1Copyright © 2013, Oracle and/or its affiliates. All rights reserved. Insert Picture Here
  • 2. Program Agenda  WebSocket Primer  Getting Started with WebSocket  Server-Sent Event Primer  Getting Started with Server-Sent Event  Resources 2 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 3. Interactive Web Sites HTTP is half-duplex HTTP is verbose Hacks for Server Push ● Polling ● Long Polling ● Comet/Ajax Complex, Inefficient, Wasteful 3 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 4. WebSocket to the Rescue TCP based, bi-directional, full-duplex messaging Originally proposed as part of HTML5 IETF-defined Protocol: RFC 6455 ● Handshake ● Data Transfer W3C defined JavaScript API Candidate Recommendation 4 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 5. Establish a connection Handshake Request Client Server Handshake Response 5 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 6. Handshake Request GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 6 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 7. Handshake Response HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat 7 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 8. Establishing a Connection Handshake Request Client Server Handshake Response Connected ! 8 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 10. WebSocket API www.w3.org/TR/websockets/ 10 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 11. Browser Support 11 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. http://caniuse.com/websockets
  • 12. 12 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 13. Java API for WebSocket Features API for WebSocket Server/Client Endpoints ● Annotated (@ServerEndpoint, @ClientEndpoint) ● Programmatic (Endpoint) ● WebSocket opening handshake negotiation Lifecycle callback handlers Packaging with Java EE applications 13 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 14. Annotated Endpoint import javax.websocket.*; @ServerEndpoint("/hello") public class HelloBean { @OnMessage public String sayHello(String name) { return “Hello “ + name; } } 14 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 15. Annotations Annotation Level Purpose @ServerEndpoint class Turns a POJO into a WebSocket Endpoint @ClientEndpoint class POJO wants to act as client @OnMessage @PathParam method Intercepts WebSocket Message events method Flags a matched path segment of a URI-template parameter @OnOpen Intercepts WebSocket Open events @OnClose method Intercepts WebSocket Close events @OnError 15 method method Intercepts errors during a conversation Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 16. @ServerEndpoint Attributes value decoders list of message decoder classnames encoders list of message encoder classnames subprotocols 16 Relative URI or URI template e.g. “/hello” or “/chat/{subscriber-level}” list of the names of the supported subprotocols Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 17. Custom Payloads @ServerEndpoint( value="/hello", encoders={MyMessage.class}, decoders={MyMessage.class} ) public class MyEndpoint { . . . } 17 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 18. Custom Payloads – Text public class MyMessage implements Decoder.Text<MyMessage>, Encoder.Text<MyMessage> { private JsonObject jsonObject; public MyMessage decode(String s) { jsonObject = Json.createReader(new StringReader(s)).readObject(); return this; } public boolean willDecode(String string) { return true; // Only if can process the payload } public String encode(MyMessage myMessage) { return myMessage.jsonObject.toString(); } } 18 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 19. Custom Payloads – Binary public class MyMessage implements Decoder.Binary<MyMessage>, Encoder.Binary<MyMessage> { public MyMessage decode(byte[] bytes) { . . . return this; } public boolean willDecode(byte[] bytes) { . . . return true; // Only if can process the payload } public byte[] encode(MyMessage myMessage) { . . . } } 19 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 20. Which methods can be @OnMessage ? Exactly one of the following ● Text: String, Java primitive or equivalent class, String and boolean, Reader, any type for which there is a decoder ● Binary: byte[], ByteBuffer, byte[] and boolean, ByteBuffer and boolean, InptuStream, any type for which there is a decoder ● Pong messages: PongMessage An optional Session parameter 0..n String parameters annotated with @PathParam Return type: String, byte[], ByteBuffer, Java primitive or class equivalent or any type for which there is a encoder 20 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 21. Sample Messages void m(String s); void m(Float f, @PathParam(“id”)int id); Product m(Reader reader, Session s); void m(byte[] b); or void m(ByteBuffer b); Book m(int i, Session s, @PathParam(“isbn”)String isbn, @PathParam(“store”)String store); 21 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 22. Chat Server @ServerEndpoint("/chat") public class ChatBean { static Set<Session> peers = Collections.synchronizedSet(…); @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } . . . 22 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 23. Chat Server . . . @OnMessage public void message(String message, Session client) { for (Session peer : peers) { peer.getBasicRemote().sendObject(message); } } } 23 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 25. WebSocket Client @ClientEndpoint public class HelloClient { @OnMessage public void message(String message, Session session) { // process message from server } } WebSocketContainer c = ContainerProvider.getWebSocketContainer(); c.connectToServer(HelloClient.class, “hello”); 25 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 26. Programmatic Endpoint public class MyEndpoint extends Endpoint { @Override public void onOpen(Session session) { session.addMessageHandler(new MessageHandler.Text() { public void onMessage(String name) { try { session.getBasicRemote().sendText(“Hello “ + name); } catch (IOException ex) { } } }); } } 26 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 27. How to view WebSocket messages ? Capture traffic on loopback 27 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 28. How to view WebSocket messages ? chrome://net-internals -> Sockets -> View live sockets 28 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 29. Server-Sent Events Part of HTML5 Specification Server-push notifications Cross-browser JavaScript API: EventSource Message callbacks MIME type: text/eventstream 29 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 30. EventSource API dev.w3.org/html5/eventsource/ 30 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 31. Server-Sent Events Example Client-side var url = ‘webresources/items/events’; var source = new EventSource(url); source.onmessage = function (event) { console.log(event.data); } source.addEventListener(“size”, function(event) { console.log(event.name + ‘ ‘ + event.data); } 31 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 32. Server-Sent Events Example private final SseBroadcaster BROADCASTER = new SseBroadcaster(); @GET @Path("events”) @Produces(SseFeature.SERVER_SENT_EVENTS) public EventOutput fruitEvents() { final EventOutput eventOutput = new EventOutput(); BROADCASTER.add(eventOutput); return eventOutput; } 32 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 33. Server-Sent Events Example @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void addFruit(@FormParam("fruit")String fruit) { FRUITS.add(fruit); // Broadcasting an un-named event with the name of the newly added item in data BROADCASTER.broadcast(new OutboundEvent.Builder().data(String.class, fruit).build()); // Broadcasting a named "add" event with the current size of the items collection in data BROADCASTER.broadcast(new OutboundEvent.Builder().name("size").data(Integer.class, FRUITS.size()).build()); } 33 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 34. WebSocket and Server-Sent Event Competing technologies ? WebSocket Over a custom protocol Over simple HTTP Full Duplex, Bi-directional Server-Push Only, Client->Server is out-of-band (higher latency) Native support in most browsers Can be poly-filled to backport Not straight forward protocol 34 Server-Sent Event Simpler protocol Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 35. WebSocket and Server-Sent Event Competing technologies ? WebSocket Pre-defined message handlers Arbitrary events Application-specific Built-in support for re-connection and event id Require server and/or proxy configurations No server or proxy changes required ArrayBuffer and Blob 35 Server-Sent Event No support for binary types Copyright © 2013, Oracle and/or its affiliates. All rights reserved.