【问题标题】:How can I open multiple WebSocket streams如何打开多个 WebSocket 流
【发布时间】:2019-05-28 13:43:00
【问题描述】:

我正在尝试从 Binance WebSocket API 流式传输数据,我让它一次只为一个符号工作。

if ("WebSocket" in window) {
            //open websocket
            var symbols = getSymbol();
            //console.log(symbols);

            symbols.forEach(function(entry) {
              console.log(entry);
            })

            var ws = new WebSocket("wss://stream.binance.com:9443/ws/btcusdt@miniTicker")

            ws.onopen = function() {
                console.log("Binance connected...");
            };

            ws.onmessage = function(evt) {
                var r_msg = evt.data;
                var jr_msg = JSON.parse(r_msg);   
            }

            ws.onclose = function() {
                console.log("Binance disconnected");
            }
        } else {
            alert("WebSocket is NOT supported");
        }

var symbols = getSymbol(); 行创建了一个包含 431 个符号的数组,我的逻辑(以及我想要实现的)是将 new websocket() 添加到 forEach 并从所有货币对流式传输价格数据。

我不确定这是否可行或有什么更好的解决方案,但我希望流式传输并显示来自 api 的实时数据。

【问题讨论】:

    标签: javascript arrays for-loop websocket binance


    【解决方案1】:

    您将new WebSocket() 放在for-each 中的想法应该可行。然而, 我不确定是否允许您从同一个选项卡打开数百个 Web 套接字,并且还可能存在一些与之相关的性能问题。

    根据API documentation,可以只打开一个Web 套接字,它会从流列表中向您发送数据,甚至只打开所有流。只需像这样构造 URL:

    • 具体流:wss://stream.binance.com:9443/ws/stream1/stream2/stream3
    • 所有流:wss://stream.binance.com:9443/ws/!miniTicker@arr

    这是一个考虑了这些因素的代码示例。默认情况下,此代码使用所有流的 URL,但它也有使用特定流的代码(已注释掉)。

      let streams = [
        "ethbtc@miniTicker","bnbbtc@miniTicker","wavesbtc@miniTicker","bchabcbtc@miniTicker",
        "bchsvbtc@miniTicker","xrpbtc@miniTicker","tusdbtc@miniTicker","eosbtc@miniTicker",
        "trxbtc@miniTicker","ltcbtc@miniTicker","xlmbtc@miniTicker","bcptbtc@miniTicker",
        "adabtc@miniTicker","zilbtc@miniTicker","xmrbtc@miniTicker","stratbtc@miniTicker",
        "zecbtc@miniTicker","qkcbtc@miniTicker","neobtc@miniTicker","dashbtc@miniTicker","zrxbtc@miniTicker"
      ];
    
      let trackedStreams = [];
    
      //let ws = new WebSocket("wss://stream.binance.com:9443/ws/" + streams.join('/'));
      let ws = new WebSocket("wss://stream.binance.com:9443/ws/!miniTicker@arr");
    
      ws.onopen = function() {
          console.log("Binance connected...");
      };
    
      ws.onmessage = function(evt) {
        try {
          let msgs = JSON.parse(evt.data);
          if (Array.isArray(msgs)) {
            for (let msg of msgs) {
              handleMessage(msg);
            }
          } else {
            handleMessage(msgs)
          }
        } catch (e) {
          console.log('Unknown message: ' + evt.data, e);
        }
      }
    
      ws.onclose = function() {
        console.log("Binance disconnected");
      }
    
      function handleMessage(msg) {
        const stream = msg.s;
        if (trackedStreams.indexOf(stream) === -1) {
          document.getElementById('streams').innerHTML += '<br/>' + stream + ': <span id="stream_' + stream + '"></span>';
          trackedStreams.push(stream);
          document.getElementById('totalstreams').innerText = trackedStreams.length;
        }
    
        document.getElementById('stream_' + stream).innerText = msg.v;
      }
    <span id="totalstreams"></span> streams tracked<br/>
    Total traded base asset volume:<br/>
    <div id="streams"></div>

    【讨论】:

    • 在阅读您的答案之前我实际上已经想通了,但我真的很喜欢您用来解决这个问题的方法
    • @Rajbir,您能否提供更多实施细节?我也对这个感兴趣。谢谢
    • 这个端点给你最后24小时的蜡烛,如何用同样的方法得到更小的蜡烛?使用 Kline 端点,您将限制为 5 个流订阅,并且通过在循环中使用新的 WebSocket 到 100,因此只有 500 对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多