java WebSocket带参数处理使用

1、webSocket实现代码

复制代码
@Component
public class WebSocketStompConfig {
    //这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket
    // ,如果你使用外置的tomcat就不需要该配置文件
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocket {
    private static int onlineCount = 0;
    private static ConcurrentHashMap<String, Set<Session>> webSocketMap  = new ConcurrentHashMap<>();
    private Session session;

    @OnOpen
    public void onOpen(Session session) {

        this.session = session;
        // 获取URL中的参数
        Map<String, List<String>> params = session.getRequestParameterMap();
        List<String> funcTypes = params.get("funcType");

        if (!funcTypes.isEmpty()) {
            // 取出funcType参数的值
            String funcType = funcTypes.get(0);

            if(webSocketMap.containsKey(funcType)){
                webSocketMap.get(funcType).add(session);
            }else{
                Set<Session> sessionSet = new HashSet<>();
                sessionSet.add(session);
                webSocketMap.put(funcType,sessionSet);
            }
        }

        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
    }

    @OnClose
    public void onClose(){
        webSocketMap=new ConcurrentHashMap<>();
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }

    public static void sendMessage(Session session, String message) throws IOException {
        session.getBasicRemote().sendText(message);
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocket.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocket.onlineCount--;
    }

    public static void setOnlineCount(int onlineCount) {
        WebSocket.onlineCount = onlineCount;
    }

    public static ConcurrentHashMap<String, Set<Session>> getWebSocketMap() {
        return webSocketMap;
    }

    public static void setWebSocketMap(ConcurrentHashMap<String, Set<Session>> webSocketMap) {
        WebSocket.webSocketMap = webSocketMap;
    }

    public Session getSession() {
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    /**
     * 发送自定义消息
     * */
    public static void sendInfo(String message,String funcType) throws Exception {
        if(webSocketMap.containsKey(funcType)){
            Set<Session> sessionSet = webSocketMap.get(funcType);
            if(sessionSet!=null){
                for (Session session : sessionSet) {
                    if(session.getBasicRemote()!=null){
                        session.getBasicRemote().sendText(message);
                    }
                }
            }
        }else{
            log.error("订阅类型:"+funcType+",不存在!");
            throw new Exception("连接已关闭,请刷新页面后重试");
        }

    }

}

二、java代码调用,往websocker赋数据

复制代码
WebSocket.sendInfo(JSON.toJSONString("sdfasd232"),"3");

三、测试是否连接成功以及推送信息

四、前端代码处理

复制代码
/**
 * 初始化websocket连接
 */
function initWebSocket() {
	var websocket = null;
	if('WebSocket' in window) {
		websocket = new WebSocket("ws://127.0.0.1:8080/webSocket?funcType=3" );
	} else {
		alert("该浏览器不支持websocket!");
	}
	websocket.onopen = function(event) {
		console.log("建立连接");
		websocket.send('Hello WebSockets!');
	}
	websocket.onclose = function(event) {
		console.log('连接关闭')
		reconnect(); //尝试重连websocket
	}
	//建立通信后,监听到后端的数据传递
	websocket.onmessage = function(event) {
		let data = JSON.parse(event.data);
		//业务处理....
		if(data.step == 1){
		   alert(data.msg);
		}
	}
	websocket.onerror = function() {
		// notify.warn("websocket通信发生错误!");
		// initWebSocket()
	}
	window.onbeforeunload = function() {
		websocket.close();
	}
// 重连
function reconnect() {
	console.log("正在重连");
	// 进行重连
	setTimeout(function () {
		initWebSocket();
	}, 1000);
}
相关推荐
mjhcsp32 分钟前
C++ 三分查找:在单调与凸函数中高效定位极值的算法
开发语言·c++·算法
我命由我1234536 分钟前
Element Plus 组件库 - Select 选择器 value 为 index 时的一些问题
开发语言·前端·javascript·vue.js·html·ecmascript·js
沐知全栈开发37 分钟前
MySQL 删除数据库指南
开发语言
qq. 28040339842 小时前
js 原型链分析
开发语言·javascript·ecmascript
大飞哥~BigFei2 小时前
RabbitMq消费延迟衰减重试实现思路
java·分布式·rabbitmq
Elnaij2 小时前
从C++开始的编程生活(13)——list和浅谈stack、queue
开发语言·c++
有趣的野鸭2 小时前
JAVA课程十一次实验课程主要知识点示例
java·前端·数据库
q***07144 小时前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
java·spring boot·后端
q***49864 小时前
Spring Boot 3.4 正式发布,结构化日志!
java·spring boot·后端
一晌小贪欢6 小时前
【Python数据分析】数据分析与可视化
开发语言·python·数据分析·数据可视化·数据清洗