internal async Task Run(int port) { var server = RxSocketServer.Create(port); var limiter = new Limiter(); var accept = await server.AcceptObservable.FirstAsync(); Write("Connection accepted."); var firstString = await accept.ReceiveObservable.ToStrings().FirstAsync(); if (firstString != "API") { throw new InvalidDataException("'API' not received."); } Write("Received 'API'."); // Start receiving with length prefix. var messages = await accept.ReceiveObservable.ToByteArrayOfLengthPrefix().ToStringArray().Take(2).ToList(); var versions = messages[0].Single(); if (!versions.StartsWith("v")) { throw new InvalidDataException("Versions not received."); } Write($"Received supported server versions: '{versions}'."); if (messages[1][0] != "71") // receive StartApi message { throw new InvalidDataException("StartApi message not received."); } Write("Received StartApi message."); new RequestMessage(accept, limiter) .Write(75) // server version .Write(DateTime.Now.ToString("yyyyMMdd HH:mm:ss XXX")) .Send(); new RequestMessage(accept, limiter) .Write("15") .Write("1") .Write("123,456,789") .Send(); new RequestMessage(accept, limiter) .Write("9") .Write("1") .Write("10") .Send(); Write("Client login complete."); //////////////////////////////////////////////////// var obs = accept.ReceiveObservable.ToByteArrayOfLengthPrefix().ToStringArray().Publish().RefCount(); // receive test start signal await obs.FirstAsync(); var watch = new Stopwatch(); watch.Start(); var count = await obs.TakeWhile(m => m[0] == "2").Count(); watch.Stop(); var frequency = Stopwatch.Frequency * (count + 1) / watch.ElapsedTicks; Write($"Received {frequency:N0} messages/second."); var ms = new MemoryStream(); for (var i = 0; i < 500_000; i++) { new RequestMessage(ms.Write, limiter) .Write("2", "3", 1, TickType.LastSize, 300) .Send(); } // message to indicate test stop new RequestMessage(ms.Write, limiter) .Write("1", "3", 1, TickType.LastPrice, 100, 200, true) .Send(); Write("Sending messages..."); accept.Send(ms.ToArray(), 0, (int)ms.Position); // wait for OnCompleted() await obs.LastOrDefaultAsync(); Write("Disconnecting."); await accept.DisconnectAsync(); await server.DisconnectAsync(); Write("Disconnected."); }