Exemplo n.º 1
0
            public IDisposable Start()
            {
                _clients = new Queue<SocketClient>(arguments.ConnectionLimit);
                var connections = new Subject<SocketClient>();
                EventHandler connecthandler = (s, args) => connections.OnNext(s as SocketClient);

                long bytesSent = 0;

                EventHandler<long> onsend = (s, i) =>
                {
                    bytesSent += i;
                };

                Action connect = () =>
                {
                    var client = new SocketClient(arguments.Server, arguments.Port);
                    client.OnConnected += connecthandler;
                    client.OnSend += onsend;
                    client.ConnectAsync();
                    lock (_clients)
                    {
                        _clients.Enqueue(client);
                    }
                };

                //Ping(clients);

                int count = 0;
                var resource = connections.Subscribe(_ =>
                {
                    count++;
                    if (count < arguments.ConnectionLimit)
                    {
                        connect();
                    }
                    else
                    {
                        connections.OnCompleted();
                    }
                },
                    () =>
                    {
                        Console.WriteLine("client: Active {0} connections", count);
                        Console.WriteLine("Sending Messages at a rate of {0} messages/sec", arguments.MessageRate);
                        Observable.Interval(TimeSpan.FromSeconds(1))
                                 .Subscribe(_ =>
                                 {
                                     for (int i = 0; i < arguments.MessageRate; i++)
                                     {
                                         MessageNextClient();
                                     }
                                 });
                    });

                connect(); //Kick off the process
                long previousConnects = 0;
                const int pollTimeSeconds = 2;
                Observable.Interval(TimeSpan.FromSeconds(pollTimeSeconds))
                    .TakeWhile(_ => count < arguments.ConnectionLimit)
                    .Subscribe(_ =>
                    {
                        var diff = count - previousConnects;
                        Console.WriteLine("client: Active: {0} \tconnects/sec: {1}  \tPending: {2}",
                            count,
                            diff / pollTimeSeconds,
                            arguments.ConnectionLimit - count);
                        previousConnects = count;
                    });

                long previous = 0;
                connections.TakeLast(1).SelectMany(_ => Observable.Interval(TimeSpan.FromSeconds(1)))
                  .Subscribe(_ =>
                  {
                      var diff = bytesSent - previous;
                      Console.WriteLine("client: Active: {0} \tMsg/sec: {1} \tTransferRate: {2} \tTotalTransfered: {3}",
                          _clients.Count,
                          diff / messageSize,
                          diff,
                          bytesSent);
                      previous = bytesSent;
                  });

                return resource;
            }