2017-06-01 59 views
4

我想從此wss獲取數據://ws-feed.gdax.com從GDAX網絡套接字源獲取數據

我對websocket沒有任何瞭解。我正在閱讀一些教程,它使用了我不知道的websocket服務器,TCP等術語。任何人都可以請建議我應該如何繼續,如何編寫一個C#代碼來從上面獲取數據。

這是我讀來獲取實時數據的文檔 - https://docs.gdax.com/#websocket-feed

通過創建一個窗口的應用程序已啓動。讀到這裏,該WebSocketSharp庫可以用來連接的WebSockets所以安裝了它,至今寫這段代碼:

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)); 
     } 
    } 
}