VS_FileSendTool/FS/FileSend/Net/Client.cs

225 lines
7.8 KiB
C#
Raw Normal View History

using FileSend;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Dmtp;
using TouchSocket.Dmtp.FileTransfer;
using TouchSocket.Dmtp.Rpc;
using TouchSocket.Rpc;
using TouchSocket.Sockets;
namespace Net;
public class Client
{
private TcpDmtpClient _client;
private float _progress;
private long _speed;
public Client(IPHost point)
{
this._client = new TcpDmtpClient();
var config = new TouchSocketConfig()
.SetRemoteIPHost(point)
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
}).ConfigurePlugins(a =>
{
a.UseDmtpRpc();
a.UseDmtpFileTransfer();
a.Add<ServerPlugin>();
}).ConfigureContainer(a =>
{
a.AddConsoleLogger();
// a.AddLogger(new TouchLogger());
}
);
this._client.Setup(config);
try
{
this._client.Connect();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
NetHelper.IsConnected = true;
}
public async Task<bool> SendFileAsync(string filePath, Action<string> callback)
{
var name = new FileInfo(filePath).Name;
var savePath = filePath.Replace(":\\", "\\");
savePath = savePath.Replace(name, "") + "??" + name;
var fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = savePath, //服务器保存路径
ResourcePath = filePath, //客户端本地即将上传文件的资源路径
Timeout = TimeSpan.FromSeconds(60), //传输超时时长
TryCount = 10, //当遇到失败时,尝试次数
FileSectionSize = 1024 * 512 //分包大小,当网络较差时,应该适当减小该值
};
fileOperator.MaxSpeed = long.MaxValue;
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
var loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
// selectedFileInfo.Speed = fileOperator.Speed();
// selectedFileInfo.Progress = fileOperator.Progress;
_progress = fileOperator.Progress;
var speed = fileOperator.Speed() / 1024 / 1024;
_speed = speed;
var msg = $"进度:{fileOperator.Progress}%,速度:{speed}Mb/s";
_client.Logger.Info(msg);
callback(msg);
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PushFileAsync
IResult result = await this._client.GetDmtpFileTransferActor().PushFileAsync(fileOperator);
if (!result.IsSuccess())
{
this._client.Logger.Info(result.Message);
MessageBox.Show(result.Message);
return false;
}
return true;
}
public IResult SendFile(string filePath, Action<string> callback)
{
FileInfo fileInfo = new FileInfo(filePath);
// {NetHelper.ServerRootPath}\\{fileInfo.Name}
var fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = filePath.Replace(":\\", "\\"), //服务器保存路径
ResourcePath = filePath, //客户端本地即将上传文件的资源路径
Timeout = TimeSpan.FromSeconds(60), //传输超时时长
TryCount = 10, //当遇到失败时,尝试次数
FileSectionSize = 1024 * 512 //分包大小,当网络较差时,应该适当减小该值
};
//fileOperator.MaxSpeed = 1024 * 1024 * 1024; //设置最大限速为1Gb。
fileOperator.MaxSpeed = long.MaxValue;
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
var loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
// selectedFileInfo.Speed = fileOperator.Speed();
// selectedFileInfo.Progress = fileOperator.Progress;
_progress = fileOperator.Progress;
var speed = fileOperator.Speed() / 1024 / 1024;
_speed = speed;
var msg = $"进度:{fileOperator.Progress}%,速度:{speed}Mb/s";
_client.Logger.Info(msg);
callback(msg);
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PushFileAsync
IResult result = this._client.GetDmtpFileTransferActor().PushFile(fileOperator);
if (
!result.IsSuccess)
{
_client.Logger.Error(result.Message);
MessageBox.Show(result.Message);
return null;
}
_client.Logger.Info($"{fileInfo.Name} 上传{result.IsSuccess} {result.Message}");
return result;
}
public float GetSendProgress()
{
return _progress;
}
public long GetSendSpeed()
{
return this._speed;
}
public async Task<ServerFileInfo[]?> GetAllFiles()
{
var results = await this._client.GetDmtpRpcActor()
.InvokeTAsync<byte[]?>("GetFiles", InvokeOption.WaitInvoke, null);
var serverFileInfos = JsonSerializer.Deserialize<ServerFileInfo[]?>(results);
return serverFileInfos;
}
public async Task<bool> DownloadFileAsync(SelectedFileInfo selectedFileInfo)
{
var filePath = new FileInfo(selectedFileInfo.FilePath).Name;
string savePath = NetHelper.ClientSaveRootPath;
if (!Directory.Exists(savePath))
Directory.CreateDirectory(savePath);
var saveFilePath = Path.Combine(savePath, filePath);
var fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = saveFilePath, //客户端本地保存路径
ResourcePath = filePath, //请求文件的资源路径
Timeout = TimeSpan.FromSeconds(60), //传输超时时长
TryCount = 10, //当遇到失败时,尝试次数
FileSectionSize = 1024 * 512 //分包大小,当网络较差时,应该适当减小该值
};
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
var loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
_progress = fileOperator.Progress;
var speed = fileOperator.Speed();
_speed = speed;
this._client.Logger.Info($"进度:{fileOperator.Progress},速度:{speed}");
selectedFileInfo.Speed = speed;
selectedFileInfo.Progress = fileOperator.Progress;
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PullFileAsync
IResult result = await this._client.GetDmtpFileTransferActor().PullFileAsync(fileOperator);
if (!result.IsSuccess())
{
this._client.Logger.Info(result.Message);
return false;
}
return true;
}
}
public class SelectedFileInfo
{
public string FilePath;
public long Speed;
public float Progress;
}