2017-06-01 6 views
4

からデータを取得します。//ws-feed.gdax.com私はこのWSSからデータを取得したいGDAXウェブソケットフィード

私はWebSocketのについては何も知りません。私はいくつかのチュートリアルを読んでおり、WebSocketサーバーやTCPなどの用語を使用しています。誰も助言をどのように進む必要があります、上記のデータを取得するためのC#のコードを記述する方法。

これは私がリアルタイムデータをフェッチするために読ん文書である - 窓のアプリを作成することによって開始https://docs.gdax.com/#websocket-feed

。 WebSocketSharpライブラリはので、それをインストールし、これまでのところ、このコードを書いWebSocketをを接続するために使用することができることをここで読む:

using (var ws = new WebSocket("wss://ws-feed.gdax.com")) 
     { 
      ws.Connect(); 
      string json = "{\"type\": \"subscribe\", \"product_ids\": [\"BTC-USD\"]}"; 
      ws.Send(json); //gives error -Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation. 
     } 

任意の助けもいただければ幸いです。

答えて

4
ClientWebSocket socket = new ClientWebSocket(); 
Task task = socket.ConnectAsync(new Uri("wss://ws-feed.gdax.com"), CancellationToken.None); 
task.Wait(); 
Thread readThread = new Thread(
    delegate(object obj) 
    { 
     byte[] recBytes = new byte[1024]; 
     while (true) { 
      ArraySegment<byte> t = new ArraySegment<byte>(recBytes); 
      Task<WebSocketReceiveResult> receiveAsync = socket.ReceiveAsync(t, CancellationToken.None); 
      receiveAsync.Wait(); 
      string jsonString = Encoding.UTF8.GetString(recBytes); 
      Console.Out.WriteLine("jsonString = {0}", jsonString); 
      recBytes = new byte[1024]; 
     } 

    }); 
readThread.Start(); 
string json = "{\"product_ids\":[\"btc-usd\"],\"type\":\"subscribe\"}"; 
byte[] bytes = Encoding.UTF8.GetBytes(json); 
ArraySegment<byte> subscriptionMessageBuffer = new ArraySegment<byte>(bytes); 
socket.SendAsync(subscriptionMessageBuffer, WebSocketMessageType.Text, true, CancellationToken.None); 
Console.ReadLine(); 
0

基本的に、あなたがするのは正しい方向です。メッセージを読む前にwebsocketの状態をチェックするだけです。

以下の例は、少し変更して、https://github.com/sefbkn/gdax.netcoreである

var webSocketClient = new ClientWebSocket(); 
var cancellationToken = new CancellationToken(); 

await webSocketClient.ConnectAsync(new Uri("wss://ws-feed.gdax.com"), cancellationToken).ConfigureAwait(false); 
if (webSocketClient.State == WebSocketState.Open) 
{ 
    var requestString = JsonConvert.SerializeObject(new { 
     type = "subscribe", 
     product_ids = new[]{"ETH-EUR"}, 
     channels = new[]{"ticker"} 
    }); 

    var requestBytes = UTF8Encoding.UTF8.GetBytes(requestString); 
    var subscribeRequest = new ArraySegment<byte>(requestBytes); 
    var sendCancellationToken = new CancellationToken(); 
    await webSocketClient.SendAsync(subscribeRequest, WebSocketMessageType.Text, true, sendCancellationToken).ConfigureAwait(false); 

    while (webSocketClient.State == WebSocketState.Open) 
    { 
     var receiveCancellationToken = new CancellationToken(); 
     using(var stream = new MemoryStream(1024)) 
     { 
      var receiveBuffer = new ArraySegment<byte>(new byte[1024*8]); 
      WebSocketReceiveResult webSocketReceiveResult; 
      do 
      { 
       webSocketReceiveResult = await webSocketClient.ReceiveAsync(receiveBuffer, receiveCancellationToken).ConfigureAwait(false); 
       await stream.WriteAsync(receiveBuffer.Array, receiveBuffer.Offset, receiveBuffer.Count); 
      } while(!webSocketReceiveResult.EndOfMessage); 

      var message = stream.ToArray().Where(b => b != 0).ToArray(); 
      messageReceived(Encoding.ASCII.GetString(message, 0, message.Length)); 
     } 
    } 
} 
関連する問題