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 }); } }