Esempio n. 1
0
        public async Task TestConsoleProtocol()
        {
            var hostConfigurator = new RegularHostConfigurator();

            using (var server = CreateSocketServerBuilder <TextPackageInfo, LinePipelineFilter>(hostConfigurator)
                                .UsePackageHandler(async(IAppSession s, TextPackageInfo p) =>
            {
                await s.SendAsync(Utf8Encoding.GetBytes("Hello World\r\n"));
            }).BuildAsServer() as IServer)
            {
                Assert.True(await server.StartAsync());
                Assert.Equal(0, server.SessionCount);

                var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(hostConfigurator.GetServerEndPoint());

                using (var stream = await hostConfigurator.GetClientStream(client))
                    using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                        using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                        {
                            await streamWriter.WriteAsync("Hello World\r\n");

                            await streamWriter.FlushAsync();

                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal("Hello World", line);
                        }

                await server.StopAsync();
            }
        }
Esempio n. 2
0
        public async Task TestInProcSessionContainer()
        {
            var hostConfigurator = new RegularHostConfigurator();

            using (var server = CreateSocketServerBuilder <StringPackageInfo, MyPipelineFilter>(hostConfigurator)
                                .UseCommand <string, StringPackageInfo>(commandOptions =>
            {
                commandOptions.AddCommand <SESS>();
            })
                                .UseInProcSessionContainer()
                                .ConfigureServices((ctx, services) =>
                                                   services.AddSingleton <SessionContainerDependentService>()
                                                   )
                                .BuildAsServer())
            {
                Assert.Equal("TestServer", server.Name);

                var sessionContainer = server.GetSessionContainer();
                Assert.NotNull(sessionContainer);

                var sessionContainerDependentService = server.ServiceProvider.GetService <SessionContainerDependentService>();
                Assert.NotNull(sessionContainerDependentService);
                Assert.NotNull(sessionContainerDependentService.SessionContainer);
                var asyncSessionContainer = sessionContainerDependentService.AsyncSessionContainer as SyncToAsyncSessionContainerWrapper;
                Assert.NotNull(asyncSessionContainer);
                Assert.Same(sessionContainerDependentService.SessionContainer, asyncSessionContainer.SessionContainer);
                Assert.Same(sessionContainer, sessionContainerDependentService.SessionContainer);

                Assert.True(await server.StartAsync());
                OutputHelper.WriteLine("Server started.");

                var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(hostConfigurator.GetServerEndPoint());

                OutputHelper.WriteLine("Connected.");

                Thread.Sleep(1000);

                Assert.Equal(1, sessionContainer.GetSessionCount());

                var sessionID = string.Empty;

                var closed = false;

                using (var stream = await hostConfigurator.GetClientStream(client))
                    using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                        using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                        {
                            await streamWriter.WriteAsync("SESS\r\n");

                            await streamWriter.FlushAsync();

                            sessionID = await streamReader.ReadLineAsync();

                            Assert.False(string.IsNullOrEmpty(sessionID));

                            var session = sessionContainer.GetSessionByID(sessionID);

                            Assert.NotNull(session);
                            Assert.Equal(sessionID, session.SessionID);

                            session.Closed += (s, e) =>
                            {
                                closed = true;
                                return(new ValueTask());
                            };

                            await session.Channel.CloseAsync(CloseReason.LocalClosing);
                        }

                await Task.Delay(1000);

                Assert.Equal(0, sessionContainer.GetSessionCount());
                Assert.Null(sessionContainer.GetSessionByID(sessionID));
                Assert.True(closed);

                await server.StopAsync();
            }
        }