using DyeingComputer.UserClass; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Sockets; using System.Reflection.Emit; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using TouchSocket.Core; using TouchSocket.Sockets; using DyeingComputer.ViewModel; using System.Runtime.InteropServices; using ScottPlot.Colormaps; namespace DyeingComputer.UserClass {/// /// 异步TCP服务器 /// public class AsyncTcpServer { //设置系统时间的API函数 [DllImport("kernel32.dll")] private static extern bool SetLocalTime(ref SYSTEMTIME time); [StructLayout(LayoutKind.Sequential)] private struct SYSTEMTIME { public short year; public short month; public short dayOfWeek; public short day; public short hour; public short minute; public short second; public short milliseconds; } /// /// 设置系统时间 /// /// 需要设置的时间 /// 返回系统时间设置状态,true为成功,false为失败 private static bool SetLocalDateTime(DateTime dt) { SYSTEMTIME st; st.year = (short)dt.Year; st.month = (short)dt.Month; st.dayOfWeek = (short)dt.DayOfWeek; st.day = (short)dt.Day; st.hour = (short)dt.Hour; st.minute = (short)dt.Minute; st.second = (short)dt.Second; st.milliseconds = (short)dt.Millisecond; bool rt = SetLocalTime(ref st); return rt; } public static async Task Main() { TcpService service = new TcpService(); service.Connecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在连接 service.Connected = (client, e) => { return EasyTask.CompletedTask; };//有客户端成功连接 service.Closing = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在断开连接,只有当主动断开时才有效。 service.Closed = (client, e) => { return EasyTask.CompletedTask; };//有客户端断开连接 service.Received = (client, e) => { string SYSAPI = e.ByteBlock.Span.ToString(Encoding.ASCII).Substring(0,5); string SYSDAT = e.ByteBlock.Span.ToString(Encoding.ASCII).Substring(5); //LogGing.LogSQLDATA("800", "TcpServer", "API:"+ SYSAPI); if (SYSAPI == "SC800") client.SendAsync(MainWindowViewModel.S01); else if (SYSAPI == "SC801") client.SendAsync(MainWindowViewModel.S16.ToString()); else if (SYSAPI == "SC802") client.SendAsync(MainWindowViewModel.S03); else if (SYSAPI == "SC803") client.SendAsync(MainWindowViewModel.S05); else if (SYSAPI == "SC804") client.SendAsync(MainWindowViewModel.S06); else if (SYSAPI == "SC810") { } else if (SYSAPI == "SC820") { if (SYSDAT.Length == 21) { SYSDAT = SYSDAT.Substring(1,19); DateTime dt; if(DateTime.TryParse(SYSDAT,out dt)) SetLocalDateTime(dt); } client.SendAsync("[" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")+"]"); }//设置系统时间 else if (SYSAPI == "SC830") { Dictionary Chart_new = new Dictionary();//缓存函数 Chart_new.Add("DYELOT", MainWindowViewModel.WorkNumder); Chart_new.Add("Time", MainWindowViewModel.SYSTime); Chart_new.Add("MST", MainWindowViewModel.TEMP_co); Chart_new.Add("MTT", MainWindowViewModel.Selet_dtm("1010")); Chart_new.Add("MTL", MainWindowViewModel.Selet_dtm("1015")); Chart_new.Add("MTH", MainWindowViewModel.Selet_dtm("1009")); Chart_new.Add("MUT", MainWindowViewModel.Selet_dtm("1011")); Chart_new.Add("STTA", MainWindowViewModel.Selet_dtm("1012")); Chart_new.Add("STLA", MainWindowViewModel.Selet_dtm("1017")); Chart_new.Add("STTB", MainWindowViewModel.Selet_dtm("1013")); Chart_new.Add("STLB", MainWindowViewModel.Selet_dtm("1018")); Chart_new.Add("STTC", MainWindowViewModel.Selet_dtm("1014")); Chart_new.Add("STLC", MainWindowViewModel.Selet_dtm("1019")); client.SendAsync("["+ MainWindowViewModel.S01 + "]"+Chart_new.ToJsonString()); }//当前信息 else if (SYSAPI == "SC851") { client.SendAsync("[" + MainWindowViewModel.S01 + "]" + MainWindowViewModel.dt_d.ToJsonString());//数字开关信息 }//数字开关表 else if (SYSAPI == "SC852") { client.SendAsync("[" + MainWindowViewModel.S01 + "]" + MainWindowViewModel.dt_a.ToJsonString());//寄存器信息 }//寄存器表 else if (SYSAPI == "SC853") { client.SendAsync("[" + MainWindowViewModel.S01 + "]" + MainWindowViewModel.dt_m.ToJsonString());//缓存信息 }//缓存表 return EasyTask.CompletedTask; }; await service.SetupAsync(new TouchSocketConfig()//载入配置 .SetListenIPHosts(new IPHost[] { new IPHost("tcp://127.0.0.1:7789"), new IPHost(7790) })//同时监听两个地址 .ConfigureContainer(a =>//容器的配置顺序应该在最前面 { //a.AddConsoleLogger();//添加一个控制台日志注入(注意:在maui中控制台日志不可用) }) .ConfigurePlugins(a => { //a.Add(); }) ); await service.StartAsync();//启动 LogGing.LogGingDATA("800SREVER:START"); } } class MyTcpService : TcpService { protected override MyTcpSessionClient NewClient() { return new MyTcpSessionClient(); } } class MyTcpSessionClient : TcpSessionClient { internal void SetDataHandlingAdapter(SingleStreamDataHandlingAdapter adapter) { base.SetAdapter(adapter); } } /// /// 此插件实现,按照不同端口,使用不同适配器。 /// /// 7789端口:使用"**"结尾的数据 /// 7790端口:使用"##"结尾的数据 /// /// internal class DifferentProtocolPlugin : PluginBase, ITcpConnectingPlugin, ITcpReceivedPlugin { public async Task OnTcpConnecting(ITcpSession client, ConnectingEventArgs e) { if (client is MyTcpSessionClient sessionClient) { if (sessionClient.ServicePort == 7789) { sessionClient.SetDataHandlingAdapter(new TerminatorPackageAdapter("**")); } else { sessionClient.SetDataHandlingAdapter(new TerminatorPackageAdapter("##")); } } await e.InvokeNext(); } public async Task OnTcpReceived(ITcpSession client, ReceivedDataEventArgs e) { //如果是自定义适配器,此处解析时,可以判断e.RequestInfo的类型 if (client is ITcpSessionClient sessionClient) { sessionClient.Logger.Info($"{sessionClient.GetIPPort()}收到数据,服务器端口:{sessionClient.ServicePort},数据:{e.ByteBlock}"); } await e.InvokeNext(); } } }