using DotNetty.Transport.Bootstrapping; using DotNetty.Transport.Channels; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace NearCardAttendance.TcpServer { public class Server : BackgroundService { private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; private readonly ServerBootstrap _serverBootstrap; private IChannel _serverChannel = default!; private CancellationTokenSource _tokenSource = null!; public Server( ILogger logger, ServerBootstrap serverBootstrap, IServiceProvider serviceProvider) { _logger = logger; _serviceProvider = serviceProvider; _serverBootstrap = serverBootstrap; } public override Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("------StartAsync"); _tokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); return base.StartAsync(cancellationToken); } public override Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("------StopAsync"); _tokenSource.Cancel(); //停止工作线程 return base.StopAsync(cancellationToken); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("DotNetty server starting..."); //var address = new IPEndPoint(IPAddress.Any, 12345); //IChannel _serverChannel = await _serverBootstrap.BindAsync(address); string ipAddress = "0.0.0.0"; int port = 16662; var endPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port); IChannel _serverChannel = await _serverBootstrap.BindAsync(endPoint); // _serverChannel.GetAttribute(MessageIdAttribute.Key).Set("SomeRequestId"); //_logger.LogInformation("DotNetty server started on {0}.", address); _logger.LogInformation("DotNetty server started on {0}.", endPoint); // Wait until the service is stopped stoppingToken.WaitHandle.WaitOne(); _logger.LogInformation("DotNetty server stopping..."); // Close the server channel and release resources await _serverChannel.CloseAsync(); _logger.LogInformation("DotNetty server stopped."); } } }