1.添加Maven依赖
org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-websocket 1.3.5.RELEASE 复制代码
2.webSocket配置
/** * webSocket配置 * @author 陈梓平 * @date 2017/10/25. */@Configurationpublic class WebSocketConfig { /** * 注入ServerEndpointExporter, * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint * @return */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}复制代码
3.自定义websocket
/** * 自定义websocket * @author 陈梓平 * @date 2017/10/25. */@ServerEndpoint(value = "/websocket")@Componentpublic class CustomWebSocket { /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/ private static int onlineCount = 0; /**concurrent包的线程安全Set,用来存放每个客户端对应的CumWebSocket对象。*/ private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet (); /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/ private Session session; private static final Logger log = LoggerFactory.getLogger(CustomWebSocket.class); /** * 连接建立成功调用的方法 * @param session */ @OnOpen public void onOpen(Session session) { this.session = session; //加入set中 webSocketSet.add(this); //添加在线人数 addOnlineCount(); log.info("新连接接入。当前在线人数为:"+getOnlineCount()); try { sendMessage("假装有内容"); } catch (IOException e) { e.printStackTrace(); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { //从set中删除 webSocketSet.remove(this); //在线数减1 subOnlineCount(); log.info("有连接关闭。当前在线人数为:"+getOnlineCount()); } /** * 收到客户端消息后调用 * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { log.info("客户端发送的消息:"+message); sendAll(message); } /** * 暴露给外部的群发 * @param message * @throws IOException */ public static void sendInfo(String message) throws IOException { sendAll(message); } /** * 群发 * @param message */ private static void sendAll(String message) { Arrays.asList(webSocketSet.toArray()).forEach(item -> { CustomWebSocket customWebSocket = (CustomWebSocket) item; //群发 try { customWebSocket.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } }); } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.info("有异常啦"); error.printStackTrace(); } /** * 减少在线人数 */ private void subOnlineCount() { CustomWebSocket.onlineCount--; } /** * 添加在线人数 */ private void addOnlineCount() { CustomWebSocket.onlineCount++; } /** * 当前在线人数 * @return */ public static synchronized int getOnlineCount() { return onlineCount; } /** * 发送信息 * @param message * @throws IOException */ public void sendMessage(String message) throws IOException { //获取session远程基本连接发送文本消息 this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); }}复制代码
4.前端页面
WebSocketWelcome 复制代码
5.测试