Esempio n. 1
0
        protected override async Task <int> Execute(ICommandManager commandManager)
        {
            ExecutionContext context       = LifetimeScope.Resolve <ExecutionContext>();
            ContainerBuilder serverBuilder = new ContainerBuilder();

            serverBuilder.RegisterModule <NamedPipeServer.DiModule>();
            serverBuilder.RegisterInstance(new CommandLineLifetimeScope(LifetimeScope))
            .AsSelf();
            serverBuilder.RegisterInstance(LifetimeScope.Resolve <ILog>()).As <ILog>();
            using (IContainer serverHost = serverBuilder.Build())
                using (ManualResetEvent serverStoppedEvent = new ManualResetEvent(false))
                {
                    ICliServer server = serverHost.Resolve <ICliServer>();
                    server.Disconnected += ServerOnDisconnected;
                    context.WriteInformation(string.Format(CultureInfo.InvariantCulture, MessageResources.StartingServerMessage, ServerName));
                    bool result = await server.Start(ServerName, HeartbeatEnabled).ConfigureAwait(false);

                    if (!result)
                    {
                        return(-1);
                    }
                    context.WriteInformation(MessageResources.ServerStartedMessage);

                    serverStoppedEvent.WaitOne(-1, true);

                    void ServerOnDisconnected(object sender, EventArgs e)
                    {
                        server.Disconnected -= ServerOnDisconnected;
                        serverStoppedEvent.Set();
                    }
                }

            context.WriteInformation(MessageResources.ServerStopped);
            return(0);
        }
Esempio n. 2
0
        protected override async Task <int> Execute(ICommandManager commandManager)
        {
            ExecutionContext context = LifetimeScope.Resolve <ExecutionContext>();

            context.WriteInformation(string.Format(CultureInfo.InvariantCulture, MessageResources.ClientStarting, ServerName));
            using (ICommunicationProtocol protocol = await NamedPipeCommunicationProtocol.Connect(ServerName,
                                                                                                  LifetimeScope.Resolve <StreamFactory>(),
                                                                                                  LifetimeScope.Resolve <ILog>(),
                                                                                                  actAsClient: true)
                                                     .ConfigureAwait(false))
                using (ManualResetEvent serverStoppedEvent = new ManualResetEvent(false))
                {
                    context.WriteInformation(MessageResources.ClientStarted);
                    protocol.CommunicationError += OnError;
                    protocol.MessageReceived    += OnMessageReceived;
                    protocol.Start();

                    Task.Run(ReadConsoleAsync);
                    serverStoppedEvent.WaitOne(-1, true);

                    return(0);

                    void OnError(object sender, EventArgs e)
                    {
                        protocol.CommunicationError -= OnError;
                        context.WriteInformation(MessageResources.ClientServerDisconnectedMessage);
                        serverStoppedEvent.Set();
                    }

                    void OnMessageReceived(object sender, MessageReceivedEventArgs e)
                    {
                        context.WriteInformation(MessageResources.ClientMessageReceived);
                        context.WriteInformation(Encoding.UTF8.GetString(e.Message.ReadToEnd()));
                    }

                    void ReadConsoleAsync()
                    {
                        string serverMessage = Console.ReadLine();

                        if (serverMessage?.Equals("kill", StringComparison.OrdinalIgnoreCase) == true)
                        {
                            serverStoppedEvent.Set();
                        }
                        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(serverMessage)))
                        {
                            context.WriteInformation(MessageResources.ClientSendingMessage);
                            protocol.SendMessage(stream);
                        }

                        Task.Run(ReadConsoleAsync);
                    }
                }
        }