springboot集成websocekt

本文将详细介绍如何在SpringBoot项目中集成WebSocket,从配置WebSocket到实现消息推送,包括服务器端配置、客户端连接、Stomp协议的应用,以及实战示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

//注入ServerEndpointExporter
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

 


 * @ Author     :weisheng.
 * @ Date       :Created in AM 10:43 2018/6/8 0008
 * @ Description:websocket服务
 * @ Modified By:
 * @Version: $version$
 */

import com.google.gson.Gson;
import com.nork.common.model.LoginUser;
import com.sandu.common.LoginContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author weisheng
 * @Title:
 * @Package
 * @Description:
 * @date 2018/6/8 0008AM 10:43
 */
@Slf4j
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {

    private static Gson gson = new Gson();

    private Session session;
    private static Map<Integer, Session> sessionPool = new HashMap<>();
    private static Map<String, Integer> sessionIds = new HashMap<>();

    //连接客户端创建session
    @OnOpen
    public void open(Session session) {
        log.info("连接websocket客户端创建session开始");
        LoginUser loginUser = LoginContext.getLoginUser(LoginUser.class);
        if (loginUser == null) {
            onClose();
        }
        this.session = session;
        sessionPool.put(loginUser.getId(), session);
        sessionIds.put(session.getId(), loginUser.getId());
        log.info("连接websocket客户端创建session完成");
    }


    //接受客户端消息
    @OnMessage
    public void onMessage(String message) {

    }


    //关闭与客户端连接
    @OnClose
    public void onClose() {
        sessionPool.remove(sessionIds.get(session.getId()));
        sessionIds.remove(session.getId());
        log.info("socket关闭连接");
    }


    //发生错误时触发
    @OnError
    public void onError(Session session, Throwable error) {
        log.info("socket连接异常,关闭连接",error);
        error.printStackTrace();
    }


    //向客户端发送消息
    public static void sendMessage(Object obj, Integer userId) {
        String message = gson.toJson(obj);
        Session s = sessionPool.get(userId);
        if (s != null) {

            try {
                s.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    //获取客户端连接数
    public static int getOnlineNum(){
        return sessionPool.size();
    }

    //获取所有客户端信息
    public static String getOnlineUsers(){
        StringBuffer users = new StringBuffer();
        for(String key : sessionIds.keySet()){
            users.append(sessionIds.get(key)+",");
        }
        return users.toString();
    }


    //向所有连接的客户端发送消息
    public static void sendAll(String msg){
        for(String key : sessionIds.keySet()){
            sendMessage(msg,sessionIds.get(key));
        }

    }
}





































 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值