springboot整合websocket小demo实现消息推送

首先添加maven依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

然后创建一个配置类

@Configuration
public class WebSocketConfig {
    
    

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
    
    
        return new ServerEndpointExporter();
    }
}

在添加一个sockerServer

@Component
@ServerEndpoint(value = "/socketServer/{clientId}")//通过这个路径可以让客户端链接到server
public class WebSocketServer {
    
    

    private Session session;
    public static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
    public static ConcurrentHashMap<String, String> sessionIds = new ConcurrentHashMap<>();

    public void setSession(Session session) {
    
    
        this.session = session;
    }
    //服务端被链接以后要做的事情
    @OnOpen
    public void open(Session session, @PathParam(value = "clientId") String clientId) {
    
    
        this.session = session;
        sessionPool.put(clientId, session);
        sessionIds.put(session.getId(), clientId);
    }
    //接收到消息时
    @OnMessage
    public void onMessage(String message) {
    
    
        String sessionId = session.getId();
        sendMessage(message, sessionIds.get(sessionId));
    }
    //关闭链接是
    @OnClose
    public void onClose() {
    
    
        sessionPool.remove(sessionIds.get(session.getId()));
        sessionIds.remove(session.getId());
    }
    //出现异常时
    @OnError
    public void onError(Session session, Throwable error) {
    
    
        error.printStackTrace();
    }
    //群发消息
    public synchronized static void sendMessage(String message, List<Integer> clientId) {
    
    
        for (Integer userId : clientId) {
    
    
            Session s = sessionPool.get(userId + "");
            if (s != null) {
    
    
                try {
    
    
                    s.getBasicRemote().sendText(message);
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
    //单发消息
    public synchronized static void sendMessage(String message, String clientId) {
    
    
        Session s = sessionPool.get(clientId);
        if (s != null) {
    
    
            try {
    
    
                s.getBasicRemote().sendText(message);
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

}

然后测试一下,启动项目
在页面上 websocket在线测试
输入路径建立链接
在这里插入图片描述
发送消息
在这里插入图片描述
就可以通过消息队列或者一些接口对这个方法调用完成推送

Guess you like

Origin blog.csdn.net/m0_48358308/article/details/114299889