| z, ? | toggle help (this) |
| space, → | next slide |
| shift-space, ← | previous slide |
| d | toggle debug mode |
| ## <ret> | go to slide # |
| c, t | table of contents (vi) |
| f | toggle footer |
| r | reload slides |
| n | toggle notes |
| p | run preshow |
- RFC 6455, The WebSocket Protocol

"Toto, I've a feeling we're not in REST land any more"


HANDSHAKE REQUEST
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com
HANDSHAKE RESPONSE
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
open - session establishedmessage - new messages receivederror - transport errorclose - session closed 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
HttpServletRequest.upgrade(Class<?>)
JSR-356
Endpoint, or@ServerEndpoint, @ClientEndpoint
WebSocketContainer
ServerEndpointExporter deploys beans of typeServerEndpointRegistration
SpringConfigurator can be referenced@ServerEndpoint attribute
@ServerEndpoint per application"Using annotations and things is clearly in the vein of Spring and Hibernate and other popular Java libraries. When trying to build on top of it, though, I find myself wishing for an API more like Jetty 8, where I can just implement some interfaces and build my own abstractions on top of WebSocket."
Comment on jetty-users mailing list
spring-websocket module
public class EchoHandler extends TextWebSocketHandlerAdapter {
@Override
public void handleTextMessage(WebSocketSession session,
TextMessage message) throws Exception {
session.sendMessage(message);
}
}
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(
WebSocketHandlerRegistry registry) {
registry.addHandler(new EchoHandler(), "/echo");
}
}
HandshakeInterceptorWebSocketSessionHttpSessionHandshakeInterceptorWebSocketHandlerDecoratorExceptionWebSocketHandlerDecoratorLoggingWebSocketHandlerDecoratorPerConnectionWebSocketHandler
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
// ...
@Bean
public WebSocketHandler snakeHandler() {
Class<?> clazz = SnakeWebSocketHandler.class;
return new PerConnectionWebSocketHandler(clazz);
}
}
WebSocketHandler in Spring MVCRequestUpgradeStrategyWebSocketClientListenableFuture<WebSocketSession>ConnectionManagerSupport and sub-classeses
@Configuration
static class ClientConfig {
@Bean
public WebSocketConnectionManager connectionManager() {
String url = "ws://example.com:8080/echo";
WebSocketHandler handler = new EchoWebSocketHandler();
WebSocketClient client = new StandardWebSocketClient();
WebSocketConnectionManager manager =
new WebSocketConnectionManager(client, handler, url);
manager.setAutoStartup(true);
return manager;
}
}

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(
WebSocketHandlerRegistry registry) {
WebSocketHandler echoHandler = new EchoHandler();
registry.addHandler(echoHandler, "/echo").withSockJS();
}
}
WebSocketHandler
public class EchoHandler extends TextWebSocketHandlerAdapter {
@Override
public void handleTextMessage(WebSocketSession session,
TextMessage message) throws Exception {
session.sendMessage(message);
}
}
var ws = new SockJS("ws://localhost:8080/echo");
ws.onopen = function (event) {
// ...
};
ws.onmessage = function (event) {
// ...
};
ws.onclose = function (event) {
// ...
};

GET /echo
GET /echo/info
POST /echo/<server>/<session>/<transport>
GET /echo/info
POST /echo/375/5rzpg08l/xhr_streaming
POST /echo/375/5rzpg08l/xhr_send
POST /echo/375/5rzpg08l/xhr_send
SockJsService however sends periodic heartbeats