【计网】WebSocket协议

末蓝、 2023-09-27 17:53 167阅读 0赞

目录

一、背景

二、WebSocket握手过程

三、SpringBoot中使用WebSocket协议

1、服务器

2、客户端


一、背景

一般的web开发以请求响应为主即客户端发送一个请求,服务器返回一个响应,这就使得类似聊天等需求基于HTTP协议进行实现时比较消费资源,使用HTTP协议时,当用户A给用户B发送的消息到达服务器后需要服务器去主动的给用户B进行推送,显然HTTP是难以做到的(需要基于轮询机制),这个时候我们就可以使用WebSocket来实现消息推送机制。他也是一个应用层协议,下层是基于TCP的

二、WebSocket握手过程

当网页端尝试与服务器建立连接

网页端会先给服务器发送一个特殊的http请求,这个请求里带有特殊的header: Connection:Upgrade 与 Upgrade:WebSocket,这两个header相当于告知服务器进行协议升级。此时如果服务器支持webSocket就会返回一个特殊的http响应,这个响应的状态码就是101(切换协议),此时就开始使用webSocket

三、SpringBoot中使用WebSocket协议

1、服务器

首先我们需要创建一个类去继承TextWebSocketHandler,然后重新他的方法

bb10d314f69c4e3eb6fd2d89f181dbc4.png

  1. package com.example.demo.controller;
  2. import org.springframework.web.socket.CloseStatus;
  3. import org.springframework.web.socket.TextMessage;
  4. import org.springframework.web.socket.WebSocketSession;
  5. import org.springframework.web.socket.handler.TextWebSocketHandler;
  6. public class Chat extends TextWebSocketHandler {
  7. @Override
  8. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  9. System.out.println("success");
  10. }
  11. @Override
  12. protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  13. System.out.println("get message" + message.getPayload());
  14. }
  15. @Override
  16. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  17. System.out.println("error");
  18. }
  19. @Override
  20. public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  21. System.out.println("close");
  22. }
  23. }

然后我们需要将这个类配置到spring中:创建配置类继承WebSocketConfigurer接口重写方法

7ccd94bbf6f84aacb37d3666626630d9.png

  1. package com.example.demo.configur;
  2. import com.example.demo.controller.Chat;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.socket.config.annotation.EnableWebSocket;
  5. import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
  6. import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
  7. @Configuration
  8. @EnableWebSocket
  9. public class WebSocketConfig implements WebSocketConfigurer {
  10. @Override
  11. public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  12. registry.addHandler(new Chat(),"/chat");
  13. }
  14. }

服务器给客户端发送消息时可通过WebSocketSession里的sendMessage(new TextMessage(消息))来发送

2、客户端

此时我们就可以来实现前端代码47e87ad633e240edb0260603f9c7da65.png

  1. <script>
  2. // 创建实例
  3. let webScoekt = new WebSocket("ws://127.0.0.1:8080/chat");
  4. // 实现回调函数
  5. webScoekt.onopen = function() {
  6. console.log("连接建立")
  7. }
  8. webScoekt.onerror = function() {
  9. console.log("连接异常")
  10. }
  11. webScoekt.onclose = function() {
  12. console.log("连接关闭")
  13. }
  14. webScoekt.onmessage = function(body) {
  15. console.log("收到消息" + body.data)
  16. }
  17. </script>

客户端给服务器发送消息时可以通过webSocket.send(消息)进行发送

发表评论

表情:
评论列表 (有 0 条评论,167人围观)

还没有评论,来说两句吧...

相关阅读