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

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

提示:(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

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【20】

WebSocket(4)---实现定时推送比特币交易信息的更多相关文章

  1. 基于 WebSocket 的 MQTT 移动推送方案

    WebSphere MQ Telemetry Transport 简介 WebSphere MQ Telemetry Transport (MQTT) 是一项异步消息传输协议,是 IBM 在分析了他们 ...

  2. 使用flask_socketio实现服务端向客户端定时推送

    websocket连接是客户端与服务器之间永久的双向通信通道,直到某方断开连接. 双向通道意味着在连接时,服务端随时可以发送消息给客户端,反之亦然,这在一些需要即时通讯的场景比如多人聊天室非常重要. ...

  3. springboot+websocket+sockjs进行消息推送【基于STOMP协议】

    springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...

  4. rsync 系统用户/虚拟用户 备份web服务器数据及无交互定时推送备份

    一.服务环境 (1),WEBserver(192.168.10.130) : BACKserver(192.168.10.129) (2),BACKserver服务器部署,安装所需软件,并启动 (3) ...

  5. 后端利用Redis队列及哈希实现定时推送提醒的三个思路

    周煦辰 2016年8月31日 本文介绍了一下本人在开发过程中遇到"定时推送提醒"的需求的时候所思考的三种解决方案. 明确问题 首先明确一下这个需求可能包含的几个"坑&qu ...

  6. Quartz-第二篇 使用quartz框架定时推送邮件

    1.定时推送邮件,也就是使用定时调度框架触发我们的发邮件动作,发邮件动作,请参考我的这篇随笔.

  7. 通过server酱实现定时推送天气情况,再不用担心你的糊涂蛋女友忘带伞了~~

    昨天菜鸟小白给大家留了一个课后作业,如何实现天气的定时推送.有没有小伙伴做出来答案呢?今天菜鸟小白给大家分享我的实现方式吧.这个是我今天整的程序流程图,昨天我们还只是实现了中间的通过和风天气API获取 ...

  8. Docker 部署 _实现每日情话 定时推送(apscheduler)

    由于最近工作比较忙,后续博客可能更新不及时,哈哈 前言: 由于python对于微信推送不够友好,需要扫码登录,短信接口需要RMB.我就想到了qq邮箱发送到好友,然而微信有qq邮箱提醒功能,就实现了我需 ...

  9. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

随机推荐

  1. unity Tab键实现切换输入框功能

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...

  2. 对JS 的classList 简单记录

    一 对classList整体感觉 浏览器支持参考(http://www.runoob.com/jsref/prop-element-classlist.html) classList 是一个对象 ,返 ...

  3. UOJ#335. 【清华集训2017】生成树计数 多项式,FFT,下降幂,分治

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ335.html 前言 CLY大爷随手切这种题. 日常被CLY吊打系列. 题解 首先从 pruffer 编码的角度考虑这个问 ...

  4. java自动化-实际使用junit的演示

    本文简单介绍一下我写的http接口后端框架 在经过之前多篇博客介绍之后,读者应掌握如下技能 1,自动运行一个或者多个junit框架编写的java代码 2,对数据驱动以及关键字驱动有一定的了解和认识,甚 ...

  5. ajax 文件下载

    作为一个后端开发人员,使用java 生成文件,提供前端下载,这个问题倒不大,可是让我们自己去下载文件的时候,这个问题就大了,对不起,我只对前端一知半解,并不精通,谢谢!! 需求如下:前端检索数据,后台 ...

  6. jquery 点击事件切换样式

    $('#FatherName').on('click', '.ClassName', function(e){ $('.ClassName').removeClass('active'); $(thi ...

  7. [微信跳转链接]之WAP浏览器跳转微信指定页面,微信跳转链接

    今天在一个小说的链接上看到最后,点击一个[继续阅读按钮]居然唤起微信APP,在微信内打开一个二维码,长按识别后可关注微信公众号, 后来分析出:weixin://dl/business/?ticket= ...

  8. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  9. javascript 零碎笔记

    使用 live-serve 这个工具,可以热更新 js 代码 逻辑运算符: 常用于单边条件判断,比如 真判断(获取子属性) {error && <div className=&q ...

  10. Linux下如何查看定位当前正在运行的Nginx的配置文件

    1. 查看nginx的PID,以常用的80端口为例: [root@xiaoyuer scripts]# netstat -lntup|grep 80 tcp 0 0 0.0.0.0:80 0.0.0. ...