【WebSocket】---實現定時推送比特幣交易信息
實現定時推送比特幣交易信息
實現功能:跟虛擬幣交易所一樣,時時更新當前比特幣的價格,最高價,最低價,買一價等等......
提示:(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) publicvoid 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】---實現定時推送比特幣交易信息