SlideShare a Scribd company logo
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 »
                               Client +
 Supported                     server
    ~25
frameworks                     Scala, Groovy,
                                JRuby, Java
 Since 2008
                20 000 downloads per
                       months
1.0.0.beta3
Atmosphere

 Apache 2      Github ~450
               « followers »
                               Client +
 Supported    EXTREMEL
                               server
    ~25        Y ACTIVE
frameworks        !!!          Scala, Groovy,
                                JRuby, Java
 Since2008
                20 000 downloads per
                       months
1.0.0.beta2
Today’s Presentation
     WebSocket
Today’s Presentation
             WebSocket

Definition
Today’s Presentation
             WebSocket

Definition               Free for
                           all!!!
Today’s Presentation
             WebSocket

C’est quoi
Definition               Free for
                         Free for
                           all!!!
                            all!

             Atmospher
                 e
Today’s Presentation
                WebSocket

   Definition               Free for
                              all!

                Atmospher
                    e
Concepts
Today’s Presentation
                WebSocket

   C’est quoi
   Definition               Free for
                              all!!!
                              all!

                Atmospher
                    e
Concepts                    Demo
WebSockets

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
Before (Long-Polling)

           Request


Browse                       Server
   r
Before (Long-Polling)

           Request


Browse                       Server
   r
Before (Long-Polling)

           Request


Browse                       Server
   r
          Response
Oups!!


         Request

Browse        None   Server
   r
Oups!

         Request


Browse             Server
   r
                   Zzzz
Better!


         Request

Browse                  Server
   r

                      Cache
Better!

         Request


Browse               Server
   r

                   Cache
Pushing the Protocol (HTTP
          Streaming)
           Request


Browse                   Server
   r
Pushing the Protocol (HTTP
          Streaming)
           Request


Browse                   Server
   r
Pushing the Protocol (HTTP
          Streaming)
           Request


Browse                   Server
   r
          Response
Pushing the Protocol (HTTP
          Streaming)
           Request


Browse                   Server
   r
          Response

          Response
Oups!!

            Request


Browse                 Server
   r
  Hell!!!   Response

            Response
Pushing the Protocol (HTTP
           Streaming)
            Request


Browse                    Server
   r
  Hell!!!
   Hack     Response

            Response
Oups!!!

         Request


Browse              Server
   r
         Response
            Proxy
         Response
Better

         Request


Browse                Server
   r
         Response Cache

         Response
Better

          Request


Browse                 Server
   r
         Response Cache
         « HeartBeat
         Response
              »
Better: Server Side Events (SSE)

            Request


Browse                    Server
   r
           Response

           Response
Oups!!!

         Request


Browse              Server
   r
         Response
            Proxy
         Response
Better

          Request


Browse                 Server
   r
         Response Cache
         « HeartBeat
         Response
              »
WebSockets

          Hanshake


Browse                Server
   r
WebSockets

          Hanshake


Browse                Server
   r
            OK
WebSockets

          Request


Browse                Server
   r
WebSockets

          Request


Browse                Server
   r
WebSockets




Browse                Server
   r
         Response
WebSockets

          Request


Browse                Server
   r
WebSockets

          Request

           Request
Browse                Server
   r
WebSockets

          Request

           Request
Browse                Server
   r
WebSockets




Browse                Server
   r
         Response

         Response
Anytime




Browse              Server
   r
         Response
Life is good, lalalalalala




Browse                        Server
   r
            Response
Oups!!




Browse              Server
   r
         Response
            Proxy
Better!




Browse                Server
   r
         Response Cache
First Request
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.
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:51292 [AP]
HTTP/1.1 101 Switching Protocols.
Upgrade: WebSocket.
Connection: Upgrade.
Sec-WebSocket-Accept:
HVXA7SqH5uYeN6aD9tZ0JQbfTJA=.
OUPS!!!
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.
.
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?
Safari             Tomcat
                      7
Firefox            Jetty7

                    Jetty8
Chrome

                   GlassFis
Opera                h3.
                   GlassFis
  IE                  h
                     312
Free for all
Safari                   Tomcat
                            7
Firefox                  Jetty7

                          Jetty8
Chrome

                         GlassFis
Opera                      h3.
                         GlassFis
  IE                        h
                           312
Free for all
Safari                   Tomcat
                            7
Firefox                  Jetty7

          Imdat!!         Jetty8
Chrome

                         GlassFis
Opera                      h3.
                         GlassFis
  IE                        h
                           312
Free for all
Safari                         Tomcat
                                  7
          Streamin             Jetty7
Firefox
              g
                Imdat!!         Jetty8
Chrome

                               GlassFis
Opera                            h3.
                               GlassFis
  IE                              h
                                 312
Free for all
Safari                        Tomcat
                                 7
          Streamin            Jetty7
Firefox
              g
                Imdat!!SSE     Jetty8
Chrome

                              GlassFis
Opera                           h3.
                              GlassFis
  IE                             h
                                312
Free for all
Safari                            Tomcat
                                     7
          Streamin                Jetty7
Firefox
              g
                Imdat!!SSE        Jetty8
Chrome

                                GlassFis
Opera                         JSONP
                                  h3.
                                 GlassFis
  IE                                h
                                   312
Free for all
Safari                                 Tomcat
                                          7
           Streamin                    Jetty7
Firefox
               g
                 Imdat!!SSE            Jetty8
Chrome

                                     GlassFis
Opera
           Long                    JSONP
                                       h3.
                                      GlassFis
  IE      Polling                        h
                                        312
Safari                 Tomcat
                          7
Firefox                Jetty7
          Atmosphere
Chrome       to the     Jetty8

           rescue!!!   GlassFis
Opera                    h3.
                       GlassFis
  IE                      h
                         312
Atmosphere -WebSockets

Safari                                        Tomcat
                                                 7
                                              Jetty7




                             Atmosphere API
Firefox
             atmosphere.js
                                               Jetty8
Chrome

                                              GlassFis
Opera                                           h3.
                                              GlassFis
  IE                                             h
                                                312
Atmosphere - HTML5 Server Side
               Events
Safari                                     Tomcat
                                              7
                                           Jetty7




                          Atmosphere API
Firefox
          atmosphere.js
                                           Servlet
Chrome
                                             3
                                           WebLogi
Opera                                        c
                                           GlassFis
  IE                                          h
                                             312
Atmosphere Long-Polling/HTTP
                Streaming
Safari                                        JBoss

                                              Jetty7




                            Atmosphere API
Firefox
            atmosphere.js
                                             Servlet
Chrome
                                               3
                                             WebLogi
Opera                                          c.
                                             GlassFis
  IE                                            h
Atmosphere

Safari                                                   JBoss

                                                         Jetty7




                                       Atmosphere API
Firefox
          atmosphere.js
              Same
Chrome    API, transport                                Servlet
                                                          3
          independent!!                                 WebLogi
Opera                                                     c.
                                                        GlassFis
  IE                                                       h
Socket.IO, GWT, Wicket, JSF, etc.

Safari                                     JBoss

                                           Jetty7




                         Atmosphere API
Firefox
          Socket.IO
                                          Servlet
Chrome
                                            3
                                          WebLogi
Opera                                       c.
                                          GlassFis
  IE                                         h
PORTABLE!!!!!

Safari                                             JBoss

                                                   Jetty7




                                 Atmosphere API
Firefox
          Socket.IO
                      PORTABLE                    Servlet
Chrome
                                                    3
                                                  WebLogi
Opera                                               c.
                                                  GlassFis
  IE                                                 h
Big Big Big Mistake

• Frameworkthat support ONLY
 WebSockets



    Going into
   Production?
  IMPOSSIBLE
Atmosphere
Definition

• Suspend: open a   channel
• Resume: close a   channel
• Broadcast: push   message to one
 or more channel
Components

Atmosphere.js



                Interceptor(s)


                            Handler(s)
Components

Atmosphere.js



   Javascript   Interceptor(s)
     client

                            Handler(s)
Components

Atmosphere.js



                Interceptor(s)

       Intercepts/
          Filters           Handler(s)
Components

Atmosphere.js



                            Application
                Interceptor(s)
                               s Logic


                            Handler(s)
Components

Atmosphere.js
                             Your Servlet



                Interceptor(s)


                          ServletHandler
Components
                          Your Servlet
Atmosphere.js
                            Based
                          Framework

                Interceptor(s)


                          ServletHandler
Components

Atmosphere.js
                ws           Your Servlet



                Interceptor(s)


                          ServletHandler
Components

Atmosphere.js
                ws           Your Servlet
                  ss
                   e
                Interceptor(s)


                          ServletHandler
Components

Atmosphere.js
                ws           Your Servlet
                  ss
                   http
                   e
                Interceptor(s)


                          ServletHandler
Request

Browse
   r


Browse             Server
   r


Browse
   r
Request

Browse
   r


Browse             Server
   r


Browse
   r
Suspend

Browse
   r


Browse             Server
   r


Browse
   r
Suspend

Browse
   r

                   S
Browse              Server
   r


Browse
   r
Suspend

Browse
   r

                   S
Browse              Server
   r


Browse
   r
Suspend

Browse
   r

                   S
Browse              Server
   r


Browse
   r
Broadcast

Browse
   r
                              B
                     S
Browse               Server
   r


Browse
   r
Broadcast

Browse
   r
                              B
                     S
Browse               Server
   r


Browse
   r
Resume

Browse
   r
                               B

Browse                Server
   r              R


Browse
   r
Resume

Browse
   r
                               B

Browse                Server
                  S
   r


Browse
   r
Broadcaster

• Default:    in-memory
• Cloud
 •   RedisBroadcaster
 •   JMSBroadcaster
 •   XMPPBroadcaster
 •   HazelcastBroadcaster
 •   JGroupsBroascaster
• Multi-Threads,        Async I/O par
 default
Broadcaster Cloud

Browse
   r                         S
                             Server

Browse
   r


Browse                   S Server
   r
Broadcaster Cloud

Browse
   r                         S
                             Server

Browse
   r


Browse                   S Server
   r
Broadcaster Cloud

Browse                                B
   r                         S
                             Server

Browse
   r


Browse                   S Server
   r
Broadcaster Cloud

Browse                             B
   r                         Server


Browse
   r


Browse
   r                         Server
Broadcaster Cloud

Browse
   r                         Server


Browse
   r
                                      B
Browse
   r                         Server
Broadcaster Cloud

Browse
   r                         Server


Browse
   r


Browse
   r                         Server
Atmosphere API

• WebSocketHandler
 •   Only WebSocket (WARNING)!
• AtmosphereHandler
 •   All transport
• Jersey   Resource
 •   All transport
• Meteor
 •   All transport
WebSocket Sub Protocol

• WebSocketProtocol
 Define your own websocket protocol


• SimpleHttpProtocol
  WebSocket’s message mapped to HTTP
  POST, avec read/write asynchrone.
• SwaggerSocket:REST over
 WebSockets -> Powerful Protocol
Let’s have some fun
Single Client to Rule Them All




https://github.com/Atmosphere/atmos
phere/blob/master/samples/chat/src/m
 ain/webapp/jquery/application.js#L1
WebSocket


https://github.com/Atmosphere/atmos
phere/blob/master/samples/websocke
                  t-
chat/src/main/java/org/atmosphere/sa
mples/chat/WebSocketChat.java#L33
WebSocket, SSE, long-polling



https://github.com/Atmosphere/atmos
phere/blob/master/samples/chat/src/m
ain/java/org/atmosphere/samples/chat
 /ChatAtmosphereHandler.java#L33
Socket IO


https://github.com/Atmosphere/atmos
phere/blob/master/samples/socketio-
chat/src/main/java/org/atmosphere/sa
mples/chat/SocketIOChatAtmosphere
            Handler.java#L34
Jersey


https://github.com/Atmosphere/atmos
phere/blob/master/samples/sse-rest-
chat/src/main/java/org/atmosphere/sa
mples/chat/jersey/ResourceChat.java
                 #L32
JAXRS 2


https://github.com/Atmosphere/atmos
 phere/blob/master/samples/jaxrs2-
chat/src/main/java/org/atmosphere/sa
mples/chat/jaxrs2/Jaxrs2Chat.java#L3
                  4
SwaggerSocket

• REST over WebSocket
• JSON Based
• Simple
• Works with HTTP
• Multi-Request/Response
Conclusion

       Join the
      Revolution

It’s open source, it’s free to
jumps in!!
twitter.com/jfarcand
      twitter.com/atmo_framework
       twitter.com/swaggersocket

http://github.com/Atmosphere/atmosphere
http://github.com/wordnik/swaggersocket

More Related Content

Writing Portable WebSockets in Java