Files
ForwardingServerUI/Class/AsyncTcpServer.cs
T

218 lines
9.9 KiB
C#
Raw Normal View History

2026-07-10 17:17:49 +08:00
using System;
using System.Collections.Generic;
using System.Data;
using System.Security.Cryptography.Pkcs;
using System.Text;
using System.Text.Json;
using System.Threading.Channels;
2026-07-10 17:17:49 +08:00
using System.Windows;
using System.Windows.Markup;
using System.Xml.Linq;
using TouchSocket.Core;
using TouchSocket.Sockets;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ForwardingServerUI.Class
{
public class AsyncTcpServer
{
public class Personm
{
public required string SERVEREnterprise { get; set; }
public required string SERVERMachineName { get; set; }
public required string SERVERNAME { get; set; }
public required string SERVERUSER { get; set; }
public required string SERRVERPASWORD { get; set; }
public required string MachineVer { get; set; }
}
2026-08-03 21:52:37 +08:00
private static Timer? _timer;
2026-07-10 17:17:49 +08:00
public static TcpService service = new TcpService();
2026-08-03 21:52:37 +08:00
2026-07-10 17:17:49 +08:00
public static async Task TcpMain()
{
service.Connecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => { return EasyTask.CompletedTask;};//有客户端成功连接
service.Closing = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在断开连接,只有当主动断开时才有效。
2026-08-05 11:29:05 +08:00
service.Closed = (client, e) =>
{
2026-07-10 17:17:49 +08:00
//离线记录
Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] NOT ID " +
client.Id + " IP " + client.IP);
2026-08-05 11:29:05 +08:00
Application.Current.Dispatcher.Invoke(() =>
{
DataRow row = MainWindowViewModel._machineTable.Select("ID='" + client.Id + "'").First();
2026-07-10 17:17:49 +08:00
Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] BREAK LINK ID = " +
row["ID"] + " IP = " + row["IP"] + " Enterprise = " + row["Enterprise"] +
" MachineName = " + row["MachineName"]);
2026-08-05 11:29:05 +08:00
MainWindowViewModel._machineTable.Rows.Remove(row);
});
2026-08-05 11:29:05 +08:00
return EasyTask.CompletedTask;
2026-07-10 17:17:49 +08:00
};//有客户端断开连接
service.Received = (client, e) =>{
string DAT = e.Memory.Span.ToString(Encoding.UTF8);
try
{
if (DAT.Length > 5)
{
DataRow[] r_ = MainWindowViewModel._machineTable.Select("ID='" + client.Id + "'");
if (r_.Length > 0)
{
int? s_ = r_.First().Field<int?>("Start");
if (s_ == 30)
{
2026-08-03 15:42:10 +08:00
string trimmedDat = DAT.Trim();
if (!string.IsNullOrEmpty(trimmedDat) &&
(trimmedDat[0] == '{' || trimmedDat[0] == '['))
2026-07-10 17:17:49 +08:00
{
2026-08-03 15:42:10 +08:00
MainWindowViewModel.Person deserializedPerson = JsonSerializer.Deserialize<MainWindowViewModel.Person>(trimmedDat)!;
2026-08-03 15:50:49 +08:00
2026-07-10 17:17:49 +08:00
//转发逻辑
var dr = MainWindowViewModel._userTable.Select("Terminal='" + deserializedPerson.Terminal + "'");
if (dr.Length > 0)
{
DataRow drEmployee = dr.First();
drEmployee.BeginEdit();
2026-08-03 15:42:10 +08:00
drEmployee["RDAT"] = trimmedDat;
2026-07-10 17:17:49 +08:00
drEmployee.EndEdit();
drEmployee.AcceptChanges();
}
}
}
2026-08-03 15:50:49 +08:00
else if (s_ == 90)
{ }
Application.Current.Dispatcher.Invoke(() =>
{
DataRow drEmployee = r_.First();
drEmployee.BeginEdit();
2026-08-05 10:17:43 +08:00
drEmployee["HeartbeatTime"] = DateTime.Now.ToString();
2026-08-03 15:50:49 +08:00
drEmployee.EndEdit();
drEmployee.AcceptChanges();
});
2026-07-10 17:17:49 +08:00
}
else
{
Personm deserializedPerson = JsonSerializer.Deserialize<Personm>(DAT)!;
2026-08-03 15:50:49 +08:00
Application.Current.Dispatcher.Invoke(() =>
{
var mach = MainWindowViewModel._machineTable.Select("Enterprise='" + deserializedPerson.SERVEREnterprise +
"'and MachineName='" + deserializedPerson.SERVERMachineName + "'");
2026-07-10 17:17:49 +08:00
if (mach.Length > 0)
2026-08-03 15:50:49 +08:00
{
//刷新设备信息表
2026-07-10 17:17:49 +08:00
DataRow dataRow = mach.First();
dataRow.BeginEdit();
dataRow["ID"] = client.Id;
dataRow["IP"] = client.IP;
dataRow["Start"] = 30;
dataRow["Enterprise"] = "/" + deserializedPerson.SERVEREnterprise;
dataRow["MachineName"] = deserializedPerson.SERVERMachineName;
dataRow["MachineVer"] = deserializedPerson.MachineVer;
dataRow.EndEdit();
dataRow.AcceptChanges();
}
else
2026-08-03 15:50:49 +08:00
{
//添加设备信息表
MainWindowViewModel._machineTable.Rows.Add(client.Id, client.IP, 30, "/" + deserializedPerson.SERVEREnterprise,
2026-08-05 10:17:43 +08:00
deserializedPerson.SERVERMachineName, DateTime.Now.ToString(), deserializedPerson.MachineVer);
2026-07-10 17:17:49 +08:00
}
});
Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " LINK ID " + client.Id + " IP " + client.IP + "]\nDATA =" + DAT);
2026-08-03 15:50:49 +08:00
2026-07-10 17:17:49 +08:00
}
}
}
catch (Exception ex)
{//错误
Console.WriteLine("Tcp:" + ex.ToString());
LogGing.ERRDATA(ex);
}
return EasyTask.CompletedTask;
};
await service.SetupAsync(new TouchSocketConfig()//载入配置
// .SetMaxBufferSize(1024 * 1024 * 100)
//.SetMinBufferSize(1024 * 1024)
.SetSingleStreamDataHandlingAdapter(() => new PeriodPackageAdapter())//以超时周期和包
.SetListenIPHosts(new IPHost[] { new IPHost(7794), new IPHost(7795) })//同时监听两个地址
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
})
.ConfigurePlugins(a =>
{
})
);
await service.StartAsync();//启动
Console.WriteLine("TcpServer:Run");
2026-08-03 15:50:49 +08:00
2026-08-03 21:52:37 +08:00
//启动检查循环定时器
2026-08-05 11:29:05 +08:00
_timer = new Timer(TimerCallback, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30));
2026-08-03 15:50:49 +08:00
}
2026-08-03 21:52:37 +08:00
2026-08-03 15:50:49 +08:00
private static async void TimerCallback(object? state)
{
try
{
DataRow[] row = MainWindowViewModel._machineTable.Select("HeartbeatTime<'" + DateTime.Now.AddSeconds(-30).ToString() + "'");
2026-08-05 11:29:05 +08:00
Application.Current.Dispatcher.Invoke(() =>
2026-08-03 15:50:49 +08:00
{
foreach (var dataRow in row)
2026-08-03 15:50:49 +08:00
{
if ((int)dataRow["Start"] == 30)
2026-08-03 15:50:49 +08:00
{
dataRow.BeginEdit();
dataRow["Start"] = 999;
dataRow.EndEdit();
2026-08-05 11:29:05 +08:00
dataRow.AcceptChanges();
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] NOT LINK ID = {dataRow["ID"]} " +
$"IP = {dataRow["IP"]} Enterprise = {dataRow["Enterprise"]} " +
$"MachineName = {dataRow["MachineName"]}");
}
2026-08-05 11:29:05 +08:00
}
});
2026-08-05 11:29:05 +08:00
DataRow[] rowout = MainWindowViewModel._machineTable.Select("HeartbeatTime<'" + DateTime.Now.AddSeconds(-120).ToString() + "'");
Application.Current.Dispatcher.Invoke(() =>
{
foreach (var dataRow in rowout)
2026-08-03 15:50:49 +08:00
{
dataRow.BeginEdit();
dataRow["Start"] = 999;
dataRow.EndEdit();
dataRow.AcceptChanges();
2026-08-03 15:50:49 +08:00
foreach (var item in service.Clients)
{
if (item.Id == dataRow["ID"].ToString())
{
item.CloseAsync(); // 关闭完成
item.Dispose(); // 释放资源
break;
2026-08-03 15:50:49 +08:00
}
}
}
});
2026-08-03 15:50:49 +08:00
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
LogGing.ERRDATA(ex);
}
}
2026-07-10 17:17:49 +08:00
}
}