快速实用-SpringBoot2整合WebSocket Demo

WebSocket:说实话,主要目的就是替代长轮询实现实时消息推送

例如:扫码登录、异步下的title消息提示等等

直接上码:

导入pom依赖

 

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

编写配置类

package com.example.demo.config.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
 * @Author: Chang Yu
 * @Date: 9/27/2019 2:28 PM
 */
@Configuration
public class WebSocketConfig {
 @Bean
 public ServerEndpointExporter serverEndpointExporter() {
 return new ServerEndpointExporter();
 }
}

编写WebSocket

package com.example.demo.config.websocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @Author: Chang Yu
 * @Date: 9/27/2019 2:26 PM
 */
@ServerEndpoint("/websocket/CalculateNotr")
@Component
public class MessageNotr {
 public static Logger log = LoggerFactory.getLogger(MessageNotr.class);
 private static final AtomicInteger OnlineCount = new AtomicInteger(0);
 // concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。
 private static CopyOnWriteArraySet SessionSet = new CopyOnWriteArraySet();
 @OnOpen
 public void onOpen(Session session) {
 SessionSet.add(session);
 int cnt = OnlineCount.incrementAndGet(); // 在线数加1
 log.info("有连接加入,当前连接数为:{}", cnt);
// SendMessage(session, "连接成功");
 }
 /**
 * 连接关闭调用的方法
 */
 @OnClose
 public void onClose(Session session) {
 SessionSet.remove(session);
 int cnt = OnlineCount.decrementAndGet();
 log.info("有连接关闭,当前连接数为:{}", cnt);
 }
 /**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 */
 @OnMessage
 public void onMessage(String message, Session session) {
 log.info("来自客户端的消息:{}", message);
 SendMessage(session, "收到消息,消息内容:" + message);
 }
 /**
 * 出现错误
 *
 * @param session
 * @param error
 */
 @OnError
 public void onError(Session session, Throwable error) {
 log.error("发生错误:{},Session ID: {}", error.getMessage(), session.getId());
 error.printStackTrace();
 }
 /**
 * 发送消息,实践表明,每次浏览器刷新,session会发生变化。
 *
 * @param session
 * @param message
 */
 public static void SendMessage(Session session, String message) {
 try {
 session.getBasicRemote().sendText(message);
// session.getBasicRemote().sendText(String.format("%s (From Server,Session ID=%s)", message, session.getId()));
 } catch (IOException e) {
 log.error("发送消息出错:{}", e.getMessage());
 e.printStackTrace();
 }
 }
 /**
 * 群发消息
 *
 * @param message
 * @throws IOException
 */
 public static void BroadCastInfo(String message) {
 try {
 for (Session session : SessionSet) {
 if (session.isOpen()) {
 SendMessage(session, message);
 }
 }
 } catch (Exception e) {
 log.error("发送消息出错:{}", e.getMessage());
 e.printStackTrace();
 }
 }
 /**
 * 指定Session发送消息
 *
 * @param sessionId
 * @param message
 * @throws IOException
 */
 public static void SendMessage(String message, String sessionId) {
 try {
 Session session = null;
 for (Session s : SessionSet) {
 if (s.getId().equals(sessionId)) {
 session = s;
 break;
 }
 }
 if (session != null) {
 SendMessage(session, message);
 } else {
 log.warn("没有找到你指定ID的会话:{}", sessionId);
 }
 } catch (Exception e) {
 log.error("发送消息出错:{}", e.getMessage());
 e.printStackTrace();
 }
 }
}

测一波

快速实用-SpringBoot2整合WebSocket Demo

快速实用-SpringBoot2整合WebSocket Demo

快速实用-SpringBoot2整合WebSocket Demo

快速实用-SpringBoot2整合WebSocket Demo

简单吧,学会了吗,对于分布式下的webSocket,会话可以结合Redis进行共享。


分享到:


相關文章: