项目集成websocket

项目集成websocket

一、引入websocket的依赖包

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>5.1.9.RELEASE</version>
            <scope>compile</scope>
</dependency>

二、WebSocketConfig,启动websocket的支持

@Configuration
public class WebSocketConfig {

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

三、WebSocketServer

WebSocket是类似客户端服务端的形式(采用ws协议)
@ServerEndpoint(“/imserver/{userId}”) 、@Component启用即可,然后在里面实现@OnOpen开启连接,@onClose关闭连接,@onMessage接收消息等方法。

@ServerEndpoint("/websocket/{sid}")
@Component
public class WebSocketServer {
	private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

	// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
	private static int onlineCount = 0;

	// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
	private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();

	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
	private Session session;

	// 接收sid
	private String sid = "";

	/**
	 * 连接建立成功调用的方法
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("sid") String sid) {
		this.session = session;
		webSocketSet.add(this); // 加入set中
		addOnlineCount(); // 在线数加1
		log.info("有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount());
		this.sid = sid;

		try {
			sendMessage("连接成功");
		} catch (IOException e) {
			log.error("websocket IO异常");
		}
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose() {
		webSocketSet.remove(this); // 从set中删除
		subOnlineCount(); // 在线数减1
		log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 *
	 * @param message 客户端发送过来的消息
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		log.info("收到来自窗口" + sid + "的信息:" + message);
		// 群发消息
		for (WebSocketServer item : webSocketSet) {
			try {
				item.sendMessage(message);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		log.error("发生错误");
		error.printStackTrace();
	}

	/**
	 * 实现服务器主动推送字符串
	 */
	public void sendMessage(String message)
		throws IOException {
		this.session.getBasicRemote().sendText(message);
	}

	/**
	 * 实现服务器主动推送对象
	 */
	public void sendObject(Object obj)
		throws IOException,
		EncodeException {
		this.session.getBasicRemote().sendObject(obj);
	}

	/**
	 * 群发自定义消息
	 */
	public static void sendInfoObj(Object message, @PathParam("sid") String sid)
		throws EncodeException {
		log.info("推送消息到窗口" + sid + ",推送内容:" + message);
		for (WebSocketServer item : webSocketSet) {
			try {
				// 这里可以设定只推送给这个sid的,为null则全部推送
				if (sid == null) {
					item.sendObject(message);
				} else if (item.sid.equals(sid)) {
					item.sendObject(message);
				}
			} catch (IOException e) {
				continue;
			}
		}
	}

	/**
	 * 群发自定义消息
	 */
	public static void sendInfo(String message, @PathParam("sid") String sid)
		throws IOException {
		log.info("推送消息到窗口" + sid + ",推送内容:" + message);
		for (WebSocketServer item : webSocketSet) {
			try {
				// 这里可以设定只推送给这个sid的,为null则全部推送
				if (sid == null) {
					item.sendMessage(message);
				} else if (item.sid.equals(sid)) {
					item.sendMessage(message);
				}
			} catch (IOException e) {
				continue;
			}
		}
	}

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

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

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

}

四、推送消息

调用WebSocketServer中相关send方法
定义统一的发送消息的类

@Component("sendMessageTask")
@AllArgsConstructor
public class SendMessageTask {

	@Resource
	private AlarmService alarmService;

	/**
	 * WebSocket执行推送操作
	 */
	public void send(Map<String,Object> map) {
		try {
			WebSocketServer.sendInfo(map.toString(), "1");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

在业务层调用SendMessageTask的send()方法,传入推送的数据
注:map是泛型根据业务需求定义推送的格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值