WebSocket
介绍
WebSocket和HTTP类似也是应用层的一个协议,基于传输层的TCP协议,提供可靠传输。WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制,WebSocket更接近于TCP的全双工机制,只要客户端和服务端建立起连接,客户端和服务端都可以主动向对方发送数据。
WebSocket建立连接过程
WebSocket协议基于TCP协议,建立一个WebSocket连接需要借助HTTP,首先客户端(浏览器)要向服务器发送一个HTTP请求,这个HTTP请求和一般的HTTP请求有些不一样。
建立连接HTTP请求:
建立连接的HTTP请求中有两个特殊的header,表示进行协议升级和升级成websocket协议。
Connection: Upgrade
Upgrade: websocket
对应的HTTP响应:
返回的响应中的101状态码表示进行协议切换,这样就完成了WebSocket的连接建立。
HTTP/1.1 101
Upgrade: websocket
Connection: upgrade
其实HTTP就是一个中间人用来建立连接,建立连接完毕之后,客户端和服务端就采用WebSocket进行通信了。
通过抓包可以简单观察到:
使用
Spring中内置了WebSocket可以直接进行使用。
服务端代码
继承TextWebSocketHandler
类重写对应的方法
@Component
public class TestWebSocket extends TextWebSocketHandler {
/**
* 建立连接
* @param session
* @throws Exception
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("连接建立");
}
/**
* 处理请求
* @param session
* @param message
* @throws Exception
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String msg = message.getPayload();
System.out.println("收到消息:"+msg);
// 给客户端返回消息
session.sendMessage(new TextMessage("服务器响应:"+msg));
}
/**
* 连接异常
* @param session
* @param exception
* @throws Exception
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.out.println("连接异常");
}
/**
* 连接断开
* @param session
* @param status
* @throws Exception
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("连接断开!");
}
}
这个类用于配置请求路径和 TextWebSocketHandler 之间的对应关系.
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private TestWebSocket testWebSocket;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(testWebSocket,"/test");
}
}