WebSocket

莱莱  论坛元老 | 2025-3-15 12:05:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3021

一、WebSocket基础

1. WebSocket介绍

WebSocket是一种网络通信协议,提供全双工通信通道,允许服务器和客户端之间举行长期、双向的通信。与传统HTTP差别,WebSocket在创建毗连后保持开放状态,双方可以随时发送数据。
2. WebSocket与HTTP比力


3. WebSocket工作原理

毗连创建:客户端发送标准HTTP请求,请求头包罗升级协议信息
  1. GET /chat HTTP/1.1
  2. Host: server.example.com
  3. Upgrade: websocket
  4. Connection: Upgrade
  5. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  6. Sec-WebSocket-Protocol: chat, superchat
  7. Sec-WebSocket-Version: 13
复制代码
握手确认:服务器同意升级,返回确认相应
  1. HTTP/1.1 101 Switching Protocols
  2. Upgrade: websocket
  3. Connection: Upgrade
  4. Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
  5. Sec-WebSocket-Protocol: chat
复制代码
双向通信:握手成功后,毗连保持开放,双方可以随时发送数据帧
毗连关闭:任一方可以发送关闭帧,制止毗连
二、Spring Boot整合WebSocket示例(聊天室)

下面详细介绍利用Spring Boot创建WebSocket聊天室应用的步调:
步调1:创建Spring Boot项目


  • 利用Spring Initializr创建项目
  • 添加须要依赖:
         
    • Spring Web   
    • WebSocket   
    • Lombok(可选,简化代码)  

pom.xml依赖:
  1. <dependencies>
  2.     <!-- Spring Boot Web -->
  3.     <dependency>
  4.         <groupId>org.springframework.boot</groupId>
  5.         <artifactId>spring-boot-starter-web</artifactId>
  6.     </dependency>
  7.    
  8.     <!-- WebSocket -->
  9.     <dependency>
  10.         <groupId>org.springframework.boot</groupId>
  11.         <artifactId>spring-boot-starter-websocket</artifactId>
  12.     </dependency>
  13.    
  14.     <!-- Lombok(可选) -->
  15.     <dependency>
  16.         <groupId>org.projectlombok</groupId>
  17.         <artifactId>lombok</artifactId>
  18.         <optional>true</optional>
  19.     </dependency>
  20. </dependencies>
复制代码
步调2:创建WebSocket配置类

创建WebSocketConfig类:
  1. package com.example.websocket.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  5. @Configuration
  6. public class WebSocketConfig {
  7.    
  8.     @Bean
  9.     public ServerEndpointExporter serverEndpointExporter() {
  10.         return new ServerEndpointExporter();
  11.     }
  12. }
复制代码
说明:


  • ServerEndpointExporter负责注册利用@ServerEndpoint注解的WebSocket端点
  • 该Bean将主动扫描和注册带有@ServerEndpoint注解的类
步调3:定义消息实体类

创建Message类:
  1. package com.example.websocket.model;
  2. import lombok.Data;
  3. @Data
  4. public class Message {
  5.     private String username;  // 发送者用户名
  6.     private String content;   // 消息内容
  7.     private String timestamp; // 时间戳
  8.    
  9.     // 如果不使用Lombok,需要添加getter、setter和构造方法
  10. }
复制代码
步调4:创建WebSocket端点类

创建ChatEndpoint类:
  1. package com.example.websocket.endpoint;
  2. import com.example.websocket.model.Message;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.stereotype.Component;
  7. import javax.websocket.*;
  8. import javax.websocket.server.PathParam;
  9. import javax.websocket.server.ServerEndpoint;
  10. import java.io.IOException;
  11. import java.util.Map;
  12. import java.util.concurrent.ConcurrentHashMap;
  13. @Component
  14. @ServerEndpoint("/chat/{username}")
  15. public class ChatEndpoint {
  16.    
  17.     private static final Logger logger = LoggerFactory.getLogger(ChatEndpoint.class);
  18.     private static final Map<String, Session> onlineSessions = new ConcurrentHashMap<>();
  19.     private static final ObjectMapper objectMapper = new ObjectMapper();
  20.    
  21.     /**
  22.      * 连接建立时调用
  23.      */
  24.     @OnOpen
  25.     public void onOpen(Session session, @PathParam("us
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表