VS_FileSendTool/FS/Server/ZServer.cs

165 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Cysharp.Threading.Tasks;
using Net;
using Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Dmtp;
using TouchSocket.Dmtp.FileTransfer;
using TouchSocket.Rpc;
using TouchSocket.Sockets;
namespace FileSend
{
internal class ZServer
{
public TcpDmtpService service;
public TouchSocketConfig config;
public const string rootPath = "E:\\zRoot\\S";
public ZServer()
{
service = new TcpDmtpService();
config = new TouchSocketConfig()//配置
.SetListenIPHosts(7789)
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
a.AddRpcStore(store =>
{
store.RegisterServer<GetFilesRpcServer>(); //注册服务
});
})
.ConfigurePlugins(a =>
{
//a.UseDmtpHeartbeat();
a.UseDmtpFileTransfer()//必须添加文件传输插件
.SetRootPath(rootPath)//设置RootPath
//.SetRootPath("C:\\新建文件夹")//设置RootPath
.SetMaxSmallFileLength(1024 * 1024);//设置小文件的最大限制长度
a.Add<MyPlugin>();
a.Add<ConnectAndMsgPlugin>();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Channel"//连接验证口令。
});
}
public async UniTask StartAsync()
{
await service.SetupAsync(config);
await service.StartAsync();
service.Logger.Info($"{service.GetType().Name}已启动");
}
public async UniTask StopAsync()
{
await service.ClearAsync();
await service.StopAsync();
service.Dispose();
}
/// <summary>
/// 服务器向客户端请求文件
/// </summary>
/// <exception cref="Exception"></exception>
public void S2C_RequestFile()
{
string targetId = "targetId";
if (!service.TryGetClient(targetId, out var SessionClient))
{
throw new Exception($"没有找到Id={targetId}的客户端");
}
var filePath = "ServicePullFileFromClient.Test";
var saveFilePath = "SaveServicePullFileFromClient.Test";
var metadata = new Metadata();//传递到客户端的元数据
metadata.Add("1", "1");
metadata.Add("2", "2");
var fileOperator = new FileOperator()//实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = saveFilePath,//服务器本地保存路径
ResourcePath = filePath,//请求客户端文件的资源路径
Metadata = metadata,//传递到客户端的元数据
Timeout = TimeSpan.FromSeconds(60),//传输超时时长
TryCount = 10,//当遇到失败时,尝试次数
FileSectionSize = 1024 * 512//分包大小,当网络较差时,应该适当减小该值
};
fileOperator.MaxSpeed = 1024 * 1024 * 20;//设置最大限速为20Mb。
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
var loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
SessionClient.Logger.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PullFileAsync
IResult result = SessionClient.GetDmtpFileTransferActor().PullFile(fileOperator);
}
/// <summary>
/// 服务器向客户端推送文件
/// </summary>
/// <param name="targetId"></param>
/// <exception cref="Exception"></exception>
public void S2C_ResposeFile(string targetId)
{
if (!service.TryGetClient(targetId, out var SessionClient))
{
throw new Exception($"没有找到Id={targetId}的客户端");
}
var filePath = "ServicePushFileFromClient.Test";
var saveFilePath = "SaveServicePushFileFromClient.Test";
var metadata = new Metadata();//传递到客户端的元数据
metadata.Add("1", "1");
metadata.Add("2", "2");
var fileOperator = new FileOperator()//实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = saveFilePath,//客户端本地保存路径
ResourcePath = filePath,//服务器文件的资源路径
Metadata = metadata,//传递到客户端的元数据
Timeout = TimeSpan.FromSeconds(60),//传输超时时长
TryCount = 10,//当遇到失败时,尝试次数
FileSectionSize = 1024 * 512//分包大小,当网络较差时,应该适当减小该值
};
fileOperator.MaxSpeed = 1024 * 1024 * 20;//设置最大限速为20Mb。
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
var loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
SessionClient.Logger.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PushFileAsync
IResult result = SessionClient.GetDmtpFileTransferActor().PushFile(fileOperator);
}
}
}