# spring boot websocket ## 目录
一、说明
    1.1 项目结构说明
    1.2 主要依赖
二、spring boot websocket
        2.1 创建消息处理类ChatSocket,使用@ServerEndpoint声明websocket服务
        2.2 配置ServerEndpointExporter,ServerEndpointExporter会在运行时候自动注册我们用@ServerEndpoint声明的websocket服务
        2.3 前端websocket的实现
        2.4 简单登录的实现
## 正文
## 一、说明 ### 1.1 项目结构说明 1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候将临时用户名存储在session当中; 2. 关于websocket的主要配置在websocket文件夹下; 3. 模板引擎采用freemaker; 4. 项目以web的方式构建。
### 1.2 主要依赖 ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-websocket org.springframework.boot spring-boot-starter-freemarker ``` ## 二、spring boot websocket #### 2.1 创建消息处理类ChatSocket,使用@ServerEndpoint声明websocket服务 ```java @ServerEndpoint(value = "/socket/{username}") @Component public class ChatSocket { /** * 建立连接时候触发 */ @OnOpen public void onOpen(Session session, @PathParam("username") String username) { // 这个方法是线程不安全的 Constant.nameAndSession.putIfAbsent(username, session); } /** * 关闭连接时候触发 */ @OnClose public void onClose(Session session, @PathParam("username") String username) { Constant.nameAndSession.remove(username); } /** * 处理消息 */ @OnMessage public void onMessage(Session session, String message, @PathParam("username") String username) throws UnsupportedEncodingException { // 防止中文乱码 String msg = URLDecoder.decode(message, "utf-8"); // 简单模拟群发消息 Constant.nameAndSession.forEach((s, webSocketSession) -> { try { webSocketSession.getBasicRemote().sendText(username + " : " + msg); } catch (IOException e) { e.printStackTrace(); } }); } } ``` #### 2.2 配置ServerEndpointExporter,ServerEndpointExporter会在运行时候自动注册我们用@ServerEndpoint声明的websocket服务。 ```java @Configuration public class WebSocketConfig { /*** * 检测{@link javax.websocket.server.ServerEndpointConfig}和{@link ServerEndpoint} 类型的bean, * 并在运行时使用标准Java WebSocket时注册。 * 我们在{@link com.heibaiying.springboot.websocket.WebSocketConfig}中就是使用@ServerEndpoint去声明websocket服务 */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } ``` #### 2.3 前端websocket的实现 ```jsp ${Session["username"]}您好!欢迎进入群聊大厅!
${Session["username"]}您好!欢迎进入群聊大厅!
``` #### 2.4 简单登录的实现 ```java Title
``` ```java /** * @description : 简单登录 */ @Controller public class LoginController { @PostMapping("login") public String login(String username, HttpSession session) { session.setAttribute(Constant.USER_NAME, username); return "chat"; } @GetMapping public String index() { return "index"; } } ```