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");
}
}
HandshakeInterceptor
WebSocketSession
HttpSessionHandshakeInterceptor
WebSocketHandlerDecorator
ExceptionWebSocketHandlerDecorator
LoggingWebSocketHandlerDecorator
PerConnectionWebSocketHandler
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
// ...
@Bean
public WebSocketHandler snakeHandler() {
Class<?> clazz = SnakeWebSocketHandler.class;
return new PerConnectionWebSocketHandler(clazz);
}
}
WebSocketHandler
in Spring MVCRequestUpgradeStrategy
WebSocketClient
ListenableFuture<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