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(); //注册服务 }); }) .ConfigurePlugins(a => { //a.UseDmtpHeartbeat(); a.UseDmtpFileTransfer()//必须添加文件传输插件 .SetRootPath(rootPath)//设置RootPath //.SetRootPath("C:\\新建文件夹")//设置RootPath .SetMaxSmallFileLength(1024 * 1024);//设置小文件的最大限制长度 a.Add(); a.Add(); }) .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(); } /// /// 服务器向客户端请求文件 /// /// 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); } /// /// 服务器向客户端推送文件 /// /// /// 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); } } }