zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    【读书笔记】【深入理解ES6】#13-用模块封装代码
    【读书笔记】【深入理解ES6】#12-代理(Proxy)和反射(Reflection)API
    【读书笔记】【深入理解ES6】#11-Promise与异步编程
    【读书笔记】【深入理解ES6】#10-改进的数组功能
    【读书笔记】【深入理解ES6】#9-JavaScript中的类
    【读书笔记】【深入理解ES6】#7-Set集合和Map集合
    【读书笔记】【深入理解ES6】#6-Symbol和Symbol属性
    关于maven打包文件不全的处理方式
    关于Dubbo的常用模型
    Dubbo源码本地运行demo遇到的问题
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/9452404.html
Copyright © 2011-2022 走看看