Building Java HTML5/WebSocket Applications with JSR 356

1,919 views
1,654 views

Published on

Video and slides synchronized, mp3 and slide download available at URL http://bit.ly/1gUu3Ee.

Reza Rahman examines the efforts under way with JSR 356 to support WebSocket in the Java programming model, from its base-level integration in the Java Servlet and Java EE containers to a new, easy-to-use API and toolset that are destined to become part of the standard Java platform. Filmed at qconnewyork.com.

Reza Rahman was a long time independent consultant and now officially a Java EE/GlassFish evangelist at Oracle. He is the author of the popular book EJB 3 in Action. Reza is a frequent speaker at Java User Groups and conferences worldwide including JavaOne. He is an avid contributor to industry journals like JavaLobby/DZone and TheServerSide.

Published in: Technology

Building Java HTML5/WebSocket Applications with JSR 356

  1. 1. 1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  2. 2. Watch the video with slide synchronization on InfoQ.com! http://www.infoq.com/presentations /asynchronous-event-websocket InfoQ.com: News & Community Site • 750,000 unique visitors/month • Published in 4 languages (English, Chinese, Japanese and Brazilian Portuguese) • Post content from our QCon conferences • News 15-20 / week • Articles 3-4 / week • Presentations (videos) 12-15 / week • Interviews 2-3 / week • Books 1 / month
  3. 3. Presented at QCon New York www.qconnewyork.com Purpose of QCon - to empower software development by facilitating the spread of knowledge and innovation Strategy - practitioner-driven conference designed for YOU: influencers of change and innovation in your teams - speakers and topics driving the evolution and innovation - connecting and catalyzing the influencers and innovators Highlights - attended by more than 12,000 delegates since 2007 - held in 9 cities worldwide
  4. 4. Building Java HTML5/WebSocket Applications with JSR 356 Reza Rahman Java EE/GlassFish Evangelist Reza.Rahman@Oracle.com @reza_rahman
  5. 5. Program Agenda  WebSocket Primer  JSR 356: Java API for WebSocket  Demo 3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  6. 6. Interactive Web Sites  HTTP is half-duplex  Flavors of Server Push – Polling – Long Polling – Comet/Ajax  Complex, Inefficient, Wasteful 4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  7. 7. WebSocket to the Rescue  TCP based, bi-directional, full-duplex messaging  Originally proposed as part of HTML5  IETF-defined Protocol: RFC 6455  W3C defined JavaScript API 5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  8. 8. What’s the basic idea ?  Establish connection (Single TCP connection)  Send messages in both direction (Bi-directional)  Send message independent of each other (Full Duplex)  End connection 6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  9. 9. Establish a connection Handshake Request Client Server Handshake Response 7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  10. 10. 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 8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  11. 11. Handshake Response HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat 9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  12. 12. Establishing a Connection Handshake Request Client Server Handshake Response Connected ! 10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  13. 13. WebSocket Lifecycle Connected ! open open message Client message error message Server message close Disconnected 11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  14. 14. WebSocket API www.w3.org/TR/websockets/ 12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  15. 15. Java WebSocket Implementations Java-WebSocket Grizzly WebSocket SDK Apache Tomcat 7 Webbit GlassFish Atmosphere Autobahn websockets4j WeberKnecht GNU WebSocket4J Jetty Netty JBoss TorqueBox Caucho Resin SwaggerSocket jWebSocket 13 Kaazing WebSocket Gateway jWamp Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  16. 16. Browser Support 14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  17. 17. JSR 356: Java API for Web Socket  Specification – http://jcp.org/en/jsr/detail?id=356 – http://java.net/projects/websocket-spec – Included in Java EE 7  Reference Implementation – http://java.net/projects/tyrus – Bundled with Glassfish 4 15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  18. 18. Java API for WebSocket Features  Create WebSocket Endpoints – Interface-driven (Endpoint) – Annotation-driven (@ServerEndpoint)  Client and server APIs  SPI for extensions and data frames 16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  19. 19. Basic API Tour 17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  20. 20. Hello World Server public class HelloServer extends Endpoint { @Override public void onOpen(Session session, EndpointConfig configuration) { session.addMessageHandler( new MessageHandler.Whole<String>() { public void onMessage(String name) { try { session.getBasicRemote().sendText(“Hello “ + name); } catch (IOException ioe) { // Handle failure. } } }); } } 18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  21. 21. Hello World Client public class HelloClient extends Endpoint { @Override public void onOpen(Session session, EndpointConfig configuration) { try { session.getBasicRemote().sendText("Hello you!"); } catch (IOException ioe) { . . . } } } 19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  22. 22. Client Server Configuration ServerContainer serverContainer = (ServerContainer) servletContext.getAttribute( “javax.websocket.server.ServerContainer”); ServerEndpointConfig serverConfiguration = ServerEndpointConfig.Builder.create( HelloServer.class, "/hello").build(); serverContainer.addEndpoint(serverConfiguration); ... URI clientURI = new URI("ws://myserver.com/websockets/hello"); WebSocketContainer container = ContainerProvider.getWebSocketContainer(); ClientEndpointConfig clientConfiguration = ClientEndpointConfig.Builder.create().build(); container.connectToServer(HelloClient.class, clientConfiguration, clientURI); 20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  23. 23. Main API Classes: javax.websocket.*  Endpoint: Intercepts WebSocket lifecycle events  MessageHandler: Handles all incoming messages for an Endpoint  RemoteEndpoint: Represents the ‘other end’ of this conversation  Session: Represents the active conversation 21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  24. 24. Object Model Message Handler Remote Endpoint Message Handler Remote Endpoint Client Internet Session Message Handler Remote Endpoint Session Client 22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public WebSocket Endpoint Session Client
  25. 25. Sending the Message Whole string * RemoteEndpoint.Basic sendText(String message) Binary data * RemoteEndpoint.Basic sendBinary(ByteBuffer message) String fragments RemoteEndpoint.Basic sendText(String part, boolean last) Binary data fragments RemoteEndpoint.Basic sendBinary(ByteBuffer part, boolean last) Blocking stream of text RemoteEndpoint.Basic Writer getSendWriter()) Blocking stream of binary RemoteEndpoint.Basic data OutputStream getSendStream() Custom object sendObject(Object customObject) RemoteEndpoint.Basic * additional flavors: by completion, by future 23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  26. 26. Receiving the Message Whole string MessageHandler.Whole<String> onMessage(String message) Binary data MessageHandler.Whole<ByteBuffer> onMessage(ByteBuffer message) String fragments MessageHandler.Partial<String> onMessage(String part, boolean last) Binary data fragments MessageHandler.Partial<ByteBuffer> onMessage(ByteBuffer part, boolean last) Blocking stream of text MessageHandler.Whole<Reader> onMessage(Reader r) Blocking stream of binary data MessageHandler.Whole<InputSteam> onMessage(InputStream r) Custom object of type T MessageHandler.Whole<T> 24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public onMessage(T customObject)
  27. 27. POJO + Annotations 25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  28. 28. Hello World Annotations @ServerEndpoint("/hello") public class HelloBean { @OnMessage public String sayHello(String name) { return “Hello “ + name; } } 26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  29. 29. WebSocket Annotations Annotation Level Purpose @ServerEndpoint class Turns a POJO into a WebSocket Server Endpoint @ClientEndpoint class Turns a POJO into a WebSocket Client Endpoint @OnOpen method Intercepts WebSocket Open events @OnClose method Intercepts WebSocket Close events @OnMessage method Intercepts WebSocket Message events method Flags a matched path segment of a URI-template parameter @PathParam @OnError 27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. method Public Intercepts errors during a conversation
  30. 30. @ServerEndpoint attributes value configurator Custom configuration decoders list of message decoder classnames encoders list of message encoder classnames subprotocols 28 Relative URI or URI template e.g. “/hello” or “/chat/{subscriber-level}” list of the names of the supported subprotocols Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  31. 31. Custom Payloads @ServerEndpoint( value="/hello", encoders={MyMessage.class}, decoders={MyMessage.class} ) public class MyEndpoint { . . . } 29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  32. 32. Custom Payloads – Text public class MyMessage implements Decoder.Text<MyMessage>, Encoder.Text<MyMessage> { private JsonObject jsonObject; public MyMessage decode(String s) { jsonObject = new 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(); } } 30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  33. 33. Custom Payloads – Binary public class MyMessage implements Decoder.Binary<MyMessage>, Encoder.Binary<MyMessage> { public MyMessage decode(ByteBuffer bytes) { . . . return this; } public boolean willDecode(ByteBuffer bytes) { . . . return true; // Only if can process the payload } public ByteBuffer encode(MyMessage myMessage) { . . . } } 31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  34. 34. Chat Sample @ServerEndpoint("/chat") public class ChatBean { Set<Session> peers = Collections.synchronizedSet(…); @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ... 32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  35. 35. Chat Sample (Continued) . . . @OnMessage public void message(String message, Session client) { for (Session peer : peers) { peer.getRemote().sendObject(message); } } } 33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  36. 36. URI Template Matching @ServerEndpoint(“/orders/{order-id}”) public class MyEndpoint { @OnMessage public void processOrder( @PathParam(“order-id”) String orderId) { ... } } 34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  37. 37. @OnMessage Methods  A parameter type that can be decoded in incoming message – String, primitive, Reader, ByteBuffer, byte[], InputStream, or any type for which there is a decoder  An optional Session parameter  Boolean partial flag  0..n String parameters annotated with @PathParameter  A return type that can be encoded in outgoing message – String, primitive, Reader, ByteBuffer, byte[], InputStream, or any type for which there is an encoder 35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  38. 38. Java WebSocket Hello World Demo https://github.com/m-reza-rahman/hello-websocket 36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  39. 39. Try it Out! http://download.java.net/glassfish/4.0/release/glassfish-4.0.zip 37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  40. 40. Resources  Specification – JSR: jcp.org/en/jsr/detail?id=356 – Mailing Lists, JIRA, Archive: java.net/projects/websocket-spec  Reference Implementation – Tyrus: java.net/projects/tyrus 38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  41. 41. 39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  42. 42. 40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public
  43. 43. Watch the video with slide synchronization on InfoQ.com! http://www.infoq.com/presentations/asynchronous -event-websocket

×