Websocket协议是一种标准的在单个Tcp连接时,客户端与服务端的全双工通信协议,它运行在Http之上。
介绍
在使用Websocket协议时,首先会以Http请求开始,但是请求头中带上Upgrade的请求头,来切换接下来的协议。
1 客户端请求
GET /localhost/websocket HTTP/1.1
Host: localhost
**Upgrade: websocket**
**Connection: Upgrade**
Origin: http://localhost
2 服务端响应
HTTP/1.1 **101 Switching Protocols**
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
image-20191209072134278
在成功的握手之后,Tcp的socket会保持打开状态,以便客户端与服务端接下来继续发送和接消息。
关于Websocket的完整说明可以参考RFC6455
Spring Websocket使用
Spring框架提供了Websocket的API方便我们快速的开发灵活的Websocket应用。
1 创建Spring Boot应用,引入依赖,spring-boot-starter-websocket默认会引入web-starter。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2 启用Websocket,在指定的地址上配置Websocket的Handler。
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
Logger log = LoggerFactory.getLogger(getClass());
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry
.addHandler(new TextWebSocketHandler(){
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("建立连接 {}",session.getId());
super.afterConnectionEstablished(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
log.info("处理收到的数据:{}",new String(message.asBytes()));
}
}, "/websocket-spring")
.setAllowedOrigins("*")
;
}
}
3 在浏览器中测试。Websocket是否正常工作。
http://www.websocket-test.com/
4 写Websocket-client通过编程方式测试Websocket客户端。
// 仅仅为了测试Websocket Client能否工作。
@Test
public void testWebsocketServer() throws InterruptedException {
StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketConnectionManager socketConnectionManager = new WebSocketConnectionManager(webSocketClient,
new TextWebSocketHandler() {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
System.out.println("已建立连接.");
new ReportTimeThread(session).start();
}
},
"ws://127.0.0.1:8080/websocket-spring");
socketConnectionManager.start();
Thread.sleep(10000);
}
private static class ReportTimeThread extends Thread {
private final WebSocketSession session;
public ReportTimeThread(WebSocketSession session) {
this.session = session;
}
@Override
public void run() {
try {
while (true){
session.sendMessage(new TextMessage("当前时间:" + new Date().toString()));
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
image-20191209074106234
最后
关于Websocket的使用就介绍到这里,可以看出Spring还是提供了很方便的工具来帮助我们快速开发Websocket应用的。
像关于Websocket的子协议,SockJs,STOMP协议,在Websocket上做一些扩展,后续再做说明。
网友评论