change-socket版本2.0

dev
liuwf 11 months ago
parent 355e686a9f
commit 403132f49e

@ -1,6 +1,5 @@
using Admin.Core.Common; using Admin.Core.Common;
using Admin.Core.Socket; using Admin.Core.Socket;
using Admin.Core.Socket.TSocket;
using log4net; using log4net;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using System; using System;

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="log4net" Version="2.0.12" /> <PackageReference Include="log4net" Version="2.0.12" />
<PackageReference Include="System.Speech" Version="7.0.0" /> <PackageReference Include="System.Speech" Version="7.0.0" />
<PackageReference Include="TouchSocket" Version="2.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -20,10 +21,4 @@
<Folder Include="Model\" /> <Folder Include="Model\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="TouchSocket">
<HintPath>..\dll\TouchSocket.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TouchSocket.Http;
using TouchSocket.Sockets; using TouchSocket.Sockets;
namespace Admin.Core.Socket namespace Admin.Core.Socket

@ -1,117 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Http;
namespace Admin.Core.Socket.Plugins
{
/// <summary>
/// 支持GET、Post、PutDelete或者其他
/// </summary>
internal class MyHttpPlug : HttpPluginBase<HttpSocketClient>
{
protected override void OnGet(HttpSocketClient client, HttpContextEventArgs e)
{
if (e.Context.Request.UrlEquals("/success"))
{
//直接响应文字
e.Context.Response.FromText("Success").Answer();//直接回应
Console.WriteLine("处理完毕");
e.Handled = true;
}
else if (e.Context.Request.UrlEquals("/file"))
{
//直接回应文件。
e.Context.Response
.SetStatus()//必须要有状态
.FromFile(@"D:\System\Windows.iso", e.Context.Request);
}
else if (e.Context.Request.UrlEquals("/html"))
{
//回应html
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("<!DOCTYPE html>");
stringBuilder.AppendLine("<html>");
stringBuilder.AppendLine("<head>");
stringBuilder.AppendLine("<meta charset=\"utf-8\"/>");
stringBuilder.AppendLine("<title>TouchSocket</title>");
stringBuilder.AppendLine("</head>");
stringBuilder.AppendLine("<body>");
stringBuilder.AppendLine("<div id=\"kuang\" style=\"width: 50%;height: 85%;left: 25%;top:15%;position: absolute;\">");
stringBuilder.AppendLine("<a id=\"MM\" style=\"font-size: 30px;font-family: 微软雅黑;width: 100%;\">王二麻子</a>");
stringBuilder.AppendLine("<input type=\"text\" id=\"NN\" value=\"\" style=\"font-size: 30px;width:100%;position: relative;top: 30px;\"/>");
stringBuilder.AppendLine("<input type=\"button\" id=\"XX\" value=\"我好\" style=\"font-size: 30px;width: 100%;position: relative;top: 60px;\" onclick=\"javascript;\"/>");
stringBuilder.AppendLine("</div>");
stringBuilder.AppendLine("</body>");
stringBuilder.AppendLine("</html>");
e.Context.Response
.SetStatus()//必须要有状态
.SetContentTypeByExtension(".html")
.SetContent(stringBuilder.ToString());
e.Context.Response.Answer();
}
base.OnGet(client, e);
}
protected override void OnPost(HttpSocketClient client, HttpContextEventArgs e)
{
if (e.Context.Request.UrlEquals("/uploadfile"))
{
try
{
if (e.Context.Request.TryGetContent(out byte[] bodys))//一次性获取请求体
{
return;
}
while (true)//当数据太大时,可持续读取
{
byte[] buffer = new byte[1024 * 64];
int r = e.Context.Request.Read(buffer, 0, buffer.Length);
if (r == 0)
{
return;
}
//这里可以一直处理读到的数据。
}
//下面逻辑是接收小文件。
if (e.Context.Request.ContentLen > 1024 * 1024 * 100)//全部数据体超过100Mb则直接拒绝接收。
{
e.Context.Response
.SetStatus("403", "数据过大")
.Answer();
return;
}
//此操作会先接收全部数据,然后再分割数据。
//所以上传文件不宜过大,不然会内存溢出。
var multifileCollection = e.Context.Request.GetMultifileCollection();
foreach (var item in multifileCollection)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append($"文件名={item.FileName}\t");
stringBuilder.Append($"数据长度={item.Length}");
client.Logger.Info(stringBuilder.ToString());
}
e.Context.Response
.SetStatus()
.FromText("Ok")
.Answer();
}
catch (Exception ex)
{
client.Logger.Exception(ex);
}
}
base.OnPost(client, e);
}
}
}

@ -1,28 +0,0 @@
using Admin.Core.Socket.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Sockets;
namespace Admin.Core.Socket.TSocket
{
internal class MyFixedHeaderCustomDataHandlingAdapter : CustomFixedHeaderDataHandlingAdapter<MyFixedHeaderRequestInfo>
{
public override int HeaderLength => 10;
protected override MyFixedHeaderRequestInfo GetInstance()
{
try
{
return new MyFixedHeaderRequestInfo();
}
catch (Exception ex)
{
return new MyFixedHeaderRequestInfo();
}
}
}
}

@ -1,44 +0,0 @@
using Admin.Core.Common;
using log4net;
using NPOI.POIFS.Storage;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Tsp;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace Admin.Core.Socket.TSocket
{
public class MyFixedHeaderRequestInfo : IFixedHeaderRequestInfo
{
private static readonly log4net.ILog LogInfo = LogManager.GetLogger(typeof(MyFixedHeaderRequestInfo));
private int m_bodyLength;
private byte[] m_length = new byte[2];
private byte[] body;
bool flag = true;
public int BodyLength { get => m_bodyLength; }
/// <summary>
/// 自定义属性,标识实际数据
/// </summary>
public byte[] Body { get => body; set => body = value; }
public bool OnParsingBody(byte[] body)
{
return true;
}
public bool OnParsingHeader(byte[] header)
{
return true;
}
}
}

@ -1,5 +1,5 @@
using Admin.Core.Common; using Admin.Core.Common;
using Admin.Core.Socket.TSocket;
using log4net; using log4net;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
@ -50,17 +50,22 @@ namespace Admin.Core.Socket
MessageModel<string> messageModel = new MessageModel<string>(); MessageModel<string> messageModel = new MessageModel<string>();
service = new TcpService(); service = new TcpService();
service.Connecting = (client, e) => { client.Logger.Info($"{client.IP}:{client.Port} 客户端正在连接..."); };//有客户端正在连接 service.Connecting = (client, e) => { client.Logger.Info($"{client.IP}:{client.Port} 客户端正在连接...");
service.Connected = (client, e) => { client.Logger.Info($"{client.IP}:{client.Port} 客户端连接成功!目前客户端连接数{service.Count}"); };//有客户端成功连接 return EasyTask.CompletedTask;
};//有客户端正在连接
service.Connected = (client, e) => { client.Logger.Info($"{client.IP}:{client.Port} 客户端连接成功!目前客户端连接数{service.Count}");
return EasyTask.CompletedTask;
};//有客户端成功连接
service.Disconnected += (client, e) => { //有客户端断开连接 service.Disconnected += (client, e) => { //有客户端断开连接
client.Logger.Info($"{client.IP}:{client.Port}客户端断开!"); client.Logger.Info($"{client.IP}:{client.Port}客户端断开!");
RefreshStateEvent?.Invoke(client.IP, false); RefreshStateEvent?.Invoke(client.IP, false);
return EasyTask.CompletedTask;
}; };
service.Received = (client, byteBlock, requestInfo) => service.Received = (client, byteBlock) =>
{ {
try try
{ {
var mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);//注意数据长度是byteBlock.Len var mes = Encoding.UTF8.GetString(byteBlock.ByteBlock.Buffer, 0, byteBlock.ByteBlock.Len);//注意数据长度是byteBlock.Len
//心跳包 //心跳包
if (mes== "heartbeat") if (mes== "heartbeat")
{ {
@ -86,12 +91,24 @@ namespace Admin.Core.Socket
{ {
client.Logger.Error($"异常:{ex.Message}"); client.Logger.Error($"异常:{ex.Message}");
} }
return EasyTask.CompletedTask;
}; };
// service.Setup(new TouchSocketConfig()//载入配置
//.SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:5000") })
//.ConfigureContainer(a =>//容器的配置顺序应该在最前面
//{
// a.AddConsoleLogger();
//})
//.ConfigurePlugins(a =>
//{
// //自定义插件
//}));
service.Setup(new TouchSocketConfig()//载入配置 service.Setup(new TouchSocketConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost(Appsettings.app("Middleware", "TouchSocket", "Address").ObjToString()) })//可同时监听两个地址 .SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:5000") })//可同时监听两个地址
.SetDataHandlingAdapter(() => { return new NormalDataHandlingAdapter(); })//配置适配器 // .SetDataHandlingAdapter(() => { return new NormalDataHandlingAdapter(); })//配置适配器
.SetMaxCount(10000) .SetMaxCount(10000)
//.SetThreadCount(1000) //.SetThreadCount(1000)
//.SetCacheTimeoutEnable(false) //.SetCacheTimeoutEnable(false)
@ -102,8 +119,8 @@ namespace Admin.Core.Socket
.ConfigurePlugins(a => .ConfigurePlugins(a =>
{ {
a.UseCheckClear(); a.UseCheckClear();
})) }));
.Start();//启动 service.Start();//启动
service.Logger.Info("服务器成功启动"); service.Logger.Info("服务器成功启动");
messageModel.success = true; messageModel.success = true;

Loading…
Cancel
Save