introduction to the java api for websocket (jsr 356)
DESCRIPTION
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.TRANSCRIPT
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public1
Introduction to the Java API for WebSocket (JSR 356)Reza RahmanJava EE/GlassFish [email protected]@reza_rahman
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
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public4
Establish a connection
Client
Handshake Request
Handshake Response
Server
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public5
Handshake Request
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.comSec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public6
Handshake Response
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol: chat
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public7
Establishing a Connection
ServerClient
Handshake Request
Handshake Response
Connected !
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public8
WebSocket Lifecycle
ServerClient
Connected !
open open
close
message
message
error
messagemessage
Disconnected
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public9
Browser Support
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
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public11
Basic API Tour
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. } } }); }}
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) { ... } }}
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);
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public15
Sending the Message
Whole string *RemoteEndpoint.Basic
sendText(String message)
Binary data *RemoteEndpoint.Basic
sendBinary(ByteBuffer message)
String fragmentsRemoteEndpoint.Basic
sendText(String part, boolean last)
Binary data fragmentsRemoteEndpoint.Basic
sendBinary(ByteBuffer part, boolean last)
Blocking stream of text
RemoteEndpoint.Basic
Writer getSendWriter())
Blocking stream of binary data
RemoteEndpoint.Basic
OutputStream getSendStream()
Custom objectRemoteEndpoint.Basic
sendObject(Object customObject)
* Additional flavors: by completion, by future
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public16
Receiving the Message
Whole stringMessageHandler.Whole<String>
onMessage(String message)
Binary dataMessageHandler.Whole<ByteBuffer>
onMessage(ByteBuffer message)
String fragmentsMessageHandler.Partial<String>
onMessage(String part, boolean last)
Binary data fragments
MessageHandler.Partial<ByteBuffer>
onMessage(ByteBuffer part, boolean last)
Blocking streamof text
MessageHandler.Whole<Reader>
onMessage(Reader r)
Blocking streamof binary data
MessageHandler.Whole<InputSteam>
onMessage(InputStream r)
Custom objectof type T
MessageHandler.Whole<T>
onMessage(T customObject)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public17
POJO + Annotations
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; }}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public19
WebSocket Annotations
Annotation Level Purpose
@ServerEndpoint ClassTurns a POJO into a WebSocket Server Endpoint
@ClientEndpoint ClassTurns 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
@PathParamMethod
ParameterFlags a matched path segment of a URI-template
@OnError Method Intercepts errors during a conversation
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public20
@ServerEndpoint Attributes
valueRelative 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
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 { ...}
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(); }}
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) { ... }}
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); } ...
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); } }}
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) { ... }}
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
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
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/
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public30
Java WebSocket Implementations
Tomcat
GlassFish
TomEE
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
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/
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public33