private IDisposable FixedLenghtWithAck()
        {
            var sockets = SocketEvents.GetTcpStreamSockets(_port);
            var monitor = new ConnectionRateMonitor();

            sockets.GetConnections()
                   .Subscribe(connection =>
            {
                monitor.OnConnect();
                connection
                    .ToLengthPrefixed()
                    .Subscribe(context =>
                    {
                        var response = HandleMessage(context.Message);
                        monitor.OnMessage();
                        context.Publish(response);
                    },
                    ex => monitor.OnDisconnect(),
                    monitor.OnDisconnect);
            });

            monitor.Start();

            return sockets;
        }
Exemple #2
0
        public IDisposable StartServer()
        {
            var monitor = new ConnectionRateMonitor();
            var binding = new NetTcpBinding { Security = { Mode = SecurityMode.None } };
            var listener = binding.Start(this.ConnectArguments.CreateNetTcpAddress());
            Console.WriteLine("Listening on {0} for {1}", listener.Uri, typeof(SimpleObject).Name);

            listener.GetChannels()
                .SubscribeOn(System.Reactive.Concurrency.ThreadPoolScheduler.Instance)
                .Subscribe(c =>
                {
                    monitor.OnConnect();
                    c.GetMessages()
                        .Subscribe(
                            m =>
                            {
                                monitor.OnMessage();
                                var obj = m.GetBody<SimpleObject>();
                            },
                        ex => monitor.OnDisconnect(),
                        monitor.OnDisconnect);
                });

            monitor.Start();
            return Disposable.Create(listener.Abort);
        }
Exemple #3
0
        private IDisposable FixedLenghtWithAck()
        {
            var sockets = SocketEvents.GetTcpStreamSockets(_port);
            var monitor = new ConnectionRateMonitor();

            sockets.GetConnections()
            .Subscribe(connection =>
            {
                monitor.OnConnect();
                connection
                .ToLengthPrefixed()
                .Subscribe(context =>
                {
                    var response = HandleMessage(context.Message);
                    monitor.OnMessage();
                    context.Publish(response);
                },
                           ex => monitor.OnDisconnect(),
                           monitor.OnDisconnect);
            });

            monitor.Start();

            return(sockets);
        }
Exemple #4
0
        public IDisposable StartServer()
        {
            var monitor = new ConnectionRateMonitor();
            var binding = new NetTcpBinding {
                Security = { Mode = SecurityMode.None }
            };
            var listener = binding.Start(_address);

            Console.WriteLine("Listening on " + listener.Uri);

            listener.GetChannels()
            .SubscribeOn(System.Reactive.Concurrency.ThreadPoolScheduler.Instance)
            .Subscribe(c =>
            {
                monitor.OnConnect();
                c.GetMessages()
                .Subscribe(
                    m => monitor.OnMessage(),
                    ex => monitor.OnDisconnect(),
                    monitor.OnDisconnect);
            });

            monitor.Start();

            return(Disposable.Create(listener.Abort));
        }
Exemple #5
0
        public IDisposable StartServer()
        {
            var monitor = new ConnectionRateMonitor();
            var binding = new NetTcpBinding { Security = { Mode = SecurityMode.None } };
            var listener = binding.Start(this.ConnectArguments.CreateNetTcpAddress());
            Console.WriteLine("Listening on {0} for {1}", listener.Uri, typeof(SimpleObject).Name);

            listener.GetChannels()
                .SubscribeOn(System.Reactive.Concurrency.ThreadPoolScheduler.Instance)
                .Subscribe(c =>
                {
                    monitor.OnConnect();
                    c.GetMessages()
                        .Subscribe(
                            m =>
                            {
                                monitor.OnMessage();
                                var obj = m.GetBody<SimpleObject>();
                            },
                        ex => monitor.OnDisconnect(),
                        monitor.OnDisconnect);
                });

            monitor.Start();
            return Disposable.Create(listener.Abort);
        }
        private async Task ConnectAndSubscribeAsync(CountdownEvent pending)
        {
            var connection = await SocketEvents.CreateConnection(_args.Server, _args.Port);

            _monitor.OnConnect();
            var encodedConnection = connection.ToLengthPrefixed();

            lock (_clients)
            {
                _clients.Add(encodedConnection);
            }
            pending.Signal();
            encodedConnection.Subscribe(this.HandleResponse);
        }
        private IDisposable SimpleReceiver()
        {
            var sockets = SocketEvents.GetTcpStreamSockets(_port);
            var monitor = new ConnectionRateMonitor();

            sockets.Subscribe(s =>
            {
                monitor.OnConnect();
                var receiver = s.CreateReceiver();
                receiver.Subscribe(
                    d => monitor.OnMessage(),
                    ex => monitor.OnDisconnect(),
                    monitor.OnDisconnect);
            });

            monitor.Start();

            return sockets;
        }
        private IDisposable SimpleReceiver()
        {
            var sockets = SocketEvents.GetTcpStreamSockets(_port);
            var monitor = new ConnectionRateMonitor();

            sockets.Subscribe(s =>
            {
                monitor.OnConnect();
                var receiver = s.CreateReceiver();
                receiver.Subscribe(
                    d => monitor.OnMessage(),
                    ex => monitor.OnDisconnect(),
                    monitor.OnDisconnect);
            });

            monitor.Start();

            return(sockets);
        }
        public IDisposable StartServer()
        {
            var monitor = new ConnectionRateMonitor();
            var binding = new NetTcpBinding { Security = { Mode = SecurityMode.None } };
            var listener = binding.Start(_address);
            Console.WriteLine("Listening on " + listener.Uri);

            listener.GetChannels()
                .SubscribeOn(System.Reactive.Concurrency.ThreadPoolScheduler.Instance)
                .Subscribe(c =>
                {
                    monitor.OnConnect();
                    c.GetMessages()
                        .Subscribe(
                        m => monitor.OnMessage(),
                        ex => monitor.OnDisconnect(),
                        monitor.OnDisconnect);
                });

            monitor.Start();

            return Disposable.Create(listener.Abort);
        }
        public IDisposable Start()
        {
            ConnectionRateMonitor monitor = new ConnectionRateMonitor();
            var connections = new Task[_connections];
            for (int i = 0; i < _connections; i++)
            {
                var channel = _factory.CreateChannel(_address);
                var openTask = Task.Factory.FromAsync(channel.BeginOpen, channel.EndOpen, null);
                openTask.ContinueWith(_ => monitor.OnConnect());
                _channels.Enqueue(channel);
                connections[i] = openTask;
            }

            Task.WaitAll(connections);

            double backlog = 0;
            double currentRate = 0;
            AsyncCallback cb = (iar) =>
                        {
                            IDuplexSessionChannel channel = (IDuplexSessionChannel)iar.AsyncState;
                            backlog = monitor.OnMessageEnd();
                            monitor.OnMessage();
                            channel.EndSend(iar);
                        };

            var load = Observable.Interval(TimeSpan.FromMilliseconds(1000))
                .TakeWhile(_ => !_isDisposed)
                .Where(_ => backlog <= _rate)
                .Subscribe(async _ =>
                {
                    int pending = _rate;

                    Action action = () =>
                    {
                        //Console.WriteLine("Thread ID" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                        while (Interlocked.Decrement(ref pending) >= 0)
                        {
                            var channel = GetNextChannel();
                            monitor.OnMessageStart();
                            var iar = channel.BeginSend(_messageBuffer.CreateMessage(), cb, channel);
                        }
                    };

                    Parallel.Invoke(
                        new ParallelOptions()
                                    {
                                        MaxDegreeOfParallelism = Environment.ProcessorCount * 4,
                                    },
                                    action, action, action, action,
                                    action, action, action, action
                                    );
                },
                    ex => Console.WriteLine(ex.Message + " \n" + ex.StackTrace));

            var ratemonitor = monitor.Start();

            return Disposable.Create(() =>
            {
                // Terminate the timer as well.
                _isDisposed = true;
                load.Dispose();
                ratemonitor.Dispose();

                lock (ThisLock)
                {
                    while (_channels.Count > 0)
                    {
                        var c = _channels.Dequeue();
                        c.Abort();
                    }

                    _factory.Abort();
                }
            });
        }
Exemple #11
0
        public IDisposable Start()
        {
            ConnectionRateMonitor monitor = new ConnectionRateMonitor();
            var connections = new Task[_connections];

            for (int i = 0; i < _connections; i++)
            {
                var channel  = _factory.CreateChannel(_address);
                var openTask = Task.Factory.FromAsync(channel.BeginOpen, channel.EndOpen, null);
                openTask.ContinueWith(_ => monitor.OnConnect());
                _channels.Enqueue(channel);
                connections[i] = openTask;
            }

            Task.WaitAll(connections);

            double        backlog     = 0;
            double        currentRate = 0;
            AsyncCallback cb          = (iar) =>
            {
                IDuplexSessionChannel channel = (IDuplexSessionChannel)iar.AsyncState;
                backlog = monitor.OnMessageEnd();
                monitor.OnMessage();
                channel.EndSend(iar);
            };

            var load = Observable.Interval(TimeSpan.FromMilliseconds(1000))
                       .TakeWhile(_ => !_isDisposed)
                       .Where(_ => backlog <= _rate)
                       .Subscribe(async _ =>
            {
                int pending = _rate;

                Action action = () =>
                {
                    //Console.WriteLine("Thread ID" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                    while (Interlocked.Decrement(ref pending) >= 0)
                    {
                        var channel = GetNextChannel();
                        monitor.OnMessageStart();
                        var iar = channel.BeginSend(_messageBuffer.CreateMessage(), cb, channel);
                    }
                };

                Parallel.Invoke(
                    new ParallelOptions()
                {
                    MaxDegreeOfParallelism = Environment.ProcessorCount * 4,
                },
                    action, action, action, action,
                    action, action, action, action
                    );
            },
                                  ex => Console.WriteLine(ex.Message + " \n" + ex.StackTrace));

            var ratemonitor = monitor.Start();

            return(Disposable.Create(() =>
            {
                // Terminate the timer as well.
                _isDisposed = true;
                load.Dispose();
                ratemonitor.Dispose();

                lock (ThisLock)
                {
                    while (_channels.Count > 0)
                    {
                        var c = _channels.Dequeue();
                        c.Abort();
                    }

                    _factory.Abort();
                }
            }));
        }