using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using HslCommunication.Core; using HslCommunication.Core.Net; namespace HslCommunication.Enthernet { /// /// 文件传输客户端基类,提供上传,下载,删除的基础服务 /// public abstract class FileClientBase : NetworkXBase { #region Private Member private IPEndPoint m_ipEndPoint = null; #endregion #region Public Member /// /// 服务器端的文件管理引擎终结点 /// public IPEndPoint ServerIpEndPoint { get { return m_ipEndPoint; } set { m_ipEndPoint = value; } } /// /// 获取或设置连接的超时时间,默认10秒 /// public int ConnectTimeOut { get; set; } = 10000; #endregion #region Private Method /// /// 发送三个文件分类到服务器端 /// /// 套接字对象 /// 一级分类 /// 二级分类 /// 三级分类 /// 是否成功的结果对象 protected OperateResult SendFactoryGroupId( Socket socket, string factory, string group, string id ) { OperateResult factoryResult = SendStringAndCheckReceive( socket, 1, factory ); if (!factoryResult.IsSuccess) { return factoryResult; } OperateResult groupResult = SendStringAndCheckReceive( socket, 2, group ); if (!groupResult.IsSuccess) { return groupResult; } OperateResult idResult = SendStringAndCheckReceive( socket, 3, id ); if (!idResult.IsSuccess) { return idResult; } return OperateResult.CreateSuccessResult( ); ; } #endregion #region Delete File /// /// 删除服务器上的文件 /// /// 文件的名称 /// 一级分类 /// 二级分类 /// 三级分类 /// 是否成功的结果对象 protected OperateResult DeleteFileBase( string fileName, string factory, string group, string id ) { // connect server OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut ); if (!socketResult.IsSuccess) return socketResult; // 发送操作指令 OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDelete, fileName ); if (!sendString.IsSuccess) return sendString; // 发送文件名以及三级分类信息 OperateResult sendFileInfo = SendFactoryGroupId( socketResult.Content, factory, group, id ); if (!sendFileInfo.IsSuccess) return sendFileInfo; // 接收服务器操作结果 OperateResult receiveBack = ReceiveStringContentFromSocket( socketResult.Content ); if (!receiveBack.IsSuccess) return receiveBack; OperateResult result = new OperateResult( ); if (receiveBack.Content1 == 1) result.IsSuccess = true; result.Message = receiveBack.Message; socketResult.Content?.Close( ); return result; } #endregion #region Download File /// /// 基础下载信息 /// /// 一级分类 /// 二级分类 /// 三级分类 /// 服务器的文件名称 /// 下载的进度报告 /// 数据源信息,决定最终存储到哪里去 /// 是否成功的结果对象 protected OperateResult DownloadFileBase( string factory, string group, string id, string fileName, Action processReport, object source ) { // connect server OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut ); if (!socketResult.IsSuccess) return socketResult; // 发送操作指令 OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDownload, fileName ); if (!sendString.IsSuccess) return sendString; // 发送三级分类 OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id ); if (!sendClass.IsSuccess) return sendClass; // 根据数据源分析 if (source is string fileSaveName) { OperateResult result = ReceiveFileFromSocket( socketResult.Content, fileSaveName, processReport ); if (!result.IsSuccess) return result; } else if (source is Stream stream) { OperateResult result = ReceiveFileFromSocket( socketResult.Content, stream, processReport ); if (!result.IsSuccess) { return result; } } else { socketResult.Content?.Close( ); LogNet?.WriteError( ToString(), StringResources.Language.NotSupportedDataType ); return new OperateResult( StringResources.Language.NotSupportedDataType ); } socketResult.Content?.Close( ); return OperateResult.CreateSuccessResult( ); } #endregion #region Upload File /// /// 上传文件给服务器 /// /// 数据源,可以是文件名,也可以是数据流 /// 在服务器保存的文件名,不包含驱动器路径 /// 一级分类 /// 二级分类 /// 三级分类 /// 文件的描述 /// 文件的上传人 /// 汇报进度 /// 是否成功的结果对象 protected OperateResult UploadFileBase( object source, string serverName, string factory, string group, string id, string fileTag, string fileUpload, Action processReport ) { // HslReadWriteLock readWriteLock = new HslReadWriteLock( ); // 创建套接字并连接服务器 OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut ); if (!socketResult.IsSuccess) return socketResult; // 上传操作暗号的文件名 OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileUpload, serverName ); if (!sendString.IsSuccess) return sendString; // 发送三级分类 OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id ); if (!sendClass.IsSuccess) return sendClass; // 判断数据源格式 if (source is string fileName) { OperateResult result = SendFileAndCheckReceive( socketResult.Content, fileName, serverName, fileTag, fileUpload, processReport ); if(!result.IsSuccess) { return result; } } else if (source is Stream stream) { OperateResult result = SendFileAndCheckReceive( socketResult.Content, stream, serverName, fileTag, fileUpload, processReport ); if (!result.IsSuccess) { return result; } } else { socketResult.Content?.Close( ); LogNet?.WriteError( ToString( ), StringResources.Language.DataSourseFormatError ); return new OperateResult( StringResources.Language.DataSourseFormatError ); } // 确认服务器文件保存状态 OperateResult resultCheck = ReceiveStringContentFromSocket( socketResult.Content ); if (!resultCheck.IsSuccess) return resultCheck; if (resultCheck.Content1 == 1) { return OperateResult.CreateSuccessResult( ); } else { return new OperateResult( StringResources.Language.ServerFileCheckFailed ); } } #endregion #region Object Override /// /// 获取本对象的字符串表示形式 /// /// 字符串信息 public override string ToString() { return "FileClientBase"; } #endregion } }