Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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;
        }
Пример #4
0
 public override void Dispose()
 {
     client?.Dispose();
 }
Пример #5
0
        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;
        }