WebSocket(4)---实现定时推送比特币交易信息
实现定时推送比特币交易信息
实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等......
提示:(1)本篇博客是在上一遍基础上搭建,上一篇博客地址:【WebSocket】---实现游戏公告功能。
(2)底部有相关源码
先看效果演示
当前的信息就是虚拟币交易所最新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 = "你的AppCode"; 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 这个地址就可以接收服务端时时发来的消息了。
gitHub源码:https://github.com/yudiandemingzi/spring-boot-websocket-study
![](https://img2020.cnblogs.com/blog/1090617/202111/1090617-20211117135827845-311914362.gif)
想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【20】