【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)
    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】

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

时间: 2024-08-30 02:51:48

【WebSocket】---实现定时推送比特币交易信息的相关文章

基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)

前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前 的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对 只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服 务器对于WebSocket的实现都是不一样的

在Spring Boot框架下使用WebSocket实现消息推送

Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的支持(使用Spring Boot开发Web项目(二)之添加HTTPS支持),在这两篇文章的基础上,我们今天来看看如何在Spring Boot中使用WebSocket. 什么是WebSocket WebSocket为浏览器和服务器之间提供了双工异步通信功能,也就是说我们可以利用浏览器给服务器发送消息,

基于Tomcat7、Java、WebSocket的服务器推送聊天室

http://blog.csdn.net/leecho571/article/details/9707497 http://blog.fens.me/java-websocket-intro/ java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都是可以一样的. HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发

QuickBI助你成为分析师-邮件定时推送

摘要: 创建报表过程中经常需要将报表情况定时推送给其他用户,及时了解数据情况,目前高级版提供了邮件定时推送功能,请参考本文. 创建报表过程中经常需要将报表情况定时推送给其他用户,及时了解数据情况.高级版本邮件推送功能支持仪表板周期性推送到订阅人,默认以当前登录者视角查看,同时支持结合 行级权限进行权限控制 和 结合全局参数功能确定邮件推送内容参数,具体操作步骤如下: 步骤一 设置行级权限 如下图为当前登录者设置行级权限,则邮件推送仪表板截图基于此权限展示: 行级权限设置详情请参考:行级权限设置

WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链接,但不容易直接完成实时的消息推送功能,如聊天室.后台信息提示.实时更新数据等功能,但通过polling.Long polling.长连接.Flash Socket以及HTML5中定义的WebSocket能完成该功能需要. 一.Socket简介 Socket又称"套接字",应用程序通常通过

C#解惑3——WebSocket与消息推送(转)

目录 一.Socket简介 二.WebSocket简介与消息推送 三.WebSocket客户端 四.WebSocket服务器端 五.测试运行 六.小结与消息推送框架 6.1.开源Java消息推送框架 Pushlet 6.2.开源DotNet消息推送框架SignalR 七.代码下载 7.1.Java实现的服务器端代码与客户端代码下载 7.2.DotNet服务器端手动连接实现代码下载 7.3.DotNet下使用SuperWebSocket三方库实现代码下载 B/S结构的软件项目中有时客户端需要实时的

使用Websocket实现消息推送

WebSocket 上 联系客服功能在项目中很难避免,一般有下面三种实现方式: 使用http的get方式轮询 接入第三方IM系统 自己的IM系统 基于socket 基于websocket 第一种方式,最low的,实现简单,但是浪费用户流量:第二种方式,接入简单,功能强大,但是可能需要一定的成本(比如付费):第三种方式,需要一定的开发成本(服务器托管费用忽略).对于第三种情况的 socket,实现IM的文字加音视频聊天,做过的话你可以也会直接懵逼.但是,简单的文字聊天还好,不过你还是需要去定义一些

用websocket实现后台推送消息

1前台实现 1 connect:function() { 2 var webSocketIP = window.CRM_CONFIG.WebSocketIP; 3 var target = 'ws://'+webSocketIP+'/websocket'; 4 if ('WebSocket' in window) { 5 ws = new WebSocket(target); 6 } else if ('MozWebSocket' in window) { 7 ws = new MozWebSo

html5利用websocket完成的推送功能

程序简单来说,就是客户A可以发送消息给客户B,但有很多可以扩展的地方, 比如 1.如果加入数据库后,A发消息时客户B未上线,服务端将会把消息存在数据库中,等客户B上线后,在将消息取出发送给客户B 2.服务端也可发送消息到任意客户端上. Websocket 1.websocket是什么? WebSocket是为解决客户端与服务端实时通信而产生的技术.其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接, 此后服务端与客户端通过此TCP连接进行实时通信. 2.websoc