Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introduction to the Java API for WebSocket (JSR 356)

50,080 views

Published on

This session examines the efforts with JSR 356 to support WebSocket in the Java programming model, from its base-level integration in the Java Servlet and Java EE 7 containers to a new, easy-to-use API and tool set that is part of the standard enterprise Java platform.

The family of HTML5 technologies has pushed the pendulum away from thin client technologies and toward ever-more-capable Web clients running on today’s browsers. In particular, WebSocket brings new opportunities for efficient peer-to-peer communication, providing the basis for a new generation of interactive and “live” Web applications. JSR 356 brings these capabilities to server-side Java developers.

The session is a deep dive into JSR 356 including some demos.

Published in: Technology, News & Politics

Introduction to the Java API for WebSocket (JSR 356)

  1. 1. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public1 Introduction to the Java API for WebSocket (JSR 356) Reza Rahman Java EE/GlassFish Evangelist Reza.Rahman@Oracle.com @reza_rahman
  2. 2. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public2Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public Agenda  WebSocket 101  JSR 356: Java API for WebSocket  Demo
  3. 3. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public3 WebSocket  HTTP/TCP based, bi-directional, full-duplex messaging  Originally proposed as part of HTML5  IETF-defined Protocol: RFC 6455  W3C defined JavaScript API
  4. 4. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public4 Establish a connection Client Handshake Request Handshake Response Server
  5. 5. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public5 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. 6. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public6 Handshake Response HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
  7. 7. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public7 Establishing a Connection ServerClient Handshake Request Handshake Response Connected !
  8. 8. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public8 WebSocket Lifecycle ServerClient Connected ! open open close message message error message message Disconnected
  9. 9. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public9 Browser Support
  10. 10. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public10 Java API for WebSocket  Create WebSocket Endpoints – Interface-driven (Endpoint) – Annotation-driven (@ServerEndpoint)  Client and server APIs  Part of Java EE 7  SPI for extensions and data frames
  11. 11. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public11 Basic API Tour
  12. 12. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public12 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. } } }); } }
  13. 13. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public13 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) { ... } } }
  14. 14. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public14 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);
  15. 15. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public15 Sending the Message Whole string * RemoteEndpoi nt.Basic sendText(String message) Binary data * RemoteEndpoi nt.Basic sendBinary(ByteBuffer message) String fragments RemoteEndpoi nt.Basic sendText(String part, boolean last) Binary data fragments RemoteEndpoi nt.Basic sendBinary(ByteBuffer part, boolean last) Blocking stream of text RemoteEndpoi nt.Basic Writer getSendWriter()) Blocking stream of binary data RemoteEndpoi nt.Basic OutputStream getSendStream() Custom object RemoteEndpoi nt.Basic sendObject(Object customObject) * Additional flavors: by completion, by future
  16. 16. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public16 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<ByteBuffe r> 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> onMessage(T customObject)
  17. 17. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public17 POJO + Annotations
  18. 18. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public18 Hello World Annotations @ServerEndpoint("/hello") public class HelloBean { @OnMessage public String sayHello(String name) { return "Hello " + name; } }
  19. 19. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public19 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 @PathParam Method Parameter Flags a matched path segment of a URI- template @OnError Method Intercepts errors during a conversation
  20. 20. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public20 @ServerEndpoint Attributes value Relative URI or URI template e.g. “/hello” or “/chat/{subscriber-level}” configurator Custom configuration decoders List of message decoder classnames encoders List of message encoder classnames subprotocols List of the names of the supported subprotocols
  21. 21. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public21 Custom Payloads @ServerEndpoint( value="/hello", encoders={MyMessage.class}, decoders={MyMessage.class}) public class MyEndpoint { ... }
  22. 22. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public22 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(); } }
  23. 23. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public23 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) { ... } }
  24. 24. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public24 Chat Sample @Singleton @ServerEndpoint("/chat") public class ChatServer { private Set<Session> peers = new HashSet(); @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ...
  25. 25. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public25 Chat Sample (Continued) ... @OnMessage public void message(String message) { for (Session peer : peers) { peer.getBasicRemote().sendText(message); } } }
  26. 26. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public26 URI Template Matching @ServerEndpoint("/orders/{order-id}") public class MyEndpoint { @OnMessage public void processOrder( @PathParam("order-id") String orderId) { ... } }
  27. 27. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public27 @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
  28. 28. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public28 Java WebSocket Demo https://github.com/m-reza-rahman/hello-websocket https://github.com/m-reza-rahman/whiteboard
  29. 29. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public29 Try it Out! http://dlc.sun.com.edgesuite.net/glassfish/4.0.1/promoted/
  30. 30. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public30 Java WebSocket Implementations Tomcat GlassFish TomEE
  31. 31. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public31 Summary  Bi-directional full-duplex communication on the web – Chat, online multiplayer games, collaboration, real time monitoring  Java API for WebSocket standardized as part of Java EE 7 – Interface-driven – Annotation-driven  Client and server APIs  Supported by major server-side Java platforms
  32. 32. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public32 Learning More  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 – GlassFish: http://glassfish.org  Dig Deeper – Java EE Tutorial: http://docs.oracle.com/javaee/7/tutorial/doc/websocket.htm – Java EE 7 Hands-on-Lab: https://glassfish.java.net/hol/ – Cargo Tracker Java EE Blue Prints Project: https://java.net/projects/cargotracker/
  33. 33. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public33

×