public async Task <bool> GetWsStatusAsync(int nodeId) { var nodeUrl = this.db.Nodes .Where(x => x.Id == nodeId) .Select(x => $"ws://{x.Url}:10334") .FirstOrDefault(); var websocket = new System.Net.WebSockets.ClientWebSocket(); var success = false; try { await websocket.ConnectAsync(new System.Uri(nodeUrl), CancellationToken.None); success = websocket.State == System.Net.WebSockets.WebSocketState.Open; await websocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, null, CancellationToken.None); } catch (Exception e) { Log.Error("WS connection CloseAsync() ", e); } finally { websocket.Dispose(); } return(success); }
private async Task ReadMessagesAsync() { try { var sb = new StringBuilder(); while (true) { var buffer = new ArraySegment <byte>(new byte[4096]); var r = await this.client.ReceiveAsync(buffer, CancellationToken.None); if (r.MessageType != System.Net.WebSockets.WebSocketMessageType.Text) { break; } sb.Append(System.Text.Encoding.UTF8.GetString(buffer.Array, 0, r.Count)); if (r.EndOfMessage) { var text = sb.ToString(); onMessageReceived?.Invoke(text); sb.Clear(); } } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); // disconnect... client.Dispose(); client = null; } }
private static async System.Threading.Tasks.Task Prototype201802084_1() { // todo We need exception handling here. { double dateTimeFrequencyToPhaseFrequencyRatio = (double)System.TimeSpan.TicksPerSecond / (double)System.Diagnostics.Stopwatch.Frequency; long basePhase = System.Diagnostics.Stopwatch.GetTimestamp(); long baseUtcDateTimeInTicks = System.DateTime.UtcNow.Ticks; basePhase = System.Diagnostics.Stopwatch.GetTimestamp(); baseUtcDateTimeInTicks = System.DateTime.UtcNow.Ticks; var clientWebSocket = new System.Net.WebSockets.ClientWebSocket(); //System.Threading.Tasks.Task task = await clientWebSocket.ConnectAsync (new System.Uri //(@"wss://ws-feed-public.sandbox.gdax.com"), (@"wss://ws-feed.gdax.com"), System.Threading.CancellationToken.None ); // todo ??? The caller really should do this if needed. // todo ??? But any method really should do this // todo ??? if after {await} it's not supposed to return to the synchronization context. //// todo Comment in other places where we don't call this. //.ConfigureAwait(false); //int timeSpanInMilliSeconds = System.Environment.TickCount; // todo Remember to call this even if the task already completed -- to rethrow any exceptions. // todo {task.Result} also waits, right? //task.Wait(); //task.RunSynchronously(); //timeSpanInMilliSeconds = System.Environment.TickCount - timeSpanInMilliSeconds; //>>>clientWebSocket.ReceiveAsync if (clientWebSocket.State == System.Net.WebSockets.WebSocketState.Open) { // todo Prototype subscribe/unsubscribe for 1 instrument at a time. const string channelName = //@"heartbeat"; //@"ticker"; @"level2"; //@"user"; //@"matches"; //@"full"; const string requestString = //Newtonsoft.Json.JsonConvert.SerializeObject // ( new // { // type = "subscribe", // product_ids = new string[] { @"ETH-USD", @"ETH-EUR", }, // } // ); "{" + "\"type\":\"subscribe\"," + "\"channels\":[{\"name\":\"" + channelName + "\",\"product_ids\":[\"BTC-USD\",\"BTC-EUR\"]}]" + "}"; byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes(requestString); await clientWebSocket.SendAsync (new System.ArraySegment <byte>(requestBytes), // todo ??? Binary didn't work, right? System.Net.WebSockets.WebSocketMessageType.Text, //System.Net.WebSockets.WebSocketMessageType.Binary, true, System.Threading.CancellationToken.None ); // todo This really doesn't need to be more than 16K, right? var receiveBuffer = new System.ArraySegment <byte>(new byte[33 * 1024]); for (bool isMessageBegin = true; ;) { if (clientWebSocket.State != System.Net.WebSockets.WebSocketState.Open) { System.Console.WriteLine(@"201802085"); break; } else { } System.Net.WebSockets.WebSocketReceiveResult webSocketReceiveResult = await clientWebSocket.ReceiveAsync(receiveBuffer, System.Threading.CancellationToken.None); // todo ??? if (webSocketReceiveResult.Count <= 0) { System.Console.WriteLine(@"201802086"); break; } else { } if (isMessageBegin) { isMessageBegin = false; System.Console.WriteLine(','); //System.Console.WriteLine(); long currentUtcDateTimeInTicks = (long)((double)(ulong)(System.Diagnostics.Stopwatch.GetTimestamp() - basePhase) * dateTimeFrequencyToPhaseFrequencyRatio + 0.5) + baseUtcDateTimeInTicks; System.Console.Write ((new System.DateTime(currentUtcDateTimeInTicks)).ToString(@"o", System.Globalization.DateTimeFormatInfo.InvariantInfo)); } else { } string string1 = System.Text.Encoding.ASCII.GetString(receiveBuffer.Array, 0, webSocketReceiveResult.Count); System.Console.Write(string1); if (webSocketReceiveResult.MessageType == System.Net.WebSockets.WebSocketMessageType.Close) { System.Console.WriteLine(@"201802087"); break; } else { } if (webSocketReceiveResult.EndOfMessage) { isMessageBegin = true; //break; } else { } } } else { System.Console.WriteLine(@"201802088"); } // todo ??? WebSocketState >= CloseSent clientWebSocket.Dispose(); } StaticBool1_ = true; }
public override void Dispose() { client?.Dispose(); }
private static async System.Threading.Tasks.Task Prototype201803072_1() { // todo We need exception handling here. { double dateTimeFrequencyToPhaseFrequencyRatio = (double)System.TimeSpan.TicksPerSecond / (double)System.Diagnostics.Stopwatch.Frequency; long basePhase = System.Diagnostics.Stopwatch.GetTimestamp(); long baseUtcDateTimeInTicks = System.DateTime.UtcNow.Ticks; basePhase = System.Diagnostics.Stopwatch.GetTimestamp(); baseUtcDateTimeInTicks = System.DateTime.UtcNow.Ticks; var clientWebSocket = new System.Net.WebSockets.ClientWebSocket(); await clientWebSocket.ConnectAsync (new System.Uri (@"wss://testnet.bitmex.com/realtime"), //(@"wss://bitmex.com/realtime"), System.Threading.CancellationToken.None ); // todo ??? The caller really should do this if needed. // todo ??? But any method really should do this // todo ??? if after {await} it's not supposed to return to the synchronization context. //// todo Comment in other places where we don't call this. //.ConfigureAwait(false); if (clientWebSocket.State == System.Net.WebSockets.WebSocketState.Open) { { const string message = @"GET/realtime"; string nonceAsString = (++Nonce_).ToString(); // todo Use ASCII encoding everywhere. byte[] signatureBytes = hmacsha256 (System.Text.Encoding.UTF8.GetBytes(ApiKeySecret_), System.Text.Encoding.UTF8.GetBytes(message + nonceAsString) ); string signatureString = ByteArrayToString(signatureBytes); /*const*/ string requestString = "{" + "\"op\":\"authKey\"," + "\"args\":[\"" + ApiKeyId_ + "\"," + nonceAsString + ",\"" + signatureString + "\"]" + "}"; byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes(requestString); await clientWebSocket.SendAsync (new System.ArraySegment <byte>(requestBytes), System.Net.WebSockets.WebSocketMessageType.Text, true, System.Threading.CancellationToken.None ); } if (clientWebSocket.State == System.Net.WebSockets.WebSocketState.Open) { { const string subscriptionTopicName = //@"quote:XBTUSD"; //@"trade:XBTUSD"; //@"orderBookL2:XBTUSD"; //@"instrument:XBTUSD"; //@"instrument"; //@"liquidation"; //@"quoteBin1m:XBTUSD"; @"order"; const string requestString = "{" + "\"op\":\"subscribe\"," + "\"args\":[\"" + subscriptionTopicName + "\"]" + "}"; byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes(requestString); await clientWebSocket.SendAsync (new System.ArraySegment <byte>(requestBytes), // todo ??? For GDAX binary didn't work, right? System.Net.WebSockets.WebSocketMessageType.Text, //System.Net.WebSockets.WebSocketMessageType.Binary, true, System.Threading.CancellationToken.None ); } // todo For GDAX this really doesn't need to be more than 16K, right? var receiveBuffer = new System.ArraySegment <byte>(new byte[33 * 1024]); for (bool isMessageBegin = true; ;) { if (clientWebSocket.State != System.Net.WebSockets.WebSocketState.Open) { System.Console.WriteLine(@"201802085"); break; } else { } System.Net.WebSockets.WebSocketReceiveResult webSocketReceiveResult = await clientWebSocket.ReceiveAsync(receiveBuffer, System.Threading.CancellationToken.None); // todo Is this correct? // todo Are these conditions equivalent? if (webSocketReceiveResult.CloseStatus.HasValue || webSocketReceiveResult.Count <= 0) { System.Console.WriteLine(@"201802086"); break; } else { } if (isMessageBegin) { isMessageBegin = false; System.Console.WriteLine(','); //System.Console.WriteLine(); long currentUtcDateTimeInTicks = (long)((double)(ulong)(System.Diagnostics.Stopwatch.GetTimestamp() - basePhase) * dateTimeFrequencyToPhaseFrequencyRatio + 0.5) + baseUtcDateTimeInTicks; System.Console.Write ((new System.DateTime(currentUtcDateTimeInTicks)).ToString(@"o", System.Globalization.DateTimeFormatInfo.InvariantInfo)); } else { } // todo Preserve decoding state between decoding chunks. string string1 = System.Text.Encoding.ASCII.GetString(receiveBuffer.Array, 0, webSocketReceiveResult.Count); System.Console.Write(string1); if (webSocketReceiveResult.MessageType == System.Net.WebSockets.WebSocketMessageType.Close) { System.Console.WriteLine(@"201802087"); break; } else { } if (webSocketReceiveResult.EndOfMessage) { isMessageBegin = true; //break; } else { } } } else { System.Console.WriteLine(@"201802088"); } } else { System.Console.WriteLine(@"201804021"); } // todo ??? WebSocketState >= CloseSent clientWebSocket.Dispose(); } StaticBool1_ = true; }