Как я могу открыть несколько потоков WebSocket - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь выполнить потоковую передачу данных из 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.

1 Ответ

0 голосов
/ 02 января 2019

Ваша идея поместить new WebSocket() внутрь для каждого должна сработать.Однако я не уверен, разрешено ли вам открывать сотни веб-сокетов с одной и той же вкладки, и могут быть некоторые проблемы с производительностью, связанные с ней.

Согласно документации API , можно открыть только один веб-сокет, который будет отправлять вам данные из списка потоков или даже только из всех потоков.Просто создайте 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>
...