VS_FileSendTool/FS/FileSend/Net/Client.cs

225 lines
7.8 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 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;
}