学完了协议基础,咱们一块儿使用spring-boot
搭建一个websocket
项目。javascript
如下的代码实现十分简单,创建起WebSocket
链接后,后台向前台推送一些数据,前台回复收到。java
以下所示,后台编写一个Handler
,实现WebSocketHandler
拥有处理WebSocket
的能力,实现方法。web
@Component public class YunzhiWebSocketHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception { System.out.println("创建链接"); webSocketSession.sendMessage(new TextMessage("Hello!")); webSocketSession.sendMessage(new TextMessage("This is yunzhiclub.")); webSocketSession.sendMessage(new TextMessage("I am yunzhi's server.")); webSocketSession.sendMessage(new TextMessage("I am sending message.")); } @Override public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception { System.out.println("收到数据" + webSocketMessage.getPayload().toString()); } @Override public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception { System.out.println("发生错误"); } @Override public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception { System.out.println("链接关闭"); } @Override public boolean supportsPartialMessages() { return false; } }
前台不引入任何JavaScript
第三方库,直接使用原生WebSocket API
实现。spring
创建WebSocket
链接。websocket
var websocket = new WebSocket('ws://127.0.0.1:8080/websocket'); websocket.onpen = function(event) { console.log('创建WebSocket链接'); }; websocket.onclose = function(event) { console.log('关闭WebSocket链接'); }; websocket.onmessage = function(event) { console.log('收到消息', event.data); websocket.send('收到!'); }; websocket.onerror = function() { console.log('WebSocket发生错误'); }; window.onbeforeunload = function() { websocket.close(); };
@Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { private final YunzhiWebSocketHandler handler; public WebSocketConfig(YunzhiWebSocketHandler handler) { this.handler = handler; } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(handler, "websocket").setAllowedOrigins("*"); } }
在网络中,便可查看WebSocket
的数据收发状况。网络
写完WebSocket
代码以后,忽然以为本身以前举的在线聊天的栗子很差实现。单一用户的推送,使用WebSocket
很困难。框架
推送的时候,须要使用WebSocketSession
进行推送,因此就须要验证WebSocketSession
与用户之间的对应关系。socket
用户认证可使用token
来实现。ide
以前咱们讲过,WebSocket
的创建须要先发送HTTP
请求进行握手,咱们能够在握手中鉴别用户身份。spring-boot
握手拦截器,此处是获取token
的示例,就像普通的HTTP
同样。
@Component public class WebSocketInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception { if (serverHttpRequest instanceof ServletServerHttpRequest) { ServletServerHttpRequest request = (ServletServerHttpRequest) serverHttpRequest; String token = request.getServletRequest().getParameter("token"); System.out.println(token); } return true; } @Override public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) { } }
配置拦截器:
private final WebSocketInterceptor interceptor; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(handler, "websocket").addInterceptors(interceptor).setAllowedOrigins("*"); }
前台在创建链接的时候添加token
认证信息:
var websocket = new WebSocket('ws://127.0.0.1:8080/websocket?token=23147823975891374859435');
在握手的时候,后台便可获取token
信息,获悉用户身份。
最近的感受就是语言和框架的重要性逐渐下降,我再也不喜欢去看什么《Spring Boot
核心思想》、《Spring Cloud
微服务实战》这些书,学完真的感受没什么用,没人敢保证一项技术长青。
如今,我开始学习IO
模型、学习Linux
。
字节跳动的消(cu
)极(si
)事件(小声,听说查得挺严的),让我庆幸挂在三面。同时,我也彷佛感悟更深。
别拘泥框架,技术不止框架。别迷恋技术,人生远比这广。