private static async Task ManyAcceptConnections(CancellationToken token) { while (!token.IsCancellationRequested) { try { var client = await ManyListener.AcceptTcpClientAsync(); Logger.Warn($"设备已连接,IP:{client.Client.RemoteEndPoint}"); var md = new ManyMetadata(client); Clients.TryAdd(client.Client.RemoteEndPoint.ToString(), md); Logger.Info($"设备连接数:{Clients.Count}"); #pragma warning disable 4014 Task.Run(() => ManyDataReceiver(md), md.Token); #pragma warning restore 4014 } catch (Exception e) { Logger.Info(e.Message); } } }
private static async Task ManyDataReceiver(ManyMetadata md) { var header = "[" + md.TcpClient.Client.RemoteEndPoint.ToString() + "]"; Logger.Info($"{header} many data receiver started"); try { while (true) { if (!IsClientConnected(md.TcpClient)) { Logger.Error(header + $" client no longer connected[{md.LinkId}]"); break; } if (Token.IsCancellationRequested) { Logger.Info(header + " cancellation requested"); break; } var data = await DataReadAsync(md.TcpClient, Token); if (data == null || data.Length < 1) { Thread.Sleep(100); continue; } Logger.Info($"[M-1][{md.TcpClient.Client.RemoteEndPoint}]:{StringHelper.BytesToHexString(data)}"); var length = data.Length; var linkId = 0; if (data.Length > 3) { var linkIdHigh = data[2]; var linkIdLow = data[3]; linkId = (linkIdHigh << 8) | (linkIdLow); switch (data[1]) { case 0xC7: Logger.Info($"收到连接[4][{Clients.Count}][{linkId}]注册包"); break; case 0xC8: Logger.Info($"收到连接[4][{Clients.Count}][{linkId}]心跳包"); break; } } } } catch (Exception e) { Logger.Info( Environment.NewLine + header + " ManyDataReceiver Exception: " + Environment.NewLine + e.ToString() + Environment.NewLine + e.StackTrace ); } Logger.Info(header + " data receiver terminating"); Clients.TryRemove(md.TcpClient.Client.RemoteEndPoint.ToString(), out _); md.Dispose(); }