コード例 #1
0
        static void Main()
        {
            VRpcListener listener = new VRpcListener(IPAddress.Any, 1234);

            listener.Start();
            Thread.Sleep(-1);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: DanilovSoft/vRPC
        static async Task Main()
        {
            Console.Title = "Сервер";
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal;
            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

            RpcInitializer.Initialize(_memoryManager);
            using (var listener = new VRpcListener(IPAddress.Any, Port))
            {
                listener.ConfigureService(ioc =>
                {
                    ioc.AddLogging(loggingBuilder =>
                    {
                        loggingBuilder
                        .AddConsole()
                        .AddDebug();
                    });

                    ioc.AddSingleton(new Program());
                });

                Console.CancelKeyPress += (_, e) =>
                {
                    e.Cancel = true;
                    lock (_conLock)
                    {
                        Console.WriteLine("Stopping...");
                    }
                    listener.BeginShutdown(TimeSpan.FromSeconds(3), "Пользователь нажал Ctrl+C");
                };

                listener.ClientConnected    += Listener_ClientConnected;
                listener.ClientDisconnected += Listener_ClientDisconnected;

                //var lt = listener.ServiceProvider.GetRequiredService<IHostApplicationLifetime>();

                await listener.RunAsync();

                //listener.Start();

                //Console.Clear();
                //long prev = 0;
                //var sw = Stopwatch.StartNew();
                //while (!listener.Completion.IsCompleted)
                //{
                //    Thread.Sleep(1000);
                //    long elapsedMs = sw.ElapsedMilliseconds;
                //    long rCount = Interlocked.Read(ref ReqCount);
                //    ulong reqPerSecond = unchecked((ulong)(rCount - prev));
                //    prev = rCount;
                //    sw.Restart();

                //    var reqPerSec = (int)Math.Round(reqPerSecond * 1000d / elapsedMs);
                //    ToConsole(Interlocked.Read(ref _connections), reqPerSec, ReqCount);
                //}
                //ToConsole(0, 0, 0);
            }
        }
コード例 #3
0
        public void TestNotification()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            iface.Notify(123);
        }
コード例 #4
0
        public void TestSumResult()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            int sum = iface.GetSum(1, 2);

            Assert.Equal(3, sum);
        }
コード例 #5
0
        public async Task TestNotificationAsync()
        {
            const int port = 1008;

            using var listener = new VRpcListener(IPAddress.Any, port);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            await iface.NotifyAsync(123);
        }
コード例 #6
0
        public void TestAsyncCallback()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            string selfEcho = iface.MakeAsyncCallback("qwerty");

            Assert.Equal("qwerty", selfEcho);
        }
コード例 #7
0
        public async Task TestNullStringAsync()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            string value = await iface.GetNullStringAsync();

            Assert.Null(value);
        }
コード例 #8
0
        public void TestStringResult()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            string value = iface.GetString();

            Assert.Equal("OK", value);
        }
コード例 #9
0
        public async Task TestSumAsync()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            int sum = await iface.GetSumAsync(1, 2);

            Assert.AreEqual(3, sum);
        }
コード例 #10
0
        static void Main()
        {
            var listener = VRpcListener.StartNew(IPAddress.Any);

            var cli   = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            iface.GetSum(1, 2);
            iface.GetSum(1, 2);
            iface.GetSum(1, 2);

            Thread.Sleep(-1);
        }
コード例 #11
0
        public void TestSumValueTask()
        {
            const int port = 1003;

            using var listener = new VRpcListener(IPAddress.Any, port);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            int sum = iface.GetSum2(1, 2);

            Assert.Equal(3, sum);
        }
コード例 #12
0
ファイル: ErrorsTest.cs プロジェクト: DanilovSoft/vRPC
        public async Task TestInvalidRequest()
        {
            var listener = VRpcListener.StartNew(IPAddress.Any);
            var ws       = new DanilovSoft.WebSockets.ClientWebSocket();

            await ws.ConnectAsync(new Uri($"ws://*****:*****@"{""jsonrpc"": ""2.0"", ""method"": 1, ""params"": ""bar""}"), WebSocketMessageType.Text, true, default);

            var buf = new byte[1024];
            var m   = await ws.ReceiveAsync(buf, default);

            Assert.AreEqual("Parse error (-32700)", m.CloseStatusDescription);
        }
コード例 #13
0
        public void TestNullStringResult()
        {
            const int port = 1005;

            using var listener = new VRpcListener(IPAddress.Any, port);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            string value = iface.GetNullString();

            Assert.Null(value);
        }
コード例 #14
0
        public void TestNotificationCallback()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var mre = new ManualResetEventSlim(false);

            cli.ConfigureService(x => x.AddSingleton(mre));
            var iface = cli.GetProxy <IServerTestController>();

            iface.NotifyCallback(123);

            Assert.True(mre.Wait(30_000));
        }
コード例 #15
0
ファイル: ErrorsTest.cs プロジェクト: DanilovSoft/vRPC
        public void TestInternalError()
        {
            var listener = VRpcListener.StartNew(IPAddress.Any);
            var client   = new VRpcClient("localhost", listener.Port, false, true);

            try
            {
                client.GetProxy <IServerTestController>().JTestInternalError();
            }
            catch (VRpcInternalErrorException)
            {
                return;
            }
            Assert.Fail();
        }
コード例 #16
0
        public async Task TestAsyncVoid()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, false);
            var iface = cli.GetProxy <IServerTestController>();

            cli.Connect();

            var sw = Stopwatch.StartNew();
            await iface.Test2Async();

            Assert.True(sw.ElapsedMilliseconds >= 500);
        }
コード例 #17
0
ファイル: ErrorsTest.cs プロジェクト: DanilovSoft/vRPC
        public void TestMethodNotFound()
        {
            var listener = VRpcListener.StartNew(IPAddress.Any);
            var client   = new VRpcClient("localhost", listener.Port, false, true);

            try
            {
                client.GetProxy <IServerTestController>().JNotExistedMethod();
            }
            catch (VRpcMethodNotFoundException)
            {
                return;
            }
            Assert.Fail();
        }
コード例 #18
0
        public void TestException()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            try
            {
                iface.TestException("проверка");
            }
            catch (VRpcBadRequestException ex)
            {
                Assert.Equal("проверка", ex.Message);
            }
        }
コード例 #19
0
        public void TestVoid()
        {
            const int port = 1000;

            using var listener = new VRpcListener(IPAddress.Any, port);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", port, false, false);
            var iface = cli.GetProxy <IServerTestController>();

            cli.Connect();

            var sw = Stopwatch.StartNew();

            iface.TestDelay();
            Assert.True(sw.ElapsedMilliseconds >= 500);
        }
コード例 #20
0
        public void TestMethodNotFound()
        {
            using var listener = new VRpcListener(IPAddress.Any);
            listener.Start();

            using var cli = new VRpcClient("127.0.0.1", listener.Port, false, true);
            var iface = cli.GetProxy <IServerTestController>();

            try
            {
                iface.NotFoundMethod();
                Assert.True(false);
            }
            catch (VRpcException ex)
            {
            }
        }
コード例 #21
0
        static void Main()
        {
            VRpcListener listener = new VRpcListener(IPAddress.Any, 1234);

            listener.Start();

            int count = GetConnectionsCount();

            _clients = new VRpcClient[count];

            ThreadPool.QueueUserWorkItem(async delegate
            {
                for (int i = 0; i < count; i++)
                {
                    _clients[i] = CreateClient();
                    ThreadPool.UnsafeQueueUserWorkItem(s => ThreadEntry(s), i);
                }

                while (true)
                {
                    await Task.Delay(200);
                    var cli = _clients[new Random().Next(_clients.Length)];
                    if (cli.State == VRpcState.Open)
                    {
                        var result = cli.Shutdown(TimeSpan.Zero, "Провоцируем обрыв");
                        cli.Dispose();
                    }
                    //cli.Dispose();
                }
            });

            Console.Write("Connections Count: ");
            var pos = Console.CursorLeft;

            while (true)
            {
                Console.CursorLeft = pos;
                string sCount = Volatile.Read(ref _connectionsCount).ToString();
                Console.Write(sCount.PadRight(10));
                Console.CursorLeft = pos + sCount.Length;
                Thread.Sleep(200);
            }
        }
コード例 #22
0
ファイル: ErrorsTest.cs プロジェクト: DanilovSoft/vRPC
        public async Task MethodNotFoundTest()
        {
            VRpcListener listener = new VRpcListener(IPAddress.Any);

            listener.Start();

            var ws = new DanilovSoft.WebSockets.ClientWebSocket();
            await ws.ConnectAsync(new Uri($"ws://*****:*****@"{""jsonrpc"": ""2.0"", ""method"": ""foobar"", ""id"": ""1""}"), WebSocketMessageType.Text, true, default);

            byte[] buf = new byte[1024];
            var    m   = await ws.ReceiveAsync(buf, default);

            string response = Encoding.UTF8.GetString(buf.AsSpan(0, m.Count));

            //var dto = JsonSerializer.Deserialize<ErrorResponse>(response);

            Assert.Equal("Parse error (-32700)", m.CloseStatusDescription);
        }
コード例 #23
0
ファイル: Program.cs プロジェクト: dex-it/DanilovSoft.vRPC
        static async Task Main()
        {
            var listener = new VRpcListener(IPAddress.Any, 1234);

            listener.Start();
            var client = new VRpcClient("localhost", port: 1234, ssl: false, allowAutoConnect: true);

            client.Connect();
            var proxy = client.GetProxy <IBenchmark>();

            while (true)
            {
                try
                {
                    proxy.VoidOneArg(123);
                }
                catch (VRpcBadRequestException ex)
                {
                }
            }
        }