From 7971d3d1377dc85a30a5430cb0bf76a8d059d13a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <505554090@qq.com>
Date: Tue, 12 Dec 2023 21:56:04 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0TcpService=E6=8E=A5=E6=94=B6?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/Magic.Core/Magic.Core.csproj | 5 -
.../Controller/Tcp/TcpServiceController.cs | 53 +++++++
.../Handlers/Tcp/TcpServicePlugin.cs | 42 ++++++
backend/Magic.Web.Core/Magic.Web.Core.csproj | 13 +-
backend/Magic.Web.Core/Magic.Web.Core.xml | 140 ++++++++++++++++++
backend/Magic.Web.Core/Startup.cs | 15 ++
backend/Magic.Web.Entry/Magic.db | Bin 4718592 -> 4718592 bytes
7 files changed, 255 insertions(+), 13 deletions(-)
create mode 100644 backend/Magic.Web.Core/Controller/Tcp/TcpServiceController.cs
create mode 100644 backend/Magic.Web.Core/Handlers/Tcp/TcpServicePlugin.cs
diff --git a/backend/Magic.Core/Magic.Core.csproj b/backend/Magic.Core/Magic.Core.csproj
index bbb1961..d303e0c 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 0000000..5ae059a
--- /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 0000000..b45103a
--- /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 27ac28a..97fd524 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 bcc5829..3f9b878 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 c84ed6d..71d977e 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
GIT binary patch
delta 974
zcma*mZ%7ki90%~*xtreH+{!e~f9I*`%-wdU?q6x@)JU8L6MSRX+OFer+l}2YO3D?H
ziX`@?K@?=Kf+#biBVUAXdm{)zFY8545TrNty1uKxf}~!2j)&(S?)QAZaOw0zG7XCr
z=1GFkr-20HohG+#a^>8@x9S~>F0YnUFRSBGMH*KUy
zrCp$OA87-2pU%rOgBBf-kOz98zySGB05lk(5KLf(BCvoJ4!}VuhC@&SrEnO^pd5}s
z1yn*6R6`9gPzx;7K|M6UQEkxD_;T?slSfhX5J3;+uHH*e-{$5o79mj390=Gl>ad>(
zgd{o4jf&?vzmgQWk#Hg?CMV^v=vU&Yq!Nva$?S`z?ESgy+?%c0=UdCKKdmjCj%?q%
zx%KQ(c2?Vdviz_2dn01G84SaOQq11wzH_;t7>@)*RSijEQ!tg3;}RoBT9{wUm@3&A
zInMO@#{5b|98QSwekD0E7Rx2F$Hi1;eW0hg`frK2u0LAgP&_bb5@IVo*;050GL=*+@h3|lqEGC%1Vq7}OW-!LEI5@gE7>V5s
zt4k**7hQF6(OLh*;rE8Oy=PfBl7)IKP!$BX1quF(R9dXwADsUhAG+vDNR^XH@u*xX
zmXD*?vLFbCULd8rD^1MW2~#p;`%o6&)keG&Q)&fWgajAdkkRfv@Ir+TerO0F2pu7W
z(Sc5Mp&JqOpchf}A%=boz`!8lNMH!V7{MsU?1G+b)@`%py43%(VVctGSu6S2O1bk9
zRdIyiPvBE~^S}6>)hF+R=T>pr^O{P{QN}TWNlalHGnj>mIm}}Li&(-k(pW(Tt5`!8
i>)1ffc9eWZmBSo*TGK*#Y+?)B*ugILY%R3^{q+Y@Du8