先上效果圖,頁面與後端交互:
第一步:開始上核心代碼
package com.xing.websocket.web.config;
/**
* @Class AppConfig
* @Author 作者姓名:劉興
* @Version 1.0
* @Date 創建時間:2020-03-21 11:48
* @Copyright Copyright by Liuxing
* @Direction 類說明
*/
public class AppConfig {
/**
* 被訂閱的頻道-消息
*/
public static final String SUBSCRIBE = "/topic/message";
/**
* 被訂閱的頻道-價格波動
*/
public static final String SUBSCRIBE_MARKET = "/topic/market";
/**
* stomp節點
*/
public static final String ENDPOINT = "/webSocketServer";
/**
* 消息代理
*/
public static final String BROKER = "/topic";
}
package com.xing.websocket.web.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
/**
* @title websocket配置
* @author yc 2018年5月21日
*/
@Configuration
//表示開啓使用STOMP協議來傳輸基於代理的消息,Broker就是代理的意思。
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
/**
* @title 用來配置消息代理,由於我們是實現推送功能,這裏的消息代理是/topic
* @author yc 2018年5月21日
*/
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 訂閱Broker名稱
registry.enableSimpleBroker(AppConfig.BROKER );
// 全局使用的消息前綴(客戶端訂閱路徑上會體現出來)
registry.setApplicationDestinationPrefixes("/app");
// 點對點使用的訂閱前綴(客戶端訂閱路徑上會體現出來),不設置的話,默認也是/user/
//registry.setUserDestinationPrefix("/user/");
}
/**
* @title 表示註冊STOMP協議的節點,並指定映射的URL。
* @author yc 2018年5月21日
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 允許使用socketJs方式訪問,訪問點爲webSocketServer,允許跨域
// 在網頁上我們就可以通過這個鏈接
// http://localhost:8080/webSocketServer
// 來和服務器的WebSocket連接
registry.addEndpoint(AppConfig.ENDPOINT )
.addInterceptors(new HttpSessionHandshakeInterceptor() )
.setAllowedOrigins("*")
.withSockJS();
}
}
package com.xing.websocket.util.websocket;
import com.xing.websocket.web.var.SystemVarConstants;
import com.xing.websocket.web.config.AppConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Class WebSocketBasicUtils
* @Author 作者姓名:劉興
* @Version 1.0
* @Date 創建時間:2020-04-02 14:33
* @Copyright Copyright by Liuxing
* @Direction 類說明
*/
public class WebSocketBasicUtils {
public final static Logger logger = LoggerFactory.getLogger( WebSocketBasicUtils.class );
public static void sendMessageToTopic( String subScribeType , String message ){
//廣播開始發威
if( SystemVarConstants.simpMessagingTemplate != null && StringUtils.isNotBlank( subScribeType )){
switch ( subScribeType ){
case AppConfig.SUBSCRIBE: {
//消息廣播給所有註冊到 AppConfig.SUBSCRIBE 的客戶端
SystemVarConstants.simpMessagingTemplate.convertAndSend( AppConfig.SUBSCRIBE , message ) ;
}
case AppConfig.SUBSCRIBE_MARKET: {
SystemVarConstants.simpMessagingTemplate.convertAndSend( AppConfig.SUBSCRIBE_MARKET , message ) ;
}
}
}else{
logger.error( "..... SystemVarConstants.simpMessagingTemplate is null ....." );
};
}
}
package com.xing.websocket.util.websocket;
import com.xing.websocket.web.config.AppConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.MessageFormat;
import java.util.Formatter;
/**
* @Class WebSocketMarketUtils
* @Author 作者姓名:劉興
* @Version 1.0
* @Date 創建時間:2020-03-24 10:14
* @Copyright Copyright by Liuxing
* @Direction 類說明
*/
public class WebSocketMarketUtils extends WebSocketBasicUtils {
private static Logger logger = LoggerFactory.getLogger( WebSocketMarketUtils.class ) ;
private final static String INFO = "INFO" ;
private final static String WARN = "WARN" ;
private final static String ERROR = "ERROR" ;
/****
* 給綁定到:AppConfig.SUBSCRIBE_SPIDER_MARKET 的鏈接發送數據
* @param message
*/
public static void sendSpiderMessage( String message ){
if( StringUtils.isNotBlank( message )) {
logger.info(message);
if( StringUtils.isNotBlank( message )) {
sendMessageToTopic( AppConfig.SUBSCRIBE_MARKET , message );
}
}
}
/***
* 模擬slf4j打印日誌的方式傳入值
* @param message
* @param data
*/
private static void sendMessage( String message , String level , Object... data ){
if(StringUtils.isNotBlank( message ) && data != null ) {
//message = message.replace("{}" , "%s") ;
message = MessageFormat.format(message, data);
if( WARN.equals( level ) ){
message = new StringBuilder("<span style='color:orangered;'>").append( message ).append( "</span>" ).toString() ;
}else if( ERROR.equals( level ) ){
message = new StringBuilder("<span style='color:chocolate;'>").append( message ).append( "</span>" ).toString() ;
}
sendSpiderMessage( message ) ;
}else{
logger.error( "..... paramter is null ....." );
};
}
/***
* 模擬slf4j打印-ERROR-日誌的方式傳入值
* @param message
* @param data
*/
public static void sendErrorSpiderMessage( String message , Object... data ){
sendMessage( message , ERROR , data ) ;
}
/***
* 模擬slf4j打印-ERROR-日誌的方式傳入值
* @param message
* @param data
*/
public static void sendWarnSpiderMessage( String message , Object... data ){
sendMessage( message , WARN , data ) ;
}
/***
* 模擬slf4j打印-INFO-日誌的方式傳入值
* @param message
* @param data
*/
public static void sendSpiderMessage( String message , Object... data ){
sendMessage( message , INFO , data ) ;
}
}
package com.xing.websocket.web.runner;
import com.xing.websocket.web.var.SystemVarConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
/**
* @Class SpiderCommandLineRunner
* @Author 作者姓名:劉興
* @Version 1.0
* @Date 創建時間:2020-03-24 09:33
* @Copyright Copyright by Liuxing
* @Direction 類說明 系統初始化啓動時會進入
* 實現了 CommandLineRunner 接口的 Component 會在所有 Spring Beans 初始化完成之後, 在 SpringApplication.run() 執行之前完成
*/
@Component
public class SpiderCommandLineRunner implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(SpiderCommandLineRunner.class);
@Autowired
private SimpMessagingTemplate simpMessagingTemplate ;
@Override
public void run(String... args) throws Exception {
logger.info("...init resources by implements CommandLineRunner...");
SystemVarConstants.simpMessagingTemplate = simpMessagingTemplate ;
logger.info(" 初始化系統 WebSocket 消息模板: SystemVarConstants.simpMessagingTemplate ....");
}
}
package com.xing.websocket.web.var;
import org.springframework.messaging.simp.SimpMessagingTemplate;
/**
* @Class SystemVarConstants
* @Author 作者姓名:劉興
* @Version 1.0
* @Date 創建時間:2020/2/17 13:14
* @Copyright Copyright by
* @Direction 類說明
*/
public class SystemVarConstants {
public static SimpMessagingTemplate simpMessagingTemplate ; // 簡單的消息推送模板
}
具體邏輯我就不說了,請直接上碼雲取吧!