java WebSocket带参数处理使用

2023-12-13 11:45:45

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);
}

文章来源:https://blog.csdn.net/qq_35228658/article/details/134840241
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。