Пример #1
0
        public async Task TestDetachableChannel(Type hostConfiguratorType)
        {
            var hostConfigurator = CreateObject <IHostConfigurator>(hostConfiguratorType);

            using (var server = CreateSocketServerBuilder <TextPackageInfo, LinePipelineFilter>(hostConfigurator)
                                .UsePackageHandler(async(s, p) =>
            {
                await s.SendAsync(Utf8Encoding.GetBytes("PRE-" + p.Text + "\r\n"));
            }).BuildAsServer())
            {
                Assert.Equal("TestServer", server.Name);

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

                var services = new ServiceCollection();
                services.AddLogging();
                services.Configure <ILoggingBuilder>((loggingBuilder) =>
                {
                    loggingBuilder.AddConsole();
                });

                var sp = services.BuildServiceProvider();

                var loggerFactory = sp.GetService <ILoggerFactory>();
                var logger        = loggerFactory.CreateLogger("Client");

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

                var stream = await hostConfigurator.GetClientStream(socket);

                var channel = new StreamPipeChannel <TextPackageInfo>(stream, socket.RemoteEndPoint, socket.LocalEndPoint, new LinePipelineFilter(), new ChannelOptions
                {
                    Logger       = logger,
                    ReadAsDemand = true
                });

                channel.Start();

                var msg = Guid.NewGuid().ToString();
                await channel.SendAsync(Utf8Encoding.GetBytes(msg + "\r\n"));

                var round = 0;

                await foreach (var package in channel.RunAsync())
                {
                    Assert.NotNull(package);
                    Assert.Equal("PRE-" + msg, package.Text);
                    round++;

                    if (round >= 10)
                    {
                        break;
                    }

                    msg = Guid.NewGuid().ToString();
                    await channel.SendAsync(Utf8Encoding.GetBytes(msg + "\r\n"));
                }


                OutputHelper.WriteLine("Before DetachAsync");

                await channel.DetachAsync();

                // the connection is still alive in the server
                Assert.Equal(1, server.SessionCount);

                // socket.Connected is is still connected
                Assert.True(socket.Connected);

                var ns = stream as DerivedNetworkStream;
                Assert.True(ns.Socket.Connected);

                // the stream is still usable
                using (var streamReader = new StreamReader(stream, Utf8Encoding, true))
                    using (var streamWriter = new StreamWriter(stream, Utf8Encoding, 1024 * 1024 * 4))
                    {
                        for (var i = 0; i < 10; i++)
                        {
                            var txt = Guid.NewGuid().ToString();
                            await streamWriter.WriteAsync(txt + "\r\n");

                            await streamWriter.FlushAsync();

                            var line = await streamReader.ReadLineAsync();

                            Assert.Equal("PRE-" + txt, line);
                        }
                    }

                await server.StopAsync();
            }
        }
        public async Task <LoginResult> ConnectAsync(string server, string username, string password, int serverId)
        {
            var connString = $"Server={server}; UID={username}; Password={password}";

            var mysqlConn = new MySqlConnection(connString);

            try
            {
                await mysqlConn.OpenAsync();
            }
            catch (Exception e)
            {
                return(new LoginResult
                {
                    Result = false,
                    Message = e.Message
                });
            }

            try
            {
                var binlogInfo = await GetBinlogFileNameAndPosition(mysqlConn);

                var binlogChecksum = await GetBinlogChecksum(mysqlConn);
                await ConfirmChecksum(mysqlConn);

                LogEvent.ChecksumType = binlogChecksum;

                _stream   = GetStreamFromMySQLConnection(mysqlConn);
                _serverId = serverId;

                await StartDumpBinlog(_stream, serverId, binlogInfo.Item1, binlogInfo.Item2);

                _connection = mysqlConn;

                var channel = new StreamPipeChannel <LogEvent>(_stream, null,
                                                               new LogEventPipelineFilter
                {
                    Context = new ReplicationState()
                },
                                                               new ChannelOptions
                {
                    Logger = Logger
                });

                SetupChannel(channel);
                return(new LoginResult {
                    Result = true
                });
            }
            catch (Exception e)
            {
                await mysqlConn.CloseAsync();

                return(new LoginResult
                {
                    Result = false,
                    Message = e.Message
                });
            }
        }