1. 程式人生 > >【WebSocket】---實現定時推送比特幣交易信息

【WebSocket】---實現定時推送比特幣交易信息

per 有一個 clas ins stack 編號 known onu dhx

實現定時推送比特幣交易信息

實現功能:跟虛擬幣交易所一樣,時時更新當前比特幣的價格,最高價,最低價,買一價等等......

提示:(1)本篇博客是在上一遍基礎上搭建,上一篇博客地址:【WebSocket】---實現遊戲公告功能。

(2)相關源碼會在其它有關websocket案例寫完,寫在gitHub上,後期會貼上地址。

先看效果演示

技術分享圖片

當前的信息就是虛擬幣交易所最新BTC的數據信息。

我們看到每隔1秒都會更新一次最新的比特幣當前信息。(截止到我發這篇博客時,比特幣當前價格:6473美元左右)

一、案例解析

1、如何調用虛擬幣的接口

你想獲得BTC最新的價格信息,你首先的有它的相關接口,不然如何獲取數據,我是在阿裏雲上購買的。

具體步驟:

(1)登陸阿裏雲-->雲市場-->股票行情於匯率

(2)有很多企業都有相關接口有股票也有虛擬幣

(3)我選的一家名字叫:實時加密貨幣行情+推送

網址:https://market.aliyun.com/products/57000002/cmapi029361.html?spm=5176.730005.productlist.d_cmapi029361.xtd4I4

(4)對於接口都有相關說明,按照它的說明就可以獲取json數據。同時也可以在線調試。

2、通過定時任務時時向客戶端發送消息

因為需要服務端隔一定時間向客戶端發送消息,所有服務端用定時任務再好不過了。

/**
 * //要啟動定時任務記得在啟動類上添加下面兩個註解
 * @ComponentScan(basePackages="com.jincou.websocket")
 * @EnableScheduling
 * 功能描述:股票推送,這裏只需通過定時任務向客服端發送消息
 */
@Component
public class CoinSchedule {
    @Autowired
    private WebSocketService ws;
    
    //代表每一秒執行一次任務
    @Scheduled(fixedRate=1000)
    public
void coinInfo(){ ws.sendCoinInfo(); } }

3、WebSocketService類

消息模版工具類,用來推送消息用的。

/**
 * 功能描述:簡單消息模板,用來推送消息
 */
@Service
public class WebSocketService {

    @Autowired
    private SimpMessagingTemplate template;
 
    /**
     * 功能描述:Coin版本,虛擬幣信息推送
     */
    public void sendCoinInfo() {

        //CoinService.getStockInfo()已經把json數據轉為實體對象
        CoinResult coinResult = CoinService.getStockInfo();
        
  String msgTpl = "虛擬幣名稱: %s ;代碼: %s; 現價格: %s元 ;買一價: %s ; 買一量: %s ; 買二價: %s ; 賣二量: %s;";
        CoinResult.Obj  obj=coinResult.getObj();
        if (null != obj) {
            //將 %s 替換成實際值
            String msg = String.format(msgTpl, obj.getName(), obj.getSecurityCode(), obj.getNow(),
                    obj.getBid1(), obj.getBid1Volume(), obj.getAsk1(), obj.getAsk1Volume());

            //前面參數是訂閱地址,後面參數是消息信息(也就是比特幣時時消息)
            template.convertAndSend("/topic/coin_info",new OutMessage(msg));
        }
    }
}

4、CoinService調用接口,並把json格式數據賦值給對象

這個是最關鍵的一步,主要做的事:去調遠程接口獲取數據後,將數據封裝到自己所寫的bean實體中。

import java.util.HashMap;
import java.util.Map;
import com.jincou.websocket.model.CoinResult;
import com.jincou.websocket.utils.HttpUtils;
import com.jincou.websocket.utils.JsonUtils;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;

/**
 * 功能描述:接口服務,調用虛擬幣行情接口
 */
public class CoinService {

    public static CoinResult getStockInfo(){
         String host = "http://alirm-gbdc.konpn.com";
            String path = "/query/gbdc";
            String method = "GET";
            String appcode = "056ed9cdaa674647b6c04b87fe394fcb";
            Map<String, String> headers = new HashMap<String, String>();
            //最後在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
            headers.put("Authorization", "APPCODE " + appcode);
            Map<String, String> querys = new HashMap<String, String>();
            //BTC代表返回比特幣相關信息,如果這裏傳入ETH那就代表返回以太坊信息
            querys.put("symbol", "BTC");

        try {
            //返回連接信息,如果裏面帶有200,說明連接接口成功
            HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);

            //將response的body信息轉為字符串
            String responseText=EntityUtils.toString(response.getEntity());

            //上面部分只要根據你購買的api接口說明操作就可以,下面才是你需要處理的
            
            //將json格式的字符串(根據一定規則)賦值給實體對象(JsonUtils是自己的一個工具類)
            CoinResult coinResult = JsonUtils.objectFromJson(responseText, CoinResult.class);

            System.out.println("控制臺打印虛擬幣當前信息=======================================");
            System.out.println(coinResult.toString());
            return coinResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

5、json格式如何封裝到實體

這步主要講,將json格式字符串通過工具類封裝到實體對象需要滿足的規則:

CoinResult coinResult = JsonUtils.objectFromJson(responseText, CoinResult.class); //看這步所需要滿足的規則

(1)先看接口的json格式

{"Code":0,"Msg":"",
    "Obj":{
    "B1":271.100,     --買一
    "B1V":129,        --買一量
    "B2":0,           --買二
    "B2V":0,
    "B3":0,           --買三
    "B3V":0,
    "B4":0,           --買四
    "B4V":0,        
    "B5":0,           --買五
    "B5V":0,
    "S1":271.150,    --賣一
    "S1V":20,        --賣一量
    "S2":0,          --賣二
    "S2V":0,
    "S3":0,          --賣三
    "S3V":0,
    "S4":0,          --賣四
    "S4V":0,
    "S5":0,          --賣五
    "S5V":0,
    "ZT":280.85,       --漲停價
    "DT":259.19,       --跌停價
    "O":270.39,        --今開
    "H":271.69,        --最高
    "L":270.14,        --最低
    "YC":270.55,       --昨收
    "A":35513202100.0, --交易額
    "V":130972,        --交易量
    "P":271.14,        --當前價
    "Tick":1529911046, --標準時間戳
    "N":"比特幣",       --品種名
    "M":"",            --市場
    "S":"BTC",         --品種代碼
    "C":""             --編號
    }
}

(2)在看我的實體對象屬性

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class CoinResult {

    //狀態碼,0代表成功
    @JsonProperty("Code")
    private int Code;
    //具體數據(註意這裏json用{表示,所有代表對象
    @JsonProperty("Obj")
    private Obj obj;

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)

    public static class Obj {

        //虛擬幣代碼
        @JsonProperty("S")
        private String securityCode;

        //虛擬幣名稱
        @JsonProperty("N")
        private String name;

        //現在價格
        @JsonProperty("P")
        private double now;

        //最高價格
        @JsonProperty("H")
        private double high;

        //最低價格
        @JsonProperty("L")
        private double low;

        //買一價
        @JsonProperty("B1")
        private double bid1;

        //買一量
        @JsonProperty("B1V")
        private int bid1Volume;

        //賣一價
        @JsonProperty("S1")
        private double ask1;

        //賣一量
        @JsonProperty("S1V")
        private double ask1Volume;
        
        //已成交價,這個接口沒有提供,只要記住{}代表是對象,【】代表是結合那就需要集合接受:如下
        //private List<Transaction> transactions;
    }
}

總結規則:

(1)json中的名字和實體中屬性名一定要一致才能賦值。

(2)如果只要有一個你名字一致而數據類型不一樣,那麽就會整體賦值失敗返回null。比如這裏B1價,它明明是double,如你你用int接收,那麽就會返回null。

(3)json格式中的數據如果是{},那麽可以用對象來接收,好比這的"Obj":{...},如果是{[],[]},那就需要List<對象>來接收

6、看前端

前端沒啥好說的只需要訂閱:/topic/coin_info 這個地址就可以接收服務端時時發來的消息了。

想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麽別想,要麽多做。中校【20】

【WebSocket】---實現定時推送比特幣交易信息