在实现消息推送的项目中往往需要 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个页面,这样就可以双人聊天交流

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。