Writing Portable WebSockets in Java
-
Upload
jfarcand -
Category
Technology
-
view
2.402 -
download
2
description
Transcript of Writing Portable WebSockets in Java
Writing Portable WebSocket in Java
Jeanfrancois Arcand
twitter.com/jfarcand
Pardon?
•Worked 10 years for Sun Microsystems
• Active Commiter on Tomcat 4/5
• Active Commiter GlassFish 1/2/3
• Glassfish v3 extensible container kernel
• Performance/Scalability
• Creator of the Grizzly NIO Framework
•Creator of the AHC (AsyncHttpClient) library
•Creator of Atmosphere
Atmosphere
Apache 2 Github ~470 « followers »
20 000 downloads per months
Client + serverSupported
~25 framework
s
Scala, Groovy,
JRuby, Java
1.0.0.beta3
Since 2008
Atmosphere
Apache 2 Github ~450 « followers »
20 000 downloads per months
Client + serverSupported
~25 framework
s
Scala, Groovy,
JRuby, Java
1.0.0.beta2
Since2008
EXTREMELY
ACTIVE !!!
Today’s Presentation
WebSocket
Today’s Presentation
WebSocket
Definition
Today’s Presentation
WebSocket
Free for all!!!
Definition
Today’s Presentation
WebSocket
Free for all!
C’est quoi
Atmosphere
Free for all!!!
Definition
Today’s Presentation
WebSocket
Free for all!
Definition
Atmosphere
Concepts
Today’s Presentation
WebSocket
Free for all!
C’est quoi
Atmosphere
DemoConcepts
Free for all!!!
Definition
is a web technology providing for bi-directional, full-duplex
communications channels over a single TCP connection. The WebSocket API is being
standardized by the W3C, and the WebSocket protocol has been
standardized by the IETF as RFC 6455
WebSockets
Before (Long-Polling)
Browser
Server
Request
Before (Long-Polling)
Browser
Request
Server
Before (Long-Polling)
Browser
Request
Response
Server
Oups!!
Browser
ServerNone
Request
Oups!
Browser
Request
Server
Zzzz
Better!
Browser
Server
Cache
Request
Better!
Request
Server
Cache
Response
Browser
Pushing the Protocol (HTTP Streaming)
Browser
Server
Request
Pushing the Protocol (HTTP Streaming)
Browser
Request
Server
Pushing the Protocol (HTTP Streaming)
Browser
Request
Response
Server
Pushing the Protocol (HTTP Streaming)
Browser
Request
Response
Response
Server
Oups!!
Browser
Request
Response
Response
Server
Hell!!!
Pushing the Protocol (HTTP Streaming)
Browser
Request
Response
Response
Server
Hell!!!
Hack
Oups!!!
Browser
Request
Response
Response
Server
Proxy
Better
Browser
Request
Response
Response
Server
Cache
Better
Browser
Request
Response
Response
Server
Cache« HeartBea
t »
Better: Server Side Events (SSE)
Browser
Request
Response
Response
Server
Oups!!!
Browser
Request
Response
Response
Server
Proxy
Better
Browser
Request
Response
Response
Server
Cache« HeartBea
t »
WebSockets
Browser
Server
Hanshake
WebSockets
Browser
Server
Hanshake
OK
WebSockets
Browser
Server
Request
WebSockets
Browser
Request
Server
WebSockets
Browser
Server
Response
WebSockets
Browser
Server
Request
WebSockets
Browser
Server
Request
Request
WebSockets
Browser
Request
Request
Server
WebSockets
Browser
Server
Response
Response
Anytime
Browser
Response
Server
Life is good, lalalalalala
Browser
Response
Server
Oups!!
Browser
Response
Server
Proxy
Better!
Browser
Response
Server
Cache
T 127.0.0.1:65062 -> 127.0.0.1:8080 [AP]
GET / HTTP/1.1.
Upgrade: websocket.
Connection: Upgrade.
Host: 127.0.0.1:8080.
Origin: http://127.0.0.1:8080.
Sec-WebSocket-Key: Tz9qdt3lmte6Slf+GvpRqQ==.
Sec-WebSocket-Version: 13.
Sec-WebSocket-Extensions: x-webkit-deflate-frame.
First Request
T 127.0.0.1:8080 -> 127.0.0.1:51292 [AP]
HTTP/1.1 101 Switching Protocols.
Upgrade: WebSocket.
Connection: Upgrade.
Sec-WebSocket-Accept: HVXA7SqH5uYeN6aD9tZ0JQbfTJA=.
Response
T 127.0.0.1:8080 -> 127.0.0.1:51292 [AP]
HTTP/1.1 101 Switching Protocols.
Upgrade: WebSocket.
Connection: Upgrade.
Sec-WebSocket-Accept: HVXA7SqH5uYeN6aD9tZ0JQbfTJA=.
Life is good, lalalalalala
T 127.0.0.1:8080 -> 127.0.0.1:65064 [AP]
HTTP/1.1 501 Not Implemented.
Server: Apache-Coyote/1.1.
X-Atmosphere-error: Websocket protocol not supported.
Transfer-Encoding: chunked.
Date: Fri, 15 Jun 2012 10:06:30 GMT.
Connection: close.
.
OUPS!!!
WebSocket API – Standard JavaScript
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) { …};
websocket.onclose = function(evt) { …};
websocket.onmessage = function(evt) { …};
websocket.onerror = function(evt) { …};
webSocket.send(…)
WebSocket API – Java
Jetty 7, GlassFish 3.1, Netty 3, Tomcat 7.0.27, Resin 4, JBoss Plugin
JSR 356: http://jcp.org/en/jsr/detail?id=356
AHC (Client -> De facto)
http://github.com/sonatype/async-http-client
Life is good, lalalalalala
OUPS!!!
Ready?
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Imdat!!
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Imdat!!
Streaming
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Imdat!!
Streaming
SSE
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Imdat!!
Streaming
SSE
JSONP
Free for all
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Imdat!!
Streaming
SSE
Long Polling
JSONP
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
Atmosphere to the
rescue!!!
Atmosphere -WebSockets
Tomcat7
Jetty7
Jetty8
GlassFish3.
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
atm
osp
here
.js
Atm
osp
here
API
Atmosphere - HTML5 Server Side Events
Tomcat7
Jetty7
Servlet3
WebLogic
GlassFish
312
Firefox
Safari
Opera
Chrome
IE
atm
osp
here
.js
Atm
osp
here
API
Atmosphere Long-Polling/HTTP Streaming
JBoss
Jetty7
Servlet3
WebLogic.
GlassFish
Firefox
Safari
Opera
Chrome
IE
atm
osp
here
.js
Atm
osp
here
API
Atmosphere
JBoss
Jetty7
Servlet3
WebLogic.
GlassFish
Firefox
Safari
Opera
Chrome
IE
atm
osp
here
.js
Atm
osp
here
API
Same API, transport
independent!!
Socket.IO, GWT, Wicket, JSF, etc.
JBoss
Jetty7
Servlet3
WebLogic.
GlassFish
Firefox
Safari
Opera
Chrome
IE
Sock
et.
IO
Atm
osp
here
API
PORTABLE!!!!!
JBoss
Jetty7
Servlet3
WebLogic.
GlassFish
Firefox
Safari
Opera
Chrome
IE
Sock
et.
IO
Atm
osp
here
API
PORTABLE
•Framework that support ONLY WebSockets
Going into Production?IMPOSSIBLE
Big Big Big Mistake
Atmosphere
•Suspend: open a channel
•Resume: close a channel
•Broadcast: push message to one or more channel
Definition
Components
Handler(s)
Atmosphere.js
Interceptor(s)
Components
Handler(s)
Atmosphere.js
Interceptor(s)
Javascript client
Components
Handler(s)
Atmosphere.js
Interceptor(s)
Intercepts/Filters
Components
Handler(s)
Atmosphere.js
Interceptor(s)
Applications Logic
Components
ServletHandler
Atmosphere.js
Interceptor(s)
Your Servlet
Components
ServletHandler
Atmosphere.js
Interceptor(s)
Your Servlet Based
Framework
Components
ServletHandler
Atmosphere.js
Interceptor(s)
Your Servletws
Components
ServletHandler
Atmosphere.js
Interceptor(s)
Your Servletwssse
Components
ServletHandler
Atmosphere.js
Interceptor(s)
Your Servletwsssehtt
p
Request
Browser
Browser
Browser
Server
Request
Browser
Browser
Browser
Server
Suspend
Browser
Browser
Browser
Server
Suspend
Browser
Browser
Browser
ServerS
Suspend
Browser
Browser
Browser
ServerS
Suspend
Browser
Browser
Browser
ServerS
Broadcast
Browser
Browser
Browser
SB
Server
Broadcast
Browser
Browser
Browser
SB
Server
Resume
Browser
Browser
Browser
B
Server
R
Resume
Browser
Browser
Browser
B
ServerS
•Default: in-memory
•Cloud
• RedisBroadcaster
• JMSBroadcaster
• XMPPBroadcaster
• HazelcastBroadcaster
• JGroupsBroascaster
•Multi-Threads, Async I/O par default
Broadcaster
Broadcaster Cloud
Browser
Browser
Browser S
Server
ServerS
Broadcaster Cloud
Browser
Browser
Browser S
Server
ServerS
Broadcaster Cloud
Browser
Browser
Browser S
B
Server
ServerS
Broadcaster Cloud
Browser
Browser
Browser
BServer
Server
Broadcaster Cloud
Browser
Browser
Browser Server
Server
B
Broadcaster Cloud
Browser
Browser
Browser Server
Server
•WebSocketHandler
• Only WebSocket (WARNING)!
•AtmosphereHandler
• All transport
•Jersey Resource
• All transport
•Meteor
• All transport
Atmosphere API
•WebSocketProtocolDefine your own websocket protocol
•SimpleHttpProtocolWebSocket’s message mapped to HTTP POST, avec read/write asynchrone.
•SwaggerSocket: REST over WebSockets -> Powerful Protocol
WebSocket Sub Protocol
Let’s have some fun
https://github.com/Atmosphere/atmosphere/blob/master/samples/
chat/src/main/webapp/jquery/application.js#L1
Single Client to Rule Them All
https://github.com/Atmosphere/atmosphere/blob/master/samples/websocket-chat/src/main/java/org/
atmosphere/samples/chat/WebSocketChat.java#L33
WebSocket
https://github.com/Atmosphere/atmosphere/blob/master/samples/
chat/src/main/java/org/atmosphere/samples/chat/
ChatAtmosphereHandler.java#L33
WebSocket, SSE, long-polling
https://github.com/Atmosphere/atmosphere/blob/master/samples/socketio-chat/src/main/java/org/
atmosphere/samples/chat/SocketIOChatAtmosphereHandler.jav
a#L34
Socket IO
https://github.com/Atmosphere/atmosphere/blob/master/samples/sse-
rest-chat/src/main/java/org/atmosphere/samples/chat/jersey/
ResourceChat.java#L32
Jersey
https://github.com/Atmosphere/atmosphere/blob/master/samples/
jaxrs2-chat/src/main/java/org/atmosphere/samples/chat/jaxrs2/
Jaxrs2Chat.java#L34
JAXRS 2
•REST over WebSocket
•JSON Based
•Simple
•Works with HTTP
•Multi-Request/Response
SwaggerSocket
Join the Revolution
It’s open source, it’s free to jumps in!!
Conclusion
twitter.com/jfarcand twitter.com/atmo_frameworktwitter.com/swaggersocket
http://github.com/Atmosphere/atmospherehttp://github.com/wordnik/
swaggersocket