Spring Boot 系列 - WebSocket 简单使用(建立一个网页聊天室)

在实现消息推送的项目中往往需要 WebSocket,以下简单讲解在 Spring boot 中使用 WebSocket。

1、pom.xml 中引入 spring-boot-starter-websocket


    org.springframework.boot
    spring-boot-starter-websocket

2、往 spring 容器中注入 ServerEndpointExporter

package com.example.mywebsocket.common.websocket;

/**
 * 类功能说明
 *
 * @author
 * @date 2023/6/1 16:56
 */
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置
 * 

* 自动注册使用了@ServerEndpoint注解声明的Websocket endpoint * 要注意,如果使用独立的servlet容器,而不是直接使用springboot的内置容器,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。 * * @author sam * @since 2017/9/13 */ @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }

3、Endpoint 具体实现

package com.example.mywebsocket.controller;

/**
 * 类功能说明
 *
 * @author
 * @date 2023/6/1 16:57
 */
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ServerEndpoint
 * 

* 使用springboot的唯一区别是要@Component声明下,而使用独立容器是由容器自己管理websocket的,但在springboot中连容器都是spring管理的。 *

* 虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。 * * @author sam * @since 2017/9/13 */ @ServerEndpoint("/ws/chatRoom/{userName}") //WebSocket客户端建立连接的地址 @Component public class ChatRoomServerEndpoint { /** * 存活的session集合(使用线程安全的map保存) */ private static Map livingSessions = new ConcurrentHashMap<>(); /** * 建立连接的回调方法 * * @param session 与客户端的WebSocket连接会话 * @param userName 用户名,WebSocket支持路径参数 */ @OnOpen public void onOpen(Session session, @PathParam("userName") String userName) { livingSessions.put(session.getId(), session); sendMessageToAll(userName + " 加入聊天室"); } /** * 收到客户端消息的回调方法 * * @param message 客户端传过来的消息 * @param session 对应的session */ @OnMessage public void onMessage(String message, Session session, @PathParam("userName") String userName) { sendMessageToAll(userName + " : " + message); } /** * 发生错误的回调方法 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } /** * 关闭连接的回调方法 */ @OnClose public void onClose(Session session, @PathParam("userName") String userName) { livingSessions.remove(session.getId()); sendMessageToAll(userName + " 退出聊天室"); } /** * 单独发送消息 * * @param session * @param message */ public void sendMessage(Session session, String message) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } } /** * 群发消息 * * @param message */ public void sendMessageToAll(String message) { livingSessions.forEach((sessionId, session) -> { sendMessage(session, message); }); } }

4、前端页面实现




    
    聊天室
    


聊天室


用户:
消息:

demo项目源码如下:

https://download.csdn.net/download/asd051377305/87853400

5、使用方法:启动application启动类,然后右键在浏览器中打开chat.html,可以打开2个页面,这样就可以双人聊天交流

Spring Boot 系列 - WebSocket 简单使用(建立一个网页聊天室)_第1张图片

Spring Boot 系列 - WebSocket 简单使用(建立一个网页聊天室)_第2张图片

你可能感兴趣的:(Java学习,spring,boot,websocket,java)