SpringCloud Alibaba整合WebSocket

目录

一、项目添加webSocket的Maven依赖

二、创建webSocket的配置类

 三、创建webSocket的服务类

四、Websocket在线模拟请求工具

五、集群搭建


一、项目添加webSocket的Maven依赖


		org.springframework.boot
		spring-boot-starter-websocket

二、创建webSocket的配置类

package com.*.config;

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

/**
 * @ClassName: WebSocketConfig
 * @Description: WebSocket的配置类
 * @Author: *
 * @Date 2022-07-26 10:10:43
 */
@Configuration
public class WebSocketConfig {

	/**
	 * 注入ServerEndpointExporter
	 * 此bean会自动注册使用@ServerEndpoint注解声明的Websocket
	 * @return
	 */
	@Bean
	public ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}
}

 三、创建webSocket的服务类

package com.*;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @ClassName: WebSocketServer
 * @Description: WebSocket的服务类
 * @Author: *
 * @Date 2022-07-26 10:52:08
 */
@Component
@Slf4j
@Data
@ServerEndpoint("/webSocketServer/{userId}")  //路径
public class WebSocketServer {

	//用来存放每个客户端对应的userId
	public static CopyOnWriteArrayList userIdList = new CopyOnWriteArrayList<>();

	//与某个客户端建立的连接会话,通过此会话给客户端发送数据
	private Session session;

	//用来存放每个客户端对应的WebSocketServer对象
	private static ConcurrentHashMap webSocketServerMap = new ConcurrentHashMap<>();

	//用来存放每个客户端对应的Session对象
	private static ConcurrentHashMap sessionMap =new ConcurrentHashMap<>();

	/**
	 * 连接成功调用的方法
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam(value="userId") String userId) {
		try {
			this.session = session;
			if (userIdList.contains(userId)){
				//互踢逻辑:同一个用户多次登录,服务端只保存同一个用户最后一次登录的通道
				onClose(userId);
			}
			userIdList.add(userId);
			webSocketServerMap.put(userId, this);
			sessionMap.put(userId, session);
			log.info("【websocket-用户"+userId+"新建连接】,当前连接数:" + sessionMap.size());
		} catch (Exception e) {
		}
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose(@PathParam(value="userId") String userId) {
		try {
			userIdList.remove(userId);
			webSocketServerMap.remove(userId);
			sessionMap.remove(userId);
			log.info("【websocket-用户"+userId+"断开连接】,当前连接数:" + sessionMap.size());
		} catch (Exception e) {
		}
	}

	/**
	 * 收到客户端消息后调用的方法
	 * @param message
	 */
	@OnMessage
	public void onMessage(Session session, String message) {
		if (session != null && session.isOpen()) {
			try {
				//回应客户端发送的消息(此处用于心跳检测,自定义其他逻辑)
				session.getAsyncRemote().sendText(message);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 发送错误时的处理
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		log.error("用户错误,原因:"+error.getMessage());
		error.printStackTrace();
	}

	//广播消息
	public void sendAllMessage(String message) {}

	//单点消息
	public void sendOneMessage(String userId, String message) {
		Session session = sessionMap.get(userId);
		if (session != null && session.isOpen()) {
			try {
				log.info("【websocket-用户"+userId+"单点消息】:" + message);
				session.getAsyncRemote().sendText(message);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	//多点消息
	public void sendMoreMessage(String[] userIds, String message) {}

}

四、Websocket在线模拟请求工具

http://www.jsons.cn/websocket/

五、集群搭建

集群环境线,应考虑配合使用Redi或MQ,进行消息同步。

你可能感兴趣的:(学习笔记,websocket,spring,cloud,spring,boot,java)