分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

【WebSocket】---实现定时推送比特币交易信息

发布时间:2023-09-06 02:09责任编辑:傅花花关键词:Web

实现定时推送比特币交易信息

实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等......

提示:(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 * 功能描述:股票推送,这里只需通过定时任务向客服端发送消息 */@Componentpublic class CoinSchedule { ???@Autowired ???private WebSocketService ws; ???????//代表每一秒执行一次任务 ???@Scheduled(fixedRate=1000) ???public void coinInfo(){ ???????ws.sendCoinInfo(); ???}}

  

3、WebSocketService类

消息模版工具类,用来推送消息用的。

/** * 功能描述:简单消息模板,用来推送消息 */@Servicepublic 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)@Datapublic 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】---实现定时推送比特币交易信息

原文地址:https://www.cnblogs.com/qdhxhz/p/9452404.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved