예제 #1
0
 static IHostBuilder CreateSocketServerBuilder(string[] args) =>
    MultipleServerHostBuilder.Create()
        .AddServer<OnlinePackageInfo, OnlinePackagePipelineFilter>(onlineServerBuilder =>
        {
            onlineServerBuilder
               .ConfigureServerOptions((ctx, config) => config.GetSection("onlineServer"))
               //.UseHostedService<OnlineService>()
               .UseCommand<short, OnlinePackageInfo>()
               //.UseSession<OnlineSession>()
               .UseSessionFactory<OnlineSessionFactory>()
               .UseInProcSessionContainer();
        })
        //.AddServer<RemotePackageInfo, RemotePackagePipelineFilter>(onlineServerBuilder =>
        // {
        //     onlineServerBuilder
        //        .ConfigureServerOptions((ctx, config) => config.GetSection("remoteServer"))
        //        .UseCommand<string, RemotePackageInfo>()                      
        //        .UseInProcSessionContainer();
        // })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
                      .UseUrls("http://*:4050")
                      .UseStaticWebAssets();
        })
        //.UseWindowsService()
        .UseAutofac()
        .UseSerilog();
예제 #2
0
        public async Task TestMultipleHostStartup(Type hostConfiguratorType)
        {
            var hostConfigurator = CreateObject <IHostConfigurator>(hostConfiguratorType);

            var hostBuilder = MultipleServerHostBuilder.Create()
                              .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.Sources.Clear();
                config.AddJsonFile("Config/multiple_server.json", optional: false, reloadOnChange: true);
            })
                              .AddServer <TextPackageInfo, LinePipelineFilter>(builder =>
            {
                hostConfigurator.Configure(builder);

                builder
                .ConfigureServerOptions((ctx, config) =>
                {
                    return(config.GetSection("TestServer1"));
                })
                .UsePackageHandler(async(IAppSession s, TextPackageInfo p) =>
                {
                    await s.SendAsync(Utf8Encoding.GetBytes("Hello World\r\n"));
                });
            });

            using (var host = hostBuilder.Build())
            {
                await host.StartAsync();

                await host.StopAsync();
            }
        }
예제 #3
0
        public async Task TestMultipleServerHost()
        {
            var serverName1 = "TestServer1";
            var serverName2 = "TestServer2";

            var server1 = default(IServer);
            var server2 = default(IServer);

            IHostEnvironment actualHostEvn = null;

            var hostBuilder = MultipleServerHostBuilder.Create()
                              .ConfigureAppConfiguration((hostingContext, config) =>
            {
                actualHostEvn = hostingContext.HostingEnvironment;
                config.Sources.Clear();
                config.AddJsonFile("Config/multiple_server.json", optional: false, reloadOnChange: true);
            })
                              .ConfigureServices((hostingContext, services) =>
            {
                services.AddSingleton <MyTestService>();
            })
                              .AddServer <SuperSocketServiceA, TextPackageInfo, LinePipelineFilter>(builder =>
            {
                builder
                .ConfigureServerOptions((ctx, config) =>
                {
                    return(config.GetSection(serverName1));
                }).UseSessionHandler(async(s) =>
                {
                    server1 = s.Server as IServer;
                    await s.SendAsync(Utf8Encoding.GetBytes($"{s.Server.Name}\r\n"));
                });
            })
                              .AddServer <SuperSocketServiceB, TextPackageInfo, LinePipelineFilter>(builder =>
            {
                builder
                .ConfigureServerOptions((ctx, config) =>
                {
                    return(config.GetSection(serverName2));
                }).UseSessionHandler(async(s) =>
                {
                    server2 = s.Server as IServer;
                    await s.SendAsync(Utf8Encoding.GetBytes($"{s.Server.Name}\r\n"));
                });
            })
                              .ConfigureLogging((hostCtx, loggingBuilder) =>
            {
                loggingBuilder.AddConsole();
                loggingBuilder.AddDebug();
            });

            using (var host = hostBuilder.Build())
            {
                await host.StartAsync();

                var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 4040));

                using (var stream = new NetworkStream(client))
                    using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                        using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                        {
                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal(serverName1, line);
                        }

                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 4041));

                using (var stream = new NetworkStream(client))
                    using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                        using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                        {
                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal(serverName2, line);
                        }

                var hostEnv = server1.ServiceProvider.GetService <IHostEnvironment>();
                Assert.NotNull(hostEnv);
                Assert.Equal(actualHostEvn.ContentRootPath, hostEnv.ContentRootPath);

                var hostAppLifetime = server1.ServiceProvider.GetService <IHostApplicationLifetime>();
                Assert.NotNull(hostAppLifetime);

                var hostLifetime = server1.ServiceProvider.GetService <IHostLifetime>();
                Assert.NotNull(hostLifetime);

                var hostFromServices = server1.ServiceProvider.GetService <IHost>();
                Assert.NotNull(hostFromServices);

                var loggerFactory0 = host.Services.GetService <ILoggerFactory>();
                var loggerFactory1 = server1.ServiceProvider.GetService <ILoggerFactory>();
                var loggerFactory2 = server2.ServiceProvider.GetService <ILoggerFactory>();

                Assert.Equal(loggerFactory0, loggerFactory1);
                Assert.Equal(loggerFactory1, loggerFactory2);

                var testService0 = host.Services.GetService <MyTestService>();
                testService0.Name    = "SameInstance";
                testService0.Version = 1;

                var testService1 = server1.ServiceProvider.GetService <MyTestService>();
                Assert.Equal(testService0.Name, testService1.Name);
                Assert.Equal(1, testService1.Version);
                testService1.Version = 2;

                var testService2 = server2.ServiceProvider.GetService <MyTestService>();
                Assert.Equal(testService0.Name, testService2.Name);
                Assert.Equal(2, testService2.Version);

                await host.StopAsync();
            }
        }
예제 #4
0
        public static MultipleServerHostBuilder AddWebSocketServer <TWebSocketService>(this MultipleServerHostBuilder hostBuilder, Action <ISuperSocketHostBuilder <WebSocketPackage> > hostBuilderDelegate)
            where TWebSocketService : WebSocketService
        {
            var appHostBuilder = new WebSocketHostBuilderAdapter(hostBuilder);

            appHostBuilder
            .UseHostedService <TWebSocketService>();

            hostBuilderDelegate?.Invoke(appHostBuilder);

            hostBuilder.AddServer(appHostBuilder);
            return(hostBuilder);
        }
예제 #5
0
 public static MultipleServerHostBuilder AddWebSocketServer(this MultipleServerHostBuilder hostBuilder, Action <ISuperSocketHostBuilder <WebSocketPackage> > hostBuilderDelegate)
 {
     return(hostBuilder.AddWebSocketServer <WebSocketService>(hostBuilderDelegate));
 }
        public async Task TestMultipleServerHost()
        {
            var serverName1 = "TestServer1";
            var serverName2 = "TestServer2";

            var hostBuilder = MultipleServerHostBuilder.Create()
                              .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.Sources.Clear();
                config.AddJsonFile("Config/multiple_server.json", optional: false, reloadOnChange: true);
            })
                              .AddServer <MySocketService, StringPackageInfo, CommandLinePipelineFilter>(builder =>
            {
                builder
                .ConfigureServerOptions((ctx, config) =>
                {
                    return(config.GetSection(serverName1));
                }).UseSessionHandler(async(s) =>
                {
                    await s.SendAsync(Utf8Encoding.GetBytes($"{s.Server.Name}\r\n"));
                })
                .UseCommand(commandOptions =>
                {
                    // register all commands in one assembly
                    commandOptions.AddCommandAssembly(typeof(MIN).GetTypeInfo().Assembly);
                });
            })
                              .AddWebSocketServer <MyWebSocketService>(builder =>
            {
                builder
                .ConfigureServerOptions((ctx, config) =>
                {
                    return(config.GetSection(serverName2));
                })
                .UseCommand <StringPackageInfo, StringPackageConverter>(commandOptions =>
                {
                    commandOptions.AddCommand <ADD>();
                    commandOptions.AddCommand <MULT>();
                    commandOptions.AddCommand <SUB>();
                });
            })
                              .ConfigureLogging((hostCtx, loggingBuilder) =>
            {
                loggingBuilder.AddConsole();
                loggingBuilder.AddDebug();
            });

            using (var host = hostBuilder.Build())
            {
                await host.StartAsync();

                var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, DefaultServerPort));

                using (var stream = new NetworkStream(client))
                    using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                        using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                        {
                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal(serverName1, line);

                            await streamWriter.WriteAsync("MIN 8 6 3\r\n");

                            await streamWriter.FlushAsync();

                            line = await streamReader.ReadLineAsync();

                            Assert.Equal("3", line);

                            await streamWriter.WriteAsync("SORT 8 6 3\r\n");

                            await streamWriter.FlushAsync();

                            line = await streamReader.ReadLineAsync();

                            Assert.Equal("SORT 3 6 8", line);
                        }

                var websocket = new ClientWebSocket();

                await websocket.ConnectAsync(new Uri($"ws://localhost:{AlternativeServerPort}"), CancellationToken.None);

                Assert.Equal(WebSocketState.Open, websocket.State);

                var receiveBuffer = new byte[256];

                Assert.Equal("11", await GetWebSocketReply(websocket, receiveBuffer, "ADD 5 6"));
                Assert.Equal("8", await GetWebSocketReply(websocket, receiveBuffer, "SUB 10 2"));
                Assert.Equal("21", await GetWebSocketReply(websocket, receiveBuffer, "MULT 3 7"));

                await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);

                Assert.Equal(WebSocketState.Closed, websocket.State);

                await host.StopAsync();
            }
        }
예제 #7
0
        public async Task TestCommandsWithCustomSessionMultipleServerHost(Type hostConfiguratorType)
        {
            var hostConfigurator = CreateObject <IHostConfigurator>(hostConfiguratorType);

            using (var server = MultipleServerHostBuilder.Create()
                                .ConfigureAppConfiguration((hostCtx, configApp) =>
            {
                configApp.Sources.Clear();
                configApp.AddInMemoryCollection(new Dictionary <string, string>
                {
                    { "serverOptions:name", "TestServer" },
                    { "serverOptions:listeners:0:ip", "Any" },
                    { "serverOptions:listeners:0:port", "4040" }
                });
            })
                                .AddServer <StringPackageInfo, CommandLinePipelineFilter>(builder =>
            {
                builder
                .UseCommand()
                .UseSession <MySession>()
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureContainer <ContainerBuilder>(builder =>
                {
                    builder.RegisterType <ADD>().As <IAsyncCommand <IAppSession, StringPackageInfo> >();
                    builder.RegisterType <MULT>().As <IAsyncCommand <IAppSession, StringPackageInfo> >();
                    builder.RegisterType <SUB>().As <IAsyncCommand <IAppSession, StringPackageInfo> >();
                    builder.RegisterType <DIV>().As <IAsyncCommand <MySession, StringPackageInfo> >();
                });
            }).BuildAsServer())
            {
                Assert.Equal("TestServer", server.Name);

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

                var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                await client.ConnectAsync(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4040));

                OutputHelper.WriteLine("Connected.");

                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("ADD 1 2 3\r\n");

                            await streamWriter.FlushAsync();

                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal("6", line);

                            await streamWriter.WriteAsync("MULT 2 5\r\n");

                            await streamWriter.FlushAsync();

                            line = await streamReader.ReadLineAsync();

                            Assert.Equal("10", line);

                            await streamWriter.WriteAsync("SUB 8 2\r\n");

                            await streamWriter.FlushAsync();

                            line = await streamReader.ReadLineAsync();

                            Assert.Equal("6", line);

                            await streamWriter.WriteAsync("DIV 8 2\r\n");

                            await streamWriter.FlushAsync();

                            line = await streamReader.ReadLineAsync();

                            Assert.Equal("4", line);
                        }

                await server.StopAsync();
            }
        }