diff --git a/backend/Magic.Core/Magic.Core.csproj b/backend/Magic.Core/Magic.Core.csproj
index bbb1961d6638a5e2e0eaac02fcd1c994bb08ce6b..d303e0c44b34fe0a67925f822ef18e05c8161e65 100644
--- a/backend/Magic.Core/Magic.Core.csproj
+++ b/backend/Magic.Core/Magic.Core.csproj
@@ -36,15 +36,10 @@
-
-
-
-
-
diff --git a/backend/Magic.Web.Core/Controller/Tcp/TcpServiceController.cs b/backend/Magic.Web.Core/Controller/Tcp/TcpServiceController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5ae059a8cadf11d694560a8e5e2cdb968d8912b9
--- /dev/null
+++ b/backend/Magic.Web.Core/Controller/Tcp/TcpServiceController.cs
@@ -0,0 +1,53 @@
+using Furion.DynamicApiController;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TouchSocket.Sockets;
+
+namespace Magic.Web.Core
+{
+ ///
+ /// 系统菜单服务
+ ///
+ [ApiDescriptionSettings(Name = "Tcp", Order = 100, Tag = "Tcp服务器")]
+ [AllowAnonymous]
+ public class TcpServiceController : IDynamicApiController
+ {
+ private readonly ITcpService m_tcpService;
+
+ public TcpServiceController(ITcpService tcpService)
+ {
+ this.m_tcpService = tcpService;
+ }
+
+ ///
+ /// 获取所有连接到的客户端Id。
+ ///
+ ///
+ [HttpGet]
+ public IEnumerable GetClientIds()
+ {
+ return this.m_tcpService.GetIds();
+ }
+
+ ///
+ /// 发送消息到指定Id
+ ///
+ ///
+ ///
+ [HttpPost]
+ public void SendMessage(string id,[FromBody]string msg)
+ {
+ if (!this.m_tcpService.TryGetSocketClient(id,out var socketClient))
+ {
+ throw new Exception("没有找到对于Id的客户端");
+ }
+
+ socketClient.Send(msg);
+ }
+ }
+}
diff --git a/backend/Magic.Web.Core/Handlers/Tcp/TcpServicePlugin.cs b/backend/Magic.Web.Core/Handlers/Tcp/TcpServicePlugin.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b45103a9f9b05339988179e8b6cb1ba053e55f7b
--- /dev/null
+++ b/backend/Magic.Web.Core/Handlers/Tcp/TcpServicePlugin.cs
@@ -0,0 +1,42 @@
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TouchSocket.Core;
+using TouchSocket.Sockets;
+
+namespace Magic.Web.Core.Handlers.Tcp
+{
+ public partial class TcpServicePlugin : PluginBase
+ {
+ private readonly ILogger m_logger;
+
+ public TcpServicePlugin(ILogger logger)
+ {
+ this.m_logger = logger;
+ }
+
+ [GeneratorPlugin(nameof(ITcpConnectedPlugin.OnTcpConnected))]
+ public async Task OnTcpConnected(ITcpClientBase client, ConnectedEventArgs e)
+ {
+ m_logger.LogInformation("Tcp客户端已连接。信息:{0}", client.GetIPPort());
+ await e.InvokeNext();
+ }
+
+ [GeneratorPlugin(nameof(ITcpDisconnectedPlugin.OnTcpDisconnected))]
+ public async Task OnTcpDisconnected(ITcpClientBase client, DisconnectEventArgs e)
+ {
+ m_logger.LogInformation("Tcp客户端已断开。信息:{0},断开信息:{1}", client.GetIPPort(),e.Message);
+ await e.InvokeNext();
+ }
+
+ [GeneratorPlugin(nameof(ITcpReceivedPlugin.OnTcpReceived))]
+ public async Task OnTcpReceived(ITcpClientBase client, ReceivedDataEventArgs e)
+ {
+ m_logger.LogInformation("Tcp收到信息:{0}", Encoding.UTF8.GetString(e.ByteBlock.ToArray()));
+ await e.InvokeNext();
+ }
+ }
+}
diff --git a/backend/Magic.Web.Core/Magic.Web.Core.csproj b/backend/Magic.Web.Core/Magic.Web.Core.csproj
index 27ac28a854784578debcd32fce2e1395e87caf50..97fd524fb29d82e3639a2076d2d84150cccd2533 100644
--- a/backend/Magic.Web.Core/Magic.Web.Core.csproj
+++ b/backend/Magic.Web.Core/Magic.Web.Core.csproj
@@ -7,14 +7,6 @@
Magic.Web.Core
-
-
-
-
-
-
-
-
@@ -35,6 +27,11 @@
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/backend/Magic.Web.Core/Magic.Web.Core.xml b/backend/Magic.Web.Core/Magic.Web.Core.xml
index bcc5829ba8b1d4a574228678b3db5ddd30a50595..3f9b87830ae51e875d8a9d974b5edf6e076ebef8 100644
--- a/backend/Magic.Web.Core/Magic.Web.Core.xml
+++ b/backend/Magic.Web.Core/Magic.Web.Core.xml
@@ -1430,6 +1430,24 @@
+
+
+ 系统菜单服务
+
+
+
+
+ 获取所有连接到的客户端Id。
+
+
+
+
+
+ 发送消息到指定Id
+
+
+
+
重写 Handler 添加自动刷新
@@ -1452,5 +1470,127 @@
+
+
+ 源生成容器特性
+
+
+
+
+ 注册类型
+
+
+
+
+ 实例类型
+
+
+
+
+ 注册额外键
+
+
+
+
+ 自动注入为单例。
+
+
+
+
+ 自动注入为瞬时。
+
+
+
+
+ 添加单例注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+
+
+
+ 添加单例注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型
+ 实例类型
+ 注册额外键
+
+
+
+ 添加单例注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型与实例类型一致
+
+
+
+ 添加单例注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型
+ 实例类型
+
+
+
+ 添加瞬态注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+
+
+
+ 添加瞬态注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型
+ 实例类型
+ 注册额外键
+
+
+
+ 添加瞬态注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型与实例类型一致
+
+
+
+ 添加瞬态注入。
+
+ 该标签仅添加在继承的容器上时有用。
+
+
+ 注册类型
+ 实例类型
+
+
+
+ 使用源生成插件的调用。
+
+
+
+
+ 使用源生成插件的调用。
+
+ 插件名称,一般建议使用nameof()解决。
+
+
+
+ 标识将通过源生成器生成Rpc服务的调用委托。
+
+
diff --git a/backend/Magic.Web.Core/Startup.cs b/backend/Magic.Web.Core/Startup.cs
index c84ed6dbe4b5b0742e5a6145cc0b5eee69821cf9..71d977eb861044ccc92db8da1eead0d5f6bd2fd8 100644
--- a/backend/Magic.Web.Core/Startup.cs
+++ b/backend/Magic.Web.Core/Startup.cs
@@ -4,6 +4,7 @@ using Furion.SpecificationDocument;
using IGeekFan.AspNetCore.Knife4jUI;
using Magic.Core;
using Magic.Core.Job;
+using Magic.Web.Core.Handlers.Tcp;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http.Features;
@@ -15,6 +16,8 @@ using Newtonsoft.Json.Serialization;
using System;
using System.Net;
using System.Net.Http;
+using TouchSocket.Core;
+using TouchSocket.Sockets;
using Yitter.IdGenerator;
namespace Magic.Web.Core;
@@ -94,6 +97,18 @@ public class Startup : AppStartup
// 注册 Log 日志订阅者
builder.AddSubscriber();
});
+
+ #region Tcp
+ services.AddTcpService(config =>
+ {
+ //更多tcpService的config配置请看 http://rrqm_home.gitee.io/touchsocket/docs/current/tcpservice/
+ config.SetListenIPHosts(7789)
+ .ConfigurePlugins(a =>
+ {
+ a.Add();
+ });
+ });
+ #endregion
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
diff --git a/backend/Magic.Web.Entry/Magic.db b/backend/Magic.Web.Entry/Magic.db
index 0ff5024b324283e57fce0a63fa936646a505cdb5..74ae123d2538bab0fb679947143b1eed8248fc83 100644
Binary files a/backend/Magic.Web.Entry/Magic.db and b/backend/Magic.Web.Entry/Magic.db differ