/// <summary> /// 接受到数据并处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void onDataReceived(object sender, YTcpSrvEventArgs e) { if (!isRunning) { return; } var ip = e.State.TcpClientIP; //一分钟输出一次,某个ip正在活动 Logger.Debug($"{ip} 正在活动", ConsoleColor.DarkGreen, 60000); if (e.State.BufferCount >= e.State.Buffer.Length) { e.State.BufferCount = 0; } var reBuffer = e.State.Buffer; var reCount = e.State.BufferCount; //取得ip对应的缓存区 if (!SmClientManager.IPSessionBuffer.ContainsKey(ip)) { SmClientManager.IPSessionBuffer[ip] = SmClientManager.DefaultBuffer(); } List <SmModel> smModels; //解析套接字数据 using (var analysis = new SmAnalysis(SmClientManager.IPSessionBuffer[ip], Logger)) { smModels = analysis.ThroughAnalysisStack(reBuffer, 0, reCount); if (smModels?.Count == 0) { Logger.Debug($"{ip} 包解析失败", ConsoleColor.Red); return; } smModels?.ForEach(sm => { //按协议应给客户端回复 if (sm.PackageType == SmPackageType.ParamPackage || sm.PackageType == SmPackageType.HeartbeatPackage) { var replayPkg = SmParamApi.BuildParamPackage((byte)(sm.Cmd + 0x80), null, 2, sm.ModuleAddr); try { tcpServer.Send(e.State.TcpClient, replayPkg); } catch { Logger.Error($"回复客户端:{ip} 异常"); } } }); //设置模块地址 if (smModels?.Count > 0 && e.State.ModuleAddr == null) { e.State.ModuleAddr = smModels[0].ModuleAddr; } } if (smModels?.Count > 0) { OnDataReceivedAction?.Invoke(ip, smModels); } }
/// <summary> /// 客户端连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void onConnected(object sender, YTcpSrvEventArgs e) { if (!isRunning) { return; } //管理可报警ip客户端 //以100结尾的ip都可以收命令 if (e.State.TcpClientIP.EndsWith("100")) { ActionClientDict[e.State.TcpClientIP] = e.State; } SmClientManager.TpClientStates = ((YTcpServer)sender).Clicents; OnConnectedAction?.Invoke(e.State.TcpClientIP); }
/// <summary> /// 客户端断连 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void onDisConnected(object sender, YTcpSrvEventArgs e) { if (!isRunning) { return; } using (ActionLock.Lock()) { try { if (ActionClientDict.ContainsKey(e.Msg)) { ActionClientDict.Remove(e.Msg); } } catch (Exception ex) { Logger.Error("移除命令客户端异常" + ex); } } OnDisConnectedAction?.Invoke(e.State.TcpClientIP); }