コード例 #1
0
        static void Main(string[] args)
        {
            var port = 1055;

            if (args.Length > 0)
            {
                port = int.Parse(args[0]);
            }

            var server = new ReactiveListener(port);

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("New socket connected {0}", socket.GetHashCode());

                var protocol = new StringChannel(socket);

                // Here we hook the "echo" prototocol
                protocol.Receiver.Subscribe(
                    s => { Console.Write(s); protocol.SendAsync(s).Wait(); },
                    e => Console.WriteLine(e),
                    () => Console.WriteLine("Socket receiver completed"));

                socket.Disconnected += (sender, e) => Console.WriteLine("Socket disconnected {0}", sender.GetHashCode());
                socket.Disposed     += (sender, e) => Console.WriteLine("Socket disposed {0}", sender.GetHashCode());
            });

            server.Start();

            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();
        }
コード例 #2
0
        public void when_connected_then_can_exchange_fixed_length_messages()
        {
            var serverReceives = new List <string>();
            var clientReceives = new List <string>();

            var server = new ReactiveListener(1055);

            server.Start();

            Func <IObservable <byte>, IObservable <string> > parse =
                socket => from header in socket.Buffer(4)
                let length                       = BitConverter.ToInt32(header.ToArray(), 0)
                                        let body = socket.Take(length)
                                                   select Encoding.UTF8.GetString(body.ToEnumerable().ToArray());

            Func <string, byte[]> convert = s =>
            {
                var body    = Encoding.UTF8.GetBytes(s);
                var header  = BitConverter.GetBytes(body.Length);
                var payload = header.Concat(body).ToArray();

                return(payload);
            };

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("Server socket created: {0}", socket.GetHashCode());

                parse(socket.Receiver).Subscribe(
                    x => serverReceives.Add(x.Trim()),
                    e => Console.WriteLine("Server socket error: {0}", e.Message),
                    () => Console.WriteLine("Server socket completed"));

                socket.SendAsync(convert("Welcome!")).Wait();
            });

            var client = new ReactiveClient("127.0.0.1", 1055);

            Console.WriteLine("Client socket created: {0}", client.GetHashCode());

            client.ConnectAsync().Wait();

            parse(client.Receiver).Subscribe(
                x => clientReceives.Add(x.Trim()),
                e => Console.WriteLine("Client socket error: {0}", e.Message),
                () => Console.WriteLine("Client socket completed"));

            client.SendAsync(convert("Hello")).Wait();

            Thread.Sleep(100);

            Assert.Equal(1, serverReceives.Count);
            Assert.Equal(1, clientReceives.Count);
            Assert.Equal("Welcome!", clientReceives[0]);
            Assert.Equal("Hello", serverReceives[0]);

            server.Dispose();
        }
コード例 #3
0
        public void when_connected_then_can_exchange_fixed_length_messages()
        {
            var serverReceives = new List<string>();
            var clientReceives = new List<string>();

            var server = new ReactiveListener(1055);
            server.Start();

            Func<IObservable<byte>, IObservable<string>> parse =
                socket => from header in socket.Buffer(4)
                          let length = BitConverter.ToInt32(header.ToArray(), 0)
                          let body = socket.Take(length)
                          select Encoding.UTF8.GetString(body.ToEnumerable().ToArray());

            Func<string, byte[]> convert = s =>
            {
                var body = Encoding.UTF8.GetBytes(s);
                var header = BitConverter.GetBytes(body.Length);
                var payload = header.Concat(body).ToArray();

                return payload;
            };

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("Server socket created: {0}", socket.GetHashCode());

                parse(socket.Receiver).Subscribe(
                    x => serverReceives.Add(x.Trim()),
                    e => Console.WriteLine("Server socket error: {0}", e.Message),
                    () => Console.WriteLine("Server socket completed"));

                socket.SendAsync(convert("Welcome!")).Wait();
            });

            var client = new ReactiveClient("127.0.0.1", 1055);
            Console.WriteLine("Client socket created: {0}", client.GetHashCode());

            client.ConnectAsync().Wait();

            parse(client.Receiver).Subscribe(
                x => clientReceives.Add(x.Trim()),
                e => Console.WriteLine("Client socket error: {0}", e.Message),
                () => Console.WriteLine("Client socket completed"));

            client.SendAsync(convert("Hello")).Wait();

            Thread.Sleep(100);

            Assert.Equal(1, serverReceives.Count);
            Assert.Equal(1, clientReceives.Count);
            Assert.Equal("Welcome!", clientReceives[0]);
            Assert.Equal("Hello", serverReceives[0]);

            server.Dispose();
        }
コード例 #4
0
        public void when_calling_dispose_after_disconnect_then_work()
        {
            using (var server = new ReactiveListener(1055))
            {
                var client = new ReactiveClient("127.0.0.1", 1055);
                server.Start();
                client.ConnectAsync().Wait();

                client.Disconnect();
                client.Dispose();
            }
        }
コード例 #5
0
        public void when_disposed_then_complete_connections_observable()
        {
            var listener = new ReactiveListener(1055);
            listener.Start();

            bool completed = false;

            listener.Connections.Subscribe(x => { }, () => completed = true);

            listener.Dispose();

            Assert.True(completed);
        }
コード例 #6
0
        public void when_disposed_then_complete_connections_observable()
        {
            var listener = new ReactiveListener(1055);

            listener.Start();

            bool completed = false;

            listener.Connections.Subscribe(x => { }, () => completed = true);

            listener.Dispose();

            Assert.True(completed);
        }
コード例 #7
0
ファイル: SMDRReaderService.cs プロジェクト: jank3/SMDRReader
        private static void SetupSubscriptions(ReactiveListener server)
        {
            server.Connections.Subscribe(socket =>
            {
                var messages = Observable.Create <SMDRRecord>(observer =>
                {
                    var bom  = Encoding.ASCII.GetChars(Encoding.ASCII.GetPreamble()).FirstOrDefault();
                    var sb   = new StringBuilder();
                    var prev = default(char);

                    return(socket.Receiver.Subscribe(b =>
                    {
                        var c = Convert.ToChar(b);
                        if (c == bom)
                        {
                        }                 // skip bom
                        else if (prev == '\r' && c == '\n')
                        {
                        }                                  // when \r\n do nothing
                        else if (c == '\r' || c == '\n')   // reach at EndOfLine
                        {
                            var str = sb.ToString();
                            sb.Clear();
                            observer.OnNext(new SMDRRecord(str));
                        }
                        else
                        {
                            sb.Append(c);  // normally char
                        }
                        prev = c;
                    },
                                                     observer.OnError,
                                                     () =>
                    {
                        var str = sb.ToString();
                        if (!String.IsNullOrEmpty(str))
                        {
                            observer.OnNext(new SMDRRecord(str));
                        }
                        observer.OnCompleted();
                    }));
                });

                messages.Subscribe(message =>
                {
                    Console.WriteLine("Message:");
                    Console.WriteLine("{0}", new SMDRRecordFormatter(message));
                });
            });
        }
コード例 #8
0
        public void when_connecting_then_raises_connected()
        {
            using (var server = new ReactiveListener(1055))
            {
                var client = new ReactiveClient("127.0.0.1", 1055);
                var connected = false;
                client.Connected += (sender, args) => connected = true;

                server.Start();
                client.ConnectAsync().Wait();

                Assert.True(client.IsConnected);
                Assert.True(connected);
            }
        }
コード例 #9
0
        public static void AddListener(TCPSocketListener model)
        {
            if (listeners.ContainsKey(model.Name))
            {
                listeners[model.Name].Dispose();
                listeners.Remove(model.Name);
            }

            ReactiveListener server = new ReactiveListener(model.Port);

            server.Connections.Subscribe(socket => new Observer(socket, model.Name, model.BufferSize));

            server.Start();

            listeners.Add(model.Name, server);
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: nefarius/ReactiveProtobuf
        static void Main(string[] args)
        {
            var server = new ReactiveListener(41337);

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("New socket connected {0}", socket.GetHashCode());

                var protocol = new ProtobufChannel <Person>(socket);

                protocol.Receiver.Subscribe(person =>
                {
                    if (person != null)
                    {
                        Console.WriteLine("Person {0} {1} connected", person.FirstName, person.LastName);
                    }
                });
            });

            server.Start();

            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();
        }
コード例 #11
0
ファイル: RootHub.cs プロジェクト: scrizz/ScpToolkit
        /// <summary>
        ///     Opens and initializes devices and services listening and running on the local machine.
        /// </summary>
        /// <returns>True on success, false otherwise.</returns>
        public override bool Open()
        {
            var opened = false;

            Log.Debug("Initializing root hub");

            _limitInstance = new LimitInstance(@"Global\ScpDsxRootHub");

            try
            {
                if (!_limitInstance.IsOnlyInstance) // existing root hub running as desktop app
                {
                    throw new RootHubAlreadyStartedException(
                              "The root hub is already running, please close the ScpServer first!");
                }
            }
            catch (UnauthorizedAccessException) // existing root hub running as service
            {
                throw new RootHubAlreadyStartedException(
                          "The root hub is already running, please stop the ScpService first!");
            }

            Log.DebugFormat("++ {0} {1}", Assembly.GetExecutingAssembly().Location,
                            Assembly.GetExecutingAssembly().GetName().Version);
            Log.DebugFormat("++ {0}", OsInfoHelper.OsInfo);

            #region Native feed server

            _rxFeedServer = new ReactiveListener(Settings.Default.RootHubNativeFeedPort);

            _rxFeedServer.Connections.Subscribe(socket =>
            {
                Log.DebugFormat("Client connected on native feed channel: {0}", socket.GetHashCode());
                var protocol = new ScpNativeFeedChannel(socket);

                _nativeFeedSubscribers.Add(socket.GetHashCode(), protocol);

                protocol.Receiver.Subscribe(packet => { Log.Warn("Uuuhh how did we end up here?!"); });

                socket.Disconnected += (sender, e) =>
                {
                    Log.DebugFormat(
                        "Client disconnected from native feed channel {0}",
                        sender.GetHashCode());

                    _nativeFeedSubscribers.Remove(socket.GetHashCode());
                };

                socket.Disposed += (sender, e) =>
                {
                    Log.DebugFormat("Client disposed from native feed channel {0}",
                                    sender.GetHashCode());

                    _nativeFeedSubscribers.Remove(socket.GetHashCode());
                };
            });

            #endregion

            opened |= _scpBus.Open(GlobalConfiguration.Instance.Bus);
            opened |= _usbHub.Open();
            opened |= _bthHub.Open();

            GlobalConfiguration.Load();
            return(opened);
        }
コード例 #12
0
ファイル: SMDRReaderService.cs プロジェクト: jank3/SMDRReader
 public SMDRReaderService(IServiceConfiguration config)
 {
     _config = config;
     _server = new ReactiveListener(_config.Port);
     SetupSubscriptions(_server);
 }
コード例 #13
0
        public void when_client_reconnects_then_can_exchange_fixed_length_messages()
        {
            var serverReceives = new List<string>();
            var clientReceives = new List<string>();
            var messageLength = 32;

            var server = new ReactiveListener(1055);
            server.Start();

            Func<IObservable<byte>, IObservable<string>> parse =
                socket => from message in socket.Buffer(messageLength)
                          select Encoding.UTF8.GetString(message.ToArray());

            Func<string, byte[]> convert = s =>
            {
                return Encoding.UTF8.GetBytes(new string(' ', messageLength - s.Length) + s);
            };

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("Server socket created: {0}", socket.GetHashCode());

                parse(socket.Receiver).Subscribe(
                    x => serverReceives.Add(x.Trim()),
                    e => Console.WriteLine("Server socket error: {0}", e.Message),
                    () => Console.WriteLine("Server socket completed"));

                socket.SendAsync(convert("Welcome!")).Wait();
            });

            var client = new ReactiveClient("127.0.0.1", 1055);
            Console.WriteLine("Client socket created: {0}", client.GetHashCode());

            client.ConnectAsync().Wait();

            parse(client.Receiver).Subscribe(
                x => clientReceives.Add(x.Trim()),
                e => Console.WriteLine("Client socket error: {0}", e.Message),
                () => Console.WriteLine("Client socket completed"));

            client.SendAsync(convert("Hello")).Wait();

            Thread.Sleep(1200);

            // Give it time to detect the disconnection from the server.
            while (client.IsConnected)
                client.SendAsync(new byte[1]);

            Assert.Throws<InvalidOperationException>(() => client.SendAsync(convert("World")).Wait());

            client.Disconnect();
            client.Dispose();

            var tcp = new TcpClient("127.0.0.1", 1055);
            var bytes = convert("World");
            tcp.GetStream().Write(bytes, 0, bytes.Length);

            //client = new TcpClientSocket("127.0.0.1", 1055);

            //// Reconnect ansd send one more string.
            //client.ConnectAsync().Wait();
            //client.SendAsync(convert("World")).Wait();

            Thread.Sleep(1200);

            //while (serverReceives.Count < 2)
            //    Thread.Sleep(100);

            // Fails :(
            Assert.Equal("World", serverReceives.Last());

            client.Dispose();
            server.Dispose();
        }
コード例 #14
0
        public void when_client_reconnects_then_can_exchange_fixed_length_messages()
        {
            var serverReceives = new List <string>();
            var clientReceives = new List <string>();
            var messageLength  = 32;

            var server = new ReactiveListener(1055);

            server.Start();

            Func <IObservable <byte>, IObservable <string> > parse =
                socket => from message in socket.Buffer(messageLength)
                select Encoding.UTF8.GetString(message.ToArray());

            Func <string, byte[]> convert = s =>
            {
                return(Encoding.UTF8.GetBytes(new string(' ', messageLength - s.Length) + s));
            };

            server.Connections.Subscribe(socket =>
            {
                Console.WriteLine("Server socket created: {0}", socket.GetHashCode());

                parse(socket.Receiver).Subscribe(
                    x => serverReceives.Add(x.Trim()),
                    e => Console.WriteLine("Server socket error: {0}", e.Message),
                    () => Console.WriteLine("Server socket completed"));

                socket.SendAsync(convert("Welcome!")).Wait();
            });

            var client = new ReactiveClient("127.0.0.1", 1055);

            Console.WriteLine("Client socket created: {0}", client.GetHashCode());

            client.ConnectAsync().Wait();

            parse(client.Receiver).Subscribe(
                x => clientReceives.Add(x.Trim()),
                e => Console.WriteLine("Client socket error: {0}", e.Message),
                () => Console.WriteLine("Client socket completed"));

            client.SendAsync(convert("Hello")).Wait();

            Thread.Sleep(1200);

            // Give it time to detect the disconnection from the server.
            while (client.IsConnected)
            {
                client.SendAsync(new byte[1]);
            }

            Assert.Throws <InvalidOperationException>(() => client.SendAsync(convert("World")).Wait());

            client.Disconnect();
            client.Dispose();

            var tcp   = new TcpClient("127.0.0.1", 1055);
            var bytes = convert("World");

            tcp.GetStream().Write(bytes, 0, bytes.Length);

            //client = new TcpClientSocket("127.0.0.1", 1055);

            //// Reconnect ansd send one more string.
            //client.ConnectAsync().Wait();
            //client.SendAsync(convert("World")).Wait();

            Thread.Sleep(1200);

            //while (serverReceives.Count < 2)
            //    Thread.Sleep(100);

            // Fails :(
            Assert.Equal("World", serverReceives.Last());

            client.Dispose();
            server.Dispose();
        }