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