FileClientBase.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using HslCommunication.Core;
  9. using HslCommunication.Core.Net;
  10. namespace HslCommunication.Enthernet
  11. {
  12. /// <summary>
  13. /// 文件传输客户端基类,提供上传,下载,删除的基础服务
  14. /// </summary>
  15. public abstract class FileClientBase : NetworkXBase
  16. {
  17. #region Private Member
  18. private IPEndPoint m_ipEndPoint = null;
  19. #endregion
  20. #region Public Member
  21. /// <summary>
  22. /// 服务器端的文件管理引擎终结点
  23. /// </summary>
  24. public IPEndPoint ServerIpEndPoint
  25. {
  26. get { return m_ipEndPoint; }
  27. set { m_ipEndPoint = value; }
  28. }
  29. /// <summary>
  30. /// 获取或设置连接的超时时间,默认10秒
  31. /// </summary>
  32. public int ConnectTimeOut { get; set; } = 10000;
  33. #endregion
  34. #region Private Method
  35. /// <summary>
  36. /// 发送三个文件分类到服务器端
  37. /// </summary>
  38. /// <param name="socket"></param>
  39. /// <param name="factory"></param>
  40. /// <param name="group"></param>
  41. /// <param name="id"></param>
  42. /// <returns></returns>
  43. protected OperateResult SendFactoryGroupId(
  44. Socket socket,
  45. string factory,
  46. string group,
  47. string id
  48. )
  49. {
  50. OperateResult factoryResult = SendStringAndCheckReceive( socket, 1, factory );
  51. if (!factoryResult.IsSuccess)
  52. {
  53. return factoryResult;
  54. }
  55. OperateResult groupResult = SendStringAndCheckReceive( socket, 2, group );
  56. if (!groupResult.IsSuccess)
  57. {
  58. return groupResult;
  59. }
  60. OperateResult idResult = SendStringAndCheckReceive( socket, 3, id );
  61. if (!idResult.IsSuccess)
  62. {
  63. return idResult;
  64. }
  65. return OperateResult.CreateSuccessResult( ); ;
  66. }
  67. #endregion
  68. #region Delete File
  69. /// <summary>
  70. /// 删除服务器上的文件
  71. /// </summary>
  72. /// <param name="fileName">文件的名称</param>
  73. /// <param name="factory"></param>
  74. /// <param name="group"></param>
  75. /// <param name="id"></param>
  76. /// <returns></returns>
  77. protected OperateResult DeleteFileBase( string fileName, string factory, string group, string id )
  78. {
  79. // connect server
  80. OperateResult<Socket> socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
  81. if (!socketResult.IsSuccess) return socketResult;
  82. // 发送操作指令
  83. OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDelete, fileName );
  84. if (!sendString.IsSuccess) return sendString;
  85. // 发送文件名以及三级分类信息
  86. OperateResult sendFileInfo = SendFactoryGroupId( socketResult.Content, factory, group, id );
  87. if (!sendFileInfo.IsSuccess) return sendFileInfo;
  88. // 接收服务器操作结果
  89. OperateResult<int, string> receiveBack = ReceiveStringContentFromSocket( socketResult.Content );
  90. if (!receiveBack.IsSuccess) return receiveBack;
  91. OperateResult result = new OperateResult( );
  92. if (receiveBack.Content1 == 1)
  93. {
  94. result.IsSuccess = true;
  95. }
  96. else
  97. {
  98. result.Message = receiveBack.Message;
  99. }
  100. socketResult.Content?.Close( );
  101. return result;
  102. }
  103. #endregion
  104. #region Download File
  105. /// <summary>
  106. /// 基础下载信息
  107. /// </summary>
  108. /// <param name="factory"></param>
  109. /// <param name="group"></param>
  110. /// <param name="id"></param>
  111. /// <param name="fileName">服务器的文件名称</param>
  112. /// <param name="processReport">下载的进度报告</param>
  113. /// <param name="source">数据源信息,决定最终存储到哪里去</param>
  114. /// <returns></returns>
  115. protected OperateResult DownloadFileBase(
  116. string factory,
  117. string group,
  118. string id,
  119. string fileName,
  120. Action<long, long> processReport,
  121. object source
  122. )
  123. {
  124. // connect server
  125. OperateResult<Socket> socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
  126. if (!socketResult.IsSuccess) return socketResult;
  127. // 发送操作指令
  128. OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDownload, fileName );
  129. if (!sendString.IsSuccess) return sendString;
  130. // 发送三级分类
  131. OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id );
  132. if (!sendClass.IsSuccess) return sendClass;
  133. // 根据数据源分析
  134. if (source is string)
  135. {
  136. string fileSaveName = source as string;
  137. OperateResult result = ReceiveFileFromSocket( socketResult.Content, fileSaveName, processReport );
  138. if (!result.IsSuccess) return result;
  139. }
  140. else if (source is Stream)
  141. {
  142. Stream stream = source as Stream;
  143. OperateResult result = ReceiveFileFromSocket( socketResult.Content, stream, processReport );
  144. if (!result.IsSuccess)
  145. {
  146. return result;
  147. }
  148. }
  149. else
  150. {
  151. socketResult.Content?.Close( );
  152. LogNet?.WriteError( ToString(), "Not supported data type!" );
  153. return new OperateResult( ) {
  154. Message = "不支持的数据类型"
  155. };
  156. }
  157. socketResult.Content?.Close( );
  158. return OperateResult.CreateSuccessResult( );
  159. }
  160. #endregion
  161. #region Upload File
  162. /// <summary>
  163. /// 上传文件给服务器
  164. /// </summary>
  165. /// <param name="source">数据源,可以是文件名,也可以是数据流</param>
  166. /// <param name="serverName">在服务器保存的文件名,不包含驱动器路径</param>
  167. /// <param name="factory"></param>
  168. /// <param name="group"></param>
  169. /// <param name="id"></param>
  170. /// <param name="fileTag">文件的描述</param>
  171. /// <param name="fileUpload">文件的上传人</param>
  172. /// <param name="processReport">汇报进度</param>
  173. /// <returns></returns>
  174. protected OperateResult UploadFileBase(
  175. object source,
  176. string serverName,
  177. string factory,
  178. string group,
  179. string id,
  180. string fileTag,
  181. string fileUpload,
  182. Action<long, long> processReport )
  183. {
  184. // HslReadWriteLock readWriteLock = new HslReadWriteLock( );
  185. // 创建套接字并连接服务器
  186. OperateResult<Socket> socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
  187. if (!socketResult.IsSuccess) return socketResult;
  188. // 上传操作暗号的文件名
  189. OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileUpload, serverName );
  190. if (!sendString.IsSuccess) return sendString;
  191. // 发送三级分类
  192. OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id );
  193. if (!sendClass.IsSuccess) return sendClass;
  194. // 判断数据源格式
  195. if (source is string)
  196. {
  197. string fileName = source as string;
  198. OperateResult result = SendFileAndCheckReceive( socketResult.Content, fileName, serverName, fileTag, fileUpload, processReport );
  199. if(!result.IsSuccess)
  200. {
  201. return result;
  202. }
  203. }
  204. else if (source is Stream)
  205. {
  206. Stream stream = source as Stream;
  207. OperateResult result = SendFileAndCheckReceive( socketResult.Content, stream, serverName, fileTag, fileUpload, processReport );
  208. if (!result.IsSuccess)
  209. {
  210. return result;
  211. }
  212. }
  213. else
  214. {
  215. socketResult.Content?.Close( );
  216. LogNet?.WriteError( ToString( ), "数据源格式不正确!" );
  217. return new OperateResult( )
  218. {
  219. Message = "数据源格式不正确!",
  220. };
  221. }
  222. // 确认服务器文件保存状态
  223. OperateResult<int, string> resultCheck = ReceiveStringContentFromSocket( socketResult.Content );
  224. if (!resultCheck.IsSuccess) return resultCheck;
  225. if (resultCheck.Content1 == 1)
  226. {
  227. return OperateResult.CreateSuccessResult( );
  228. }
  229. else
  230. {
  231. return new OperateResult( )
  232. {
  233. Message = "服务器确认文件失败,请重新上传!",
  234. };
  235. }
  236. }
  237. #endregion
  238. #region Object Override
  239. /// <summary>
  240. /// 获取本对象的字符串表示形式
  241. /// </summary>
  242. /// <returns></returns>
  243. public override string ToString()
  244. {
  245. return "FileClientBase";
  246. }
  247. #endregion
  248. }
  249. }