TCP_NetworkClient.cs 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.IO;
  8. using LYFZ.Network.EnumerateLibrary;
  9. using System.ComponentModel;
  10. using HPSocketCS.Extended;
  11. using System.Runtime.InteropServices;
  12. namespace LYFZ.Network.TCPNetworkClient
  13. {
  14. /// <summary>
  15. /// TCP网络通信客户端
  16. /// </summary>
  17. public class TCP_NetworkClient
  18. {
  19. public TCP_NetworkClient() {
  20. }
  21. #region 新版网络客户端程序处理代码
  22. TCP_NetworkClient tFileClient=null;
  23. /// <summary>
  24. /// 文件传送通道
  25. /// </summary>
  26. public TCP_NetworkClient TFileClient
  27. {
  28. get {
  29. if (this.tFileClient == null)
  30. {
  31. this.tFileClient = new TCP_NetworkClient();
  32. }
  33. return this.tFileClient;
  34. }
  35. }
  36. static TCP_NetworkClient mainStoreClient = null;
  37. /// <summary>
  38. /// 总店通道
  39. /// </summary>
  40. public static TCP_NetworkClient MainStoreClient
  41. {
  42. get
  43. {
  44. if (TCP_NetworkClient.mainStoreClient == null)
  45. {
  46. TCP_NetworkClient.mainStoreClient = new TCP_NetworkClient();
  47. }
  48. return TCP_NetworkClient.mainStoreClient;
  49. }
  50. }
  51. /// <summary>
  52. /// 连接总店服务器 只有在分店客户端中使用
  53. /// </summary>
  54. /// <returns></returns>
  55. public static bool ConnectionMainStoreServer()
  56. {
  57. bool ret = false;
  58. if (LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore)
  59. {
  60. if (TCP_NetworkClient.MainStoreClient.AppState != HPSocketCS.Extended.AppState.Started)
  61. {
  62. ret = TCP_NetworkClient.MainStoreClient.ConnectionServer(LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.MainStoreServerIP,
  63. Convert.ToUInt16(LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.ServerPort));
  64. }
  65. else {
  66. ret = true;
  67. }
  68. }
  69. return ret;
  70. }
  71. static bool isRemoteCloudClient = false;
  72. /// <summary>
  73. /// 是否为远程云版客户端
  74. /// </summary>
  75. public static bool IsRemoteCloudClient
  76. {
  77. get { return isRemoteCloudClient; }
  78. set { isRemoteCloudClient = value; }
  79. }
  80. private AppState appState = AppState.Stoped;
  81. /// <summary>
  82. /// 当前网络状态
  83. /// </summary>
  84. public AppState AppState
  85. {
  86. get { return appState; }
  87. set { appState = value; }
  88. }
  89. // private delegate void ConnectUpdateUiDelegate();
  90. // private delegate void SetAppStateDelegate(AppState state);
  91. HPSocketCS.TcpPackClient client = new HPSocketCS.TcpPackClient();
  92. /// <summary>
  93. /// 客户端连接
  94. /// </summary>
  95. public HPSocketCS.TcpPackClient Client
  96. {
  97. get { return client; }
  98. }
  99. /// <summary>
  100. /// 连接服务器
  101. /// </summary>
  102. /// <param name="ip">ip</param>
  103. /// <param name="port">端口</param>
  104. /// <param name="isAsyncConn">是否异步连接</param>
  105. /// <returns></returns>
  106. public bool ConnectionServer(string hostOrIP="", ushort port=0, bool isAsyncConn = false)
  107. {
  108. try
  109. {
  110. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  111. {
  112. return true;
  113. }
  114. if (!this.isInitializesNetwork)
  115. {
  116. this.InitializesNetwork();
  117. }
  118. LYFZ.Model.Model_Config mConfig = new LYFZ.BLL.BLL_Config().GetModel_SysConfig();
  119. if (hostOrIP != "")
  120. {
  121. mConfig.ServerHostOrIP = hostOrIP;
  122. }
  123. else {
  124. hostOrIP = mConfig.ServerHostOrIP;
  125. }
  126. if (port != 0)
  127. {
  128. mConfig.ServerPort = port;
  129. }
  130. else {
  131. port =Convert.ToUInt16(mConfig.ServerPort);
  132. }
  133. bool cAsyncConn = isAsyncConn;
  134. // 写在这个位置是上面可能会异常
  135. SetAppState(AppState.Starting);
  136. // AddMsg(string.Format("$Client Starting ... -> ({0}:{1})", ip, port));
  137. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端开始连接... -> ({0}:{1})", hostOrIP, port));
  138. if (client.Connetion(hostOrIP, port, cAsyncConn))
  139. {
  140. if (cAsyncConn == false)
  141. {
  142. SetAppState(AppState.Started);
  143. }
  144. this.Wapper = new TCP_RemoteDataHandlerPassiveMode(client);
  145. // AddMsg(string.Format("$Client Start OK -> ({0}:{1})", ip, port));
  146. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端连接OK -> ({0}:{1})", hostOrIP, port));
  147. return true;
  148. }
  149. else
  150. {
  151. SetAppState(AppState.Stoped);
  152. throw new Exception(string.Format("客户端连接出错 -> {0}({1})", client.ErrorMessage, client.ErrorCode));
  153. }
  154. }
  155. catch (Exception ex)
  156. {
  157. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端连接失败-> ({0})", ex.Message));
  158. }
  159. return false;
  160. }
  161. /// <summary>
  162. /// 关闭客户端连接
  163. /// </summary>
  164. /// <returns></returns>
  165. public bool CloseConnected()
  166. {
  167. // 停止服务
  168. // LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("准备关闭客户端连接"));
  169. // if (this.AppState == HPSocketCS.Extended.AppState.Started)
  170. // {
  171. // if (client.Stop())
  172. // {
  173. client.Stop();
  174. SetAppState(AppState.Stoped);
  175. if (this.tFileClient != null && this.tFileClient.AppState == HPSocketCS.Extended.AppState.Started)
  176. {
  177. this.tFileClient.CloseConnected();
  178. }
  179. return true;
  180. //}
  181. //else
  182. //{
  183. // // AddMsg(string.Format("$Stop Error -> {0}({1})", client.ErrorMessage, client.ErrorCode));
  184. // LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("关闭客户端连接失败-> {0}({1})", client.ErrorMessage, client.ErrorCode));
  185. //}
  186. // }
  187. //else {
  188. // return true;
  189. // }
  190. // return false;
  191. }
  192. bool isInitializesNetwork = false;
  193. /// <summary>
  194. /// 网络服务是否已初始化
  195. /// </summary>
  196. public bool IsInitializesNetwork
  197. {
  198. get { return isInitializesNetwork; }
  199. set { isInitializesNetwork = value; }
  200. }
  201. /// <summary>
  202. /// 申明委托
  203. /// </summary>
  204. /// <param name="e"></param>
  205. /// <returns></returns>
  206. public delegate void EventVerifiedHandler(LYFZ.Network.TCPNetworkServer.EventLockVerified e);
  207. /// <summary>
  208. /// EventClientLockVerified事件
  209. /// </summary>
  210. public event EventVerifiedHandler EventClientVerified;
  211. /// <summary>
  212. /// 初始化网络
  213. /// </summary>
  214. void InitializesNetwork()
  215. {
  216. try
  217. {
  218. // 设置client事件
  219. client.OnPrepareConnect += new HPSocketCS.TcpClientEvent.OnPrepareConnectEventHandler(OnPrepareConnect);
  220. client.OnConnect += new HPSocketCS.TcpClientEvent.OnConnectEventHandler(OnConnect);
  221. client.OnSend += new HPSocketCS.TcpClientEvent.OnSendEventHandler(OnSend);
  222. client.OnReceive += new HPSocketCS.TcpClientEvent.OnReceiveEventHandler(OnReceive);
  223. client.OnClose += new HPSocketCS.TcpClientEvent.OnCloseEventHandler(OnClose);
  224. // 设置包头标识,与对端设置保证一致性
  225. client.PackHeaderFlag = 0x1ff;
  226. // 设置最大封包大小
  227. client.MaxPackSize = 0x2000 * 32;
  228. client.SocketBufferSize = 512 * 1024;//client.MaxPackSize;
  229. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("客户初始化网络成功");
  230. SetAppState(AppState.Stoped);
  231. this.isInitializesNetwork = true;
  232. }
  233. catch (Exception ex)
  234. {
  235. SetAppState(AppState.Error);
  236. // AddMsg(ex.Message);
  237. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("客户初始化网络时出错:" + ex.Message);
  238. }
  239. }
  240. HPSocketCS.HandleResult OnPrepareConnect(HPSocketCS.TcpClient sender, uint socket)
  241. {
  242. return HPSocketCS.HandleResult.Ok;
  243. }
  244. HPSocketCS.HandleResult OnConnect(HPSocketCS.TcpClient sender)
  245. {
  246. // 已连接 到达一次
  247. // 设置附加数据
  248. string ip = "";
  249. ushort port = 0;
  250. if (sender.GetListenAddress(ref ip, ref port))
  251. {
  252. HPSocketCS.Extended.ClientInfo ci = new HPSocketCS.Extended.ClientInfo();
  253. ci.ConnId = sender.ConnectionId;
  254. ci.IpAddress = ip;
  255. ci.Port = port;
  256. sender.SetExtra(ci);
  257. }
  258. // 如果是异步联接,更新界面状态
  259. // this.Invoke(new ConnectUpdateUiDelegate(ConnectUpdateUi));
  260. // AddMsg(string.Format(" > [{0},OnConnect]", sender.ConnectionId));
  261. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("已连接:"+ip+":"+port.ToString());
  262. return HPSocketCS.HandleResult.Ok;
  263. }
  264. HPSocketCS.HandleResult OnSend(HPSocketCS.TcpClient sender, byte[] bytes)
  265. {
  266. // 客户端发数据了
  267. //AddMsg(string.Format(" > [{0},OnSend] ->数据发送成功 ({1} bytes)", sender.ConnectionId, bytes.Length));
  268. return HPSocketCS.HandleResult.Ok;
  269. }
  270. HPSocketCS.HandleResult OnReceive(HPSocketCS.TcpClient sender, byte[] bytes)
  271. {
  272. // 数据到达了
  273. try
  274. {
  275. //收到的数据
  276. byte[] receiveBytes = new byte[0];
  277. TcpHeadInfo header = sender.BytesToStruct<TcpHeadInfo>(bytes);
  278. try
  279. {
  280. DataType dType = (DataType)header.MsgDataType;
  281. int headSize = Marshal.SizeOf(header);
  282. TcpTailInfo tail = new TcpTailInfo();
  283. if (header.IsTail)
  284. {
  285. //有附加尾数据时
  286. int tailSize = Marshal.SizeOf(tail);
  287. byte[] tailBytes = new byte[tailSize];
  288. Array.ConstrainedCopy(bytes, bytes.Length - tailSize, tailBytes, 0, tailBytes.Length);
  289. tail = sender.BytesToStruct<TcpTailInfo>(tailBytes);
  290. receiveBytes = new byte[bytes.Length - headSize - tailSize];
  291. Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
  292. tailBytes = null;
  293. }
  294. else
  295. {
  296. // 因为没有附加尾数据,所以大小可以用length - objSize
  297. receiveBytes = new byte[bytes.Length - headSize];
  298. Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
  299. }
  300. ReceiveCacheBuffer recBuffer = sender.CCommonLibrary.GetReceiveCacheBuffer(header.TransportID);
  301. if (recBuffer != null)
  302. {
  303. lock (recBuffer)
  304. {
  305. recBuffer.Length += receiveBytes.Length;
  306. if (recBuffer.BackgroundWorker != null)
  307. {
  308. //总计数器
  309. long sumCount = header.IntactSize;
  310. if (dType == DataType.File)
  311. {
  312. sumCount = tail.FileSize;
  313. }
  314. //当前计数器
  315. long currentCount = recBuffer.Length;
  316. if (header.TransportEnd && tail.IsSendComplete)
  317. {
  318. currentCount = Convert.ToInt64(sumCount);
  319. }
  320. CommonLibrary.SetBackgroundWorker(sumCount, currentCount,"正在接收数据,请稍等...", recBuffer.BackgroundWorker);
  321. }
  322. }
  323. }
  324. //接收到的客户端发送来的数据
  325. byte[] recbytes = null;
  326. try
  327. {
  328. if (header.TransportStart && header.TransportEnd)
  329. {
  330. recbytes = receiveBytes;
  331. receiveBytes = null;
  332. }
  333. else
  334. {
  335. ReceiveData rData = sender.CCommonLibrary.GetReceiveData(header);
  336. if (rData == null)
  337. {
  338. rData = new ReceiveData();
  339. sender.CCommonLibrary.AddReceiveData(rData);
  340. }
  341. rData.ReceiveRemoteClientInfo = header;
  342. rData.ReceiveDataMstream.Write(receiveBytes, 0, receiveBytes.Length);
  343. if (header.TransportEnd)
  344. {
  345. recbytes = rData.ReceiveDataMstream.ToArray();
  346. sender.CCommonLibrary.RemoveReceiveDataData(rData);
  347. }
  348. }
  349. if (recbytes != null)
  350. {
  351. recbytes = HPSocketCS.Extended.DataSetSerializerDeserialize.DataDecompressRetBytes(recbytes);
  352. if (!header.IsTail && header.TransportEnd)
  353. {
  354. tail.IsSendComplete = true;
  355. }
  356. switch (dType)
  357. {
  358. case DataType.Text:
  359. // string ReceiveInfo = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
  360. // AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)>" + ReceiveInfo, sender.ConnectionId, bytes.Length));
  361. if (recBuffer != null)
  362. {
  363. if (!recBuffer.ReceiveComplete(recbytes,tail.IsSendComplete))
  364. {
  365. return HPSocketCS.HandleResult.Error;
  366. }
  367. }
  368. break;
  369. case DataType.File:
  370. if (!sender.ReceiveDownloadFile(header, tail, recBuffer, recbytes))
  371. {
  372. return HPSocketCS.HandleResult.Error;
  373. }
  374. break;
  375. case DataType.Serialization:
  376. case DataType.SQLHelper:
  377. if (recBuffer != null)
  378. {
  379. if (!recBuffer.ReceiveComplete(recbytes, tail.IsSendComplete))
  380. {
  381. return HPSocketCS.HandleResult.Error;
  382. }
  383. }
  384. // break;
  385. break;
  386. case DataType.List:
  387. break;
  388. case DataType.Array:
  389. break;
  390. case DataType.None:
  391. break;
  392. case DataType.PushMessage:
  393. string ReceivePushMessage = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
  394. TCP_ProtocolHelperXML Pushhelper = new TCP_ProtocolHelperXML(ReceivePushMessage.Trim());
  395. TCP_FileProtocol Pushprotocol = new TCP_FileProtocol();
  396. Pushprotocol = Pushhelper.GetProtocol();
  397. Pushprotocol.ReceiveFileSize = recbytes.Length;
  398. if (Pushprotocol.Content.Contains("VitalControl"))
  399. {
  400. string recValue = this.SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.VitalControl, Pushprotocol.Content.Trim(), millisecondsTimeout: 9000);
  401. if (recValue.Trim().Contains("VitalControlOK"))
  402. {
  403. LYFZ.Network.TCPNetworkClient.TCP_NetworkClient.TServerClient.SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.VitalControlOK, recValue.Trim(), millisecondsTimeout: 9000);
  404. }
  405. }
  406. break;
  407. case DataType.ShowForm:
  408. string ReceiveInfo = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
  409. TCP_ProtocolHelperXML helper = new TCP_ProtocolHelperXML(ReceiveInfo.Trim());
  410. TCP_FileProtocol protocol = new TCP_FileProtocol();
  411. protocol = helper.GetProtocol();
  412. protocol.ReceiveFileSize = recbytes.Length;
  413. LYFZ.Network.TCPNetworkServer.EventLockVerified e = new TCPNetworkServer.EventLockVerified();
  414. e.CInfo.IpAddress = header.IPAddress;
  415. e.CInfo.Port =Convert.ToUInt16(header.Port);
  416. e.CInfo.Message = protocol.Content;
  417. if (this.EventClientVerified != null)
  418. {
  419. this.EventClientVerified(e);
  420. }
  421. break;
  422. }
  423. }
  424. }
  425. finally
  426. {
  427. recbytes = null;
  428. }
  429. return HPSocketCS.HandleResult.Ok;
  430. }
  431. catch
  432. {
  433. sender.CCommonLibrary.RemoveServerToClientByteList(header.TransportID);
  434. return HPSocketCS.HandleResult.Ignore;
  435. }
  436. }
  437. catch (Exception ex)
  438. {
  439. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("接收数据时出错:" + ex.Message);
  440. return HPSocketCS.HandleResult.Error;
  441. }
  442. finally
  443. {
  444. System.GC.Collect();
  445. }
  446. /* string ReceiveInfo = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
  447. AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)>" + ReceiveInfo, sender.ConnectionId, bytes.Length));
  448. // AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)", sender.ConnectionId, bytes.Length));
  449. return HandleResult.Ok;*/
  450. }
  451. HPSocketCS.HandleResult OnClose(HPSocketCS.TcpClient sender, HPSocketCS.SocketOperation enOperation, int errorCode)
  452. {
  453. try
  454. {
  455. try
  456. {
  457. sender.CCommonLibrary.ClearAllInvalidResource();
  458. }
  459. catch { }
  460. try
  461. {
  462. sender.CCommonLibrary.ClearAllServerToClientByteList();
  463. }
  464. catch { }
  465. SetAppState(AppState.Stoped);
  466. if (errorCode == 0)
  467. {
  468. // 连接关闭了
  469. // AddMsg(string.Format(" > [{0},OnClose]", sender.ConnectionId));
  470. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("连接关闭了");
  471. }
  472. else if (enOperation == HPSocketCS.SocketOperation.Close)
  473. {
  474. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format(" 服务器已关闭连接> [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
  475. }
  476. else
  477. {
  478. // 出错了
  479. // AddMsg(string.Format(" > [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
  480. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format(" 连接出错了> [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
  481. }
  482. // 通知界面,只处理了连接错误,也没进行是不是连接错误的判断,所以有错误就会设置界面
  483. // 生产环境请自己控制
  484. // this.Invoke(new SetAppStateDelegate(SetAppState), AppState.Stoped);
  485. }
  486. catch { }
  487. return HPSocketCS.HandleResult.Ok;
  488. }
  489. /// <summary>
  490. /// 设置程序状态
  491. /// </summary>
  492. /// <param name="state"></param>
  493. void SetAppState(AppState state)
  494. {
  495. appState = state;
  496. }
  497. TCP_RemoteDataHandlerPassiveMode wapper = null;
  498. /// <summary>
  499. ///
  500. /// </summary>
  501. public TCP_RemoteDataHandlerPassiveMode Wapper
  502. {
  503. get { return this.wapper; }
  504. set { this.wapper = value; }
  505. }
  506. /// <summary>
  507. /// 刷新客户端连接
  508. /// </summary>
  509. /// <returns></returns>
  510. public bool RefreshClientList()
  511. {
  512. if (SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.RefreshClientList).ToLower().Trim() == "ok")
  513. {
  514. return true;
  515. }
  516. else
  517. {
  518. return false;
  519. }
  520. }
  521. /// <summary>
  522. /// 发送信息到客服端并返回服务器的处理结果
  523. /// </summary>
  524. /// <param name="msg"></param>
  525. /// <returns></returns>
  526. public string SendMsgToServer(string msg)
  527. {
  528. return SendCommandToServer(msgOrParameters: msg);
  529. }
  530. static string _FromServerStartTimeStamp = "";
  531. /// <summary>
  532. /// 来自服务器的启动时间标识
  533. /// </summary>
  534. public static string FromServerStartTimeStamp
  535. {
  536. get { return TCP_NetworkClient._FromServerStartTimeStamp; }
  537. set { TCP_NetworkClient._FromServerStartTimeStamp = value; }
  538. }
  539. /// <summary>
  540. /// 发送指令到服务端并返回服务器的处理结果
  541. /// </summary>
  542. /// <param name="command">要发送到服务器的指令</param>
  543. /// <param name="msgOrParameters">发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔</param>
  544. /// <returns></returns>
  545. public string SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello", int millisecondsTimeout = 1000*90)
  546. {
  547. string tempMsg = "";
  548. if (this.appState == AppState.Started)
  549. {
  550. tempMsg = this.Wapper.SendCommandToServerRetMessage(command, msgOrParameters, millisecondsTimeout);
  551. }
  552. return tempMsg;
  553. }
  554. /// <summary>
  555. /// 发送指令到服务端并返回服务器的处理结果
  556. /// </summary>
  557. /// <param name="command">要发送到服务器的指令</param>
  558. /// <param name="msgOrParameters">发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔</param>
  559. /// <returns></returns>
  560. public TCP_FileProtocol SendCommandToServerRetProtocol(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
  561. {
  562. TCP_FileProtocol protocol = new TCP_FileProtocol();
  563. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  564. {
  565. protocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, command, msgOrParameters);
  566. }
  567. return protocol;
  568. }
  569. /// <summary>
  570. /// 发送指令到服务端并返回二进制字节数组
  571. /// </summary>
  572. /// <param name="command">要发送到服务器的指令</param>
  573. /// <param name="msgOrParameters">发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔</param>
  574. /// <returns></returns>
  575. public byte[] DataCommandToServerRetByte(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
  576. {
  577. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  578. {
  579. TCP_FileProtocol protocol = DataCommandToServerProtocol(command, msgOrParameters);
  580. if (protocol.DataArray != null)
  581. {
  582. return protocol.DataArray;
  583. }
  584. else
  585. {
  586. return null;
  587. }
  588. }
  589. else
  590. {
  591. return null;
  592. }
  593. }
  594. /// <summary>
  595. /// 发送指令到服务端并返回二进制字节数组
  596. /// </summary>
  597. /// <param name="command">要发送到服务器的指令</param>
  598. /// <param name="msgOrParameters">发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔</param>
  599. /// <returns></returns>
  600. public TCP_FileProtocol DataCommandToServerProtocol(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
  601. {
  602. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  603. {
  604. return this.Wapper.HP_SendCommandToServer(InformationType.Data, command, msgOrParameters);
  605. }
  606. else
  607. {
  608. return new TCP_FileProtocol();
  609. }
  610. }
  611. /// <summary>
  612. /// 发送SQL指令到服务端并返回结果对象
  613. /// </summary>
  614. /// <param name="requestData"></param>
  615. /// <param name="millisecondsTimeout"></param>
  616. /// <returns></returns>
  617. public HPSocketCS.Extended.SQLHelperReturnData SqlCommandToServerReturnData(HPSocketCS.Extended.SQLHelperRequestData requestData, int millisecondsTimeout = 1000*90)
  618. {
  619. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  620. {
  621. return this.Wapper.HP_SendSqlCommandToServer(requestData, millisecondsTimeout);
  622. }
  623. else
  624. {
  625. return new SQLHelperReturnData("发送SQL指令到服务端时失败,网络连接已断开,请检查网络环境。");
  626. }
  627. }
  628. /// <summary>
  629. /// 上传头像
  630. /// </summary>
  631. /// <param name="fileFullName">要上传的头像路径</param>
  632. /// <param name="backgroundWorker"></param>
  633. /// <returns></returns>
  634. public string UploadAvatarToServer(string fileFullName, BackgroundWorker backgroundWorker = null)
  635. {
  636. return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadAvatar, fileFullName, System.IO.Path.GetFileName(fileFullName), backgroundWorker);
  637. }
  638. /// <summary>
  639. /// 上传文件
  640. /// </summary>
  641. /// <param name="fileFullName">要上传的文件路径</param>
  642. /// <param name="toServerFileFullName">上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”</param>
  643. /// <param name="backgroundWorker"></param>
  644. /// <returns></returns>
  645. public string UploadFileToServer(string fileFullName, string toServerFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  646. {
  647. return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, fileFullName, toServerFileFullName, backgroundWorker,autoMainStoreDownload:autoMainStoreDownload);
  648. }
  649. /// <summary>
  650. /// 上传图片
  651. /// </summary>
  652. /// <param name="img">要上传的图片</param>
  653. /// <param name="imgFormat">上传的图片格式</param>
  654. /// <param name="toServerFileFullName">上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”</param>
  655. /// <param name="isDisposeImg">上传后是否释放图片资源</param>
  656. /// <param name="backgroundWorker"></param>
  657. /// <returns></returns>
  658. public string UploadFileToServer(System.Drawing.Image img, System.Drawing.Imaging.ImageFormat imgFormat, string toServerFileFullName, BackgroundWorker backgroundWorker = null, bool isDisposeImg = true)
  659. {
  660. MemoryStream memoryMS = new MemoryStream();
  661. img.Save(memoryMS, imgFormat);
  662. if (isDisposeImg)
  663. {
  664. img.Dispose();
  665. }
  666. return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, "", toServerFileFullName, backgroundWorker, memoryMS: memoryMS);
  667. }
  668. /// <summary>
  669. /// 上传内存流
  670. /// </summary>
  671. /// <param name="memoryMS">要上传的内存流</param>
  672. /// <param name="toServerFileFullName">上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”</param>
  673. /// <param name="isDisposeImg">上传后是否释放图片资源</param>
  674. /// <param name="backgroundWorker"></param>
  675. /// <returns></returns>
  676. public string UploadFileToServer(MemoryStream memoryMS, string toServerFileFullName, BackgroundWorker backgroundWorker = null)
  677. {
  678. return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, "", toServerFileFullName, backgroundWorker, memoryMS: memoryMS);
  679. }
  680. /// <summary>
  681. /// 获取指定服务器端文件的信息
  682. /// </summary>
  683. /// <param name="sFileName">为你向服务器请求的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  684. /// <returns></returns>
  685. public ServerFileInfo GetServerFileInfo(string sFileName)
  686. {
  687. ServerFileInfo sFileInfo = new ServerFileInfo();
  688. if (IsRemoteCloudClient)
  689. {
  690. // 获取云服务器上指定文件的信息
  691. HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GetFileInfo);
  692. HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
  693. reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
  694. reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
  695. reqParameters.SetRequestParameter<string>("FilePath", sFileName);
  696. requestData.AttachedData = reqParameters.ToBytes();
  697. HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.client, requestData);
  698. if (returnData.ReturnStatus)
  699. {
  700. string fileJson = returnData.DataByteToModelObject<string>();
  701. HPSocketCS.Extended.NetFileInfo fileInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<HPSocketCS.Extended.NetFileInfo>(fileJson);
  702. sFileInfo = new ServerFileInfo(fileInfo.ToString());
  703. }
  704. else
  705. {
  706. sFileInfo.GetMsg = "获取失败,原因:" + returnData.ReturnMessage;
  707. }
  708. }
  709. else
  710. {
  711. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  712. {
  713. try
  714. {
  715. TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GetFileInfo, sFileName);
  716. sFileInfo = new ServerFileInfo(sendFileProtocol.Content);
  717. }
  718. catch { sFileInfo.GetMsg = "连接已断开,请检查网络环境是否正常..."; }
  719. }
  720. }
  721. return sFileInfo;
  722. }
  723. /// <summary>
  724. /// 下载头像
  725. /// </summary>
  726. /// <param name="backgroundWorker"></param>
  727. /// <param name="saveFileFullName">头像下载后保存的位置</param>
  728. /// <param name="fileName">头像图片名(带扩展名)</param>
  729. /// <returns></returns>
  730. public string DownloadAvatar(string saveFileFullName, string fileName, BackgroundWorker backgroundWorker = null)
  731. {
  732. return ReceiveFileCommandToServer(null, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, fileName, fileName, backgroundWorker);
  733. }
  734. /// <summary>
  735. /// 下载头像
  736. /// </summary>
  737. /// <param name="backgroundWorker"></param>
  738. /// <param name="memoryMS">保存到指定的内存流中</param>
  739. /// <param name="fileName">头像图片名(带扩展名)</param>
  740. /// <returns></returns>
  741. public string DownloadAvatar(MemoryStream memoryMS, string fileName, BackgroundWorker backgroundWorker = null)
  742. {
  743. return ReceiveFileCommandToServer(memoryMS, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, "", fileName, backgroundWorker);
  744. }
  745. /// <summary>
  746. /// 下载头像
  747. /// </summary>
  748. /// <param name="resultBitmap">返回下载的图片</param>
  749. /// <param name="fileName">头像图片名(带扩展名)</param>
  750. /// <param name="backgroundWorker"></param>
  751. /// <returns></returns>
  752. public string DownloadAvatar(ref System.Drawing.Bitmap resultBitmap, string fileName, BackgroundWorker backgroundWorker = null)
  753. {
  754. try
  755. {
  756. MemoryStream ImageMS = new MemoryStream();
  757. string retMsg = ReceiveFileCommandToServer(ImageMS, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, "", fileName, backgroundWorker);
  758. try
  759. {
  760. resultBitmap = new System.Drawing.Bitmap(ImageMS);
  761. }
  762. catch
  763. {
  764. retMsg = "下载失败,头像生成时失败";
  765. }
  766. ImageMS.Close();
  767. ImageMS.Dispose();
  768. return retMsg;
  769. }
  770. catch (Exception ex)
  771. {
  772. return "下载失败:" + ex.ToString();
  773. }
  774. }
  775. /// <summary>
  776. /// 下载文件
  777. /// </summary>
  778. /// <param name="saveFileFullName">下载后保存的位置</param>
  779. /// <param name="serverFileFullName">为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  780. /// <param name="backgroundWorker"></param>
  781. /// <returns></returns>
  782. public string DownloadFile(string saveFileFullName, string serverFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  783. {
  784. return ReceiveFileCommandToServer(null, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, saveFileFullName, serverFileFullName, backgroundWorker, autoMainStoreDownload);
  785. }
  786. /// <summary>
  787. /// 删除服务上的文件 多个文件用 “|”分隔
  788. /// </summary>
  789. /// <param name="serverFileFullName">要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  790. /// <param name="backgroundWorker"></param>
  791. /// <returns></returns>
  792. public string DeleteFile(string serverFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  793. {
  794. string ret = "删除失败";
  795. if (IsRemoteCloudClient)
  796. {
  797. //删除云服务器上的文件
  798. HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.DeleteFile);
  799. HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
  800. reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
  801. reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
  802. reqParameters.SetRequestParameter<string>("delFiles", serverFileFullName);
  803. requestData.AttachedData = reqParameters.ToBytes();
  804. HPSocketCS.Extended.ReturnData returnData= HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
  805. ret = returnData.ReturnMessage;
  806. }
  807. else
  808. {
  809. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  810. {
  811. try
  812. {
  813. TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.DeleteFile, serverFileFullName + "?" + autoMainStoreDownload.ToString());
  814. ret = sendFileProtocol.Content;
  815. }
  816. catch { ret = "连接已断开,请检查网络环境是否正常..."; }
  817. }
  818. }
  819. return ret;
  820. }
  821. /// <summary>
  822. /// 删除服务上的目录
  823. /// </summary>
  824. /// <param name="serverDirectoryFullName">要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”</param>
  825. /// <param name="backgroundWorker"></param>
  826. /// <returns></returns>
  827. public string DeleteDirectory(string serverDirectoryFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  828. {
  829. string ret = "删除失败";
  830. if (IsRemoteCloudClient)
  831. {
  832. // 删除云服务器上指定目录下的文件
  833. HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.DeleteFile);
  834. HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
  835. reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
  836. reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
  837. reqParameters.SetRequestParameter<string>("dirPath", serverDirectoryFullName);
  838. reqParameters.SetRequestParameter<bool>("isDelAllFiles", false);
  839. requestData.AttachedData = reqParameters.ToBytes();
  840. HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
  841. ret = returnData.ReturnMessage;
  842. }
  843. else
  844. {
  845. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  846. {
  847. try
  848. {
  849. serverDirectoryFullName = serverDirectoryFullName + "|false|" + autoMainStoreDownload.ToString();
  850. TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.DeleteDirectory, serverDirectoryFullName);
  851. ret = sendFileProtocol.Content;
  852. }
  853. catch { ret = "连接已断开,请检查网络环境是否正常..."; }
  854. }
  855. }
  856. return ret;
  857. }
  858. /// <summary>
  859. /// 获取服务上的指定目录下的子目录集合
  860. /// </summary>
  861. /// <param name="retDirectoryList">返回的子目录集合</param>
  862. /// <param name="serverDirectoryFullName">要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”</param>
  863. /// <param name="searchPattern">搜索条件</param>
  864. /// <param name="isSearchSubfolder">是否搜索子目录</param>
  865. /// <param name="backgroundWorker"></param>
  866. /// <param name="retDirectoryList">返回的目录集合</param>
  867. /// <returns></returns>
  868. public string GetDirectoryList(out List<string> retDirectoryList, string serverDirectoryFullName, string searchPattern = "*.*", bool isSearchSubfolder = false, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  869. {
  870. string ret = "获取失败";
  871. retDirectoryList = new List<string>();
  872. if (IsRemoteCloudClient)
  873. {
  874. // 获取云服务器上指定目录下的目录列表
  875. HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GetDirectoryList);
  876. HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
  877. reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
  878. reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
  879. reqParameters.SetRequestParameter<string>("dirPath", serverDirectoryFullName);
  880. reqParameters.SetRequestParameter<bool>("isSearchSubfolder", isSearchSubfolder);
  881. reqParameters.SetRequestParameter<string>("searchPattern", searchPattern);
  882. requestData.AttachedData = reqParameters.ToBytes();
  883. HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
  884. ret = returnData.ReturnMessage;
  885. if (returnData.ReturnStatus)
  886. {
  887. string fileString = returnData.DataByteToModelObject<string>();
  888. if (fileString.Trim().Trim('|').Length > 0)
  889. {
  890. retDirectoryList.AddRange(fileString.Trim().Trim('|').Split('|'));
  891. }
  892. }
  893. }
  894. else
  895. {
  896. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  897. {
  898. try
  899. {
  900. serverDirectoryFullName = serverDirectoryFullName + "|" + isSearchSubfolder.ToString() + "|" + searchPattern;
  901. if (!autoMainStoreDownload)
  902. {
  903. serverDirectoryFullName = serverDirectoryFullName + "|" + false.ToString();
  904. }
  905. TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GetDirectoryList, serverDirectoryFullName);
  906. ret = sendFileProtocol.Content;
  907. if (ret.Contains("成功") && sendFileProtocol.ExtraInfo.Trim().Trim('|').Length > 0)
  908. {
  909. retDirectoryList.AddRange(sendFileProtocol.ExtraInfo.Trim().Trim('|').Split('|'));
  910. }
  911. }
  912. catch { ret = "连接已断开,请检查网络环境是否正常..."; }
  913. }
  914. }
  915. return ret;
  916. }
  917. /// <summary>
  918. /// 获取服务上的指定目录下的文件集合
  919. /// </summary>
  920. /// <param name="retFileList">返回的文件集合</param>
  921. /// <param name="serverDirectoryFullName">要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”</param>
  922. /// <param name="searchPattern">搜索条件</param>
  923. /// <param name="isSearchSubfolder">是否搜索子目录</param>
  924. /// <param name="backgroundWorker"></param>
  925. /// <param name="autoMainStoreDownload">是否自动连接总店服务器获取总店服务器上的信息</param>
  926. /// <param name="retDirectoryList">返回的目录集合</param>
  927. /// <returns></returns>
  928. public string GetDirectoryFileList(out List<string> retFileList, string serverDirectoryFullName, string searchPattern = "*.*", bool isSearchSubfolder = false, BackgroundWorker backgroundWorker = null, int millisecondsTimeout = 1000*90, bool autoMainStoreDownload = true)
  929. {
  930. string ret = "获取失败";
  931. retFileList = new List<string>();
  932. if (IsRemoteCloudClient)
  933. {
  934. // 获取云服务器上指定目录下的文件列表
  935. HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GeTFileList);
  936. HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
  937. reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
  938. reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
  939. reqParameters.SetRequestParameter<string>("dirPath", serverDirectoryFullName);
  940. reqParameters.SetRequestParameter<bool>("isSearchSubfolder", isSearchSubfolder);
  941. reqParameters.SetRequestParameter<string>("searchPattern", searchPattern);
  942. requestData.AttachedData = reqParameters.ToBytes();
  943. HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
  944. ret = returnData.ReturnMessage;
  945. if (returnData.ReturnStatus)
  946. {
  947. string fileString = returnData.DataByteToModelObject<string>();
  948. if (fileString.Trim().Trim('|').Length > 0)
  949. {
  950. retFileList.AddRange(fileString.Trim().Trim('|').Split('|'));
  951. }
  952. }
  953. }
  954. else
  955. {
  956. if (this.AppState == HPSocketCS.Extended.AppState.Started)
  957. {
  958. try
  959. {
  960. serverDirectoryFullName = serverDirectoryFullName + "|" + isSearchSubfolder.ToString() + "|" + searchPattern;
  961. if (!autoMainStoreDownload)
  962. {
  963. serverDirectoryFullName = serverDirectoryFullName + "|" + false.ToString();
  964. }
  965. TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GeTFileList, serverDirectoryFullName, millisecondsTimeout);
  966. ret = sendFileProtocol.Content;
  967. if (ret.Contains("成功") && sendFileProtocol.ExtraInfo.Trim().Trim('|').Length > 0)
  968. {
  969. retFileList.AddRange(sendFileProtocol.ExtraInfo.Trim().Trim('|').Split('|'));
  970. }
  971. }
  972. catch { ret = "连接已断开,请检查网络环境是否正常..."; }
  973. }
  974. }
  975. return ret;
  976. }
  977. /// <summary>
  978. /// 下载文件
  979. /// </summary>
  980. /// <param name="memoryMS">保存到指定的内存流中</param>
  981. /// <param name="serverFileFullName">为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  982. /// <param name="backgroundWorker"></param>
  983. /// <returns></returns>
  984. public string DownloadFile(MemoryStream memoryMS, string serverFileFullName, BackgroundWorker backgroundWorker = null)
  985. {
  986. return ReceiveFileCommandToServer(memoryMS, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, "", serverFileFullName, backgroundWorker);
  987. }
  988. /// <summary>
  989. /// 下载图像
  990. /// </summary>
  991. /// <param name="backgroundWorker"></param>
  992. /// <param name="resultBitmap">返回下载的图片</param>
  993. /// <param name="fileName">要下载的图片路径,以服务器程序的根目录定位 如“UpdateTemp\\test.jpg”</param>
  994. /// <returns></returns>
  995. public string DownloadBitmap(ref System.Drawing.Bitmap resultBitmap, string fileName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
  996. {
  997. try
  998. {
  999. string retMsg = "";
  1000. if (LYFZ.WinAPI.CustomPublicMethod.ExistsImgage(fileName))
  1001. {
  1002. MemoryStream ImageMS = new MemoryStream();
  1003. retMsg = ReceiveFileCommandToServer(ImageMS, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, "", fileName, backgroundWorker, autoMainStoreDownload);
  1004. if (retMsg.Contains("成功"))
  1005. {
  1006. try
  1007. {
  1008. resultBitmap = new System.Drawing.Bitmap(ImageMS);
  1009. }
  1010. catch
  1011. {
  1012. retMsg = "下载失败,图像生成失败";
  1013. }
  1014. }
  1015. else
  1016. {
  1017. if (retMsg.Trim() == "")
  1018. {
  1019. retMsg = "下载失败,请重试";
  1020. }
  1021. }
  1022. ImageMS.Close();
  1023. ImageMS.Dispose();
  1024. }
  1025. else
  1026. {
  1027. retMsg = "您请求下载的文件不是图片,不能下载";
  1028. }
  1029. return retMsg;
  1030. }
  1031. catch (Exception ex)
  1032. {
  1033. return "下载失败:" + ex.ToString();
  1034. }
  1035. }
  1036. /// <summary>
  1037. /// 向服务器上传文件
  1038. /// </summary>
  1039. /// <param name="command">上传命令</param>
  1040. /// <param name="fileFullName">上传的文件全路径</param>
  1041. /// <param name="toServerFileFullName">上传到服务器上的目录路径 以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  1042. /// <param name="backgroundWorker">参数</param>
  1043. /// <param name="memoryMS"></param>
  1044. /// <param name="autoMainStoreDownload">如果是分店是否自动上传文件到总店服务器</param>
  1045. /// <returns></returns>
  1046. public string SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.UploadAvatar, string fileFullName = "", string toServerFileFullName = "", BackgroundWorker backgroundWorker = null, MemoryStream memoryMS = null, bool autoMainStoreDownload = true)
  1047. {
  1048. string tempMsg = "";
  1049. string fileName = toServerFileFullName;
  1050. bool ret = false;
  1051. TCP_NetworkClient myUploadClient = null;
  1052. if (!TCP_NetworkClient.IsRemoteCloudClient && autoMainStoreDownload && LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore && TCP_NetworkClient.ConnectionMainStoreServer())
  1053. {
  1054. myUploadClient = TCP_NetworkClient.MainStoreClient;
  1055. }
  1056. else
  1057. {
  1058. myUploadClient = this.TFileClient;
  1059. if (this.TFileClient.AppState != HPSocketCS.Extended.AppState.Started)
  1060. {
  1061. this.TFileClient.ConnectionServer();
  1062. }
  1063. }
  1064. if (command == HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar)
  1065. {
  1066. //如果是上传头像时设置头像路径
  1067. toServerFileFullName = "Resources\\Avatar\\User\\" + System.IO.Path.GetFileName(toServerFileFullName);
  1068. }
  1069. if (TCP_NetworkClient.IsRemoteCloudClient)
  1070. {
  1071. toServerFileFullName = toServerFileFullName + "|" + HPSocketCS.TcpServer.EnterpriseID;
  1072. if (!HPSocketCS.TcpServer.CloudServerFilter(toServerFileFullName))
  1073. {
  1074. return "远程云版客户端暂不支持上传此文件";
  1075. }
  1076. }
  1077. if (myUploadClient.AppState == HPSocketCS.Extended.AppState.Started)
  1078. {
  1079. ServerFileInfo downloadFileInfo = myUploadClient.GetServerFileInfo(toServerFileFullName);
  1080. bool isUpload = true;//是否需要上传文件 用于判断要上传的文件是否在服务器上存在,如果存在就不上传
  1081. if (downloadFileInfo.IsExists)
  1082. {
  1083. if (downloadFileInfo.FileMd5.Trim().Length > 0)
  1084. {
  1085. if (memoryMS == null && fileFullName.Trim().Length > 0)
  1086. {
  1087. if (System.IO.File.Exists(fileFullName.Trim()))
  1088. {
  1089. FileInfo fi = new FileInfo(fileFullName.Trim());
  1090. if (fi.Length < HPSocketCS.Sdk.FileMD5VerifySize)
  1091. {
  1092. string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(fileFullName.Trim());
  1093. if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
  1094. {
  1095. isUpload = false;
  1096. }
  1097. }
  1098. }
  1099. }
  1100. else if (memoryMS != null)
  1101. {
  1102. if (downloadFileInfo.FileMd5.Trim().Length > 0)
  1103. {
  1104. memoryMS.Position = 0;
  1105. byte[] bytes = new byte[memoryMS.Length];
  1106. memoryMS.Read(bytes, 0, bytes.Length);
  1107. string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(bytes);
  1108. Array.Clear(bytes, 0, bytes.Length);
  1109. bytes = null;
  1110. if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
  1111. {
  1112. isUpload = false;
  1113. }
  1114. }
  1115. }
  1116. }
  1117. }
  1118. if (isUpload)
  1119. {
  1120. if (fileFullName.Trim().Length > 0 && System.IO.File.Exists(fileFullName.Trim()) && memoryMS == null)
  1121. {
  1122. ret = myUploadClient.Client.UploadFiles(fileFullName.Trim(), toServerFileFullName, backgroundWorker);
  1123. }
  1124. else if (memoryMS != null)
  1125. {
  1126. ret = myUploadClient.Client.UploadMemoryStream(memoryMS, toServerFileFullName, backgroundWorker);
  1127. }
  1128. else
  1129. {
  1130. return "要上传的文件不存在:" + fileFullName;
  1131. }
  1132. }
  1133. else
  1134. {
  1135. ret = true;
  1136. }
  1137. }
  1138. else
  1139. {
  1140. return "网络连接失败,请检查网络环境";
  1141. }
  1142. if (ret)
  1143. {
  1144. tempMsg = "上传成功";
  1145. }
  1146. else
  1147. {
  1148. tempMsg = "上传失败";
  1149. }
  1150. return tempMsg;
  1151. }
  1152. /// <summary>
  1153. /// 临时缓存文件目录
  1154. /// </summary>
  1155. static string TemporaryCachefilesPath = LYFZ.WinAPI.CustomPublicMethod.GetFullDirectoryPath(LYFZ.WinAPI.CustomPublicMethod.BasePath) + "Temp\\TemporaryCachefiles\\";
  1156. /// <summary>
  1157. /// 从服务器下载文件
  1158. /// </summary>
  1159. /// <param name="memoryMS"></param>
  1160. /// <param name="command">下载命令</param>
  1161. /// <param name="saveFileFullName">下载后要保存的文件全路</param>
  1162. /// <param name="serverFileFullName">为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”</param>
  1163. /// <param name="backgroundWorker"></param>
  1164. /// <param name="requestNumber">请求下载的次数 用于在下载失败时判断是否自动重新请求下载</param>
  1165. /// <param name="autoMainStoreDownload">如果是分店是否自动到总店服务器下载文件</param>
  1166. /// <returns></returns>
  1167. public string ReceiveFileCommandToServer(MemoryStream memoryMS = null, HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, string saveFileFullName = "", string serverFileFullName = "", BackgroundWorker backgroundWorker = null,bool autoMainStoreDownload=true)
  1168. {
  1169. string tempMsg = "";
  1170. // if (!isFileServerIng)
  1171. {
  1172. try
  1173. {
  1174. bool ret = false;
  1175. TCP_NetworkClient myDownLoadClient = null;
  1176. if (!TCP_NetworkClient.IsRemoteCloudClient&&autoMainStoreDownload && LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore && TCP_NetworkClient.ConnectionMainStoreServer())
  1177. {
  1178. myDownLoadClient = TCP_NetworkClient.MainStoreClient;
  1179. }
  1180. else {
  1181. myDownLoadClient = this.TFileClient;
  1182. if (myDownLoadClient.AppState != HPSocketCS.Extended.AppState.Started)
  1183. {
  1184. myDownLoadClient.ConnectionServer();
  1185. }
  1186. }
  1187. if (myDownLoadClient.AppState == HPSocketCS.Extended.AppState.Started)
  1188. {
  1189. if (command == HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar)
  1190. {
  1191. //如果是下载头像时设置头像在服务器上的路径
  1192. serverFileFullName = "Resources\\Avatar\\User\\" + System.IO.Path.GetFileName(serverFileFullName);
  1193. }
  1194. if (TCP_NetworkClient.IsRemoteCloudClient)
  1195. {
  1196. serverFileFullName = serverFileFullName + "|" + HPSocketCS.TcpServer.EnterpriseID;
  1197. }
  1198. ServerFileInfo downloadFileInfo = myDownLoadClient.GetServerFileInfo(serverFileFullName);
  1199. if (downloadFileInfo.IsExists)
  1200. {
  1201. if (memoryMS == null && saveFileFullName.Trim().Length > 0)
  1202. {
  1203. if (downloadFileInfo.FileSize < HPSocketCS.Sdk.FileMD5VerifySize && downloadFileInfo.FileMd5.Trim().Length > 0 && System.IO.File.Exists(saveFileFullName.Trim()))
  1204. {
  1205. string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(saveFileFullName.Trim());
  1206. if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
  1207. {
  1208. ret = true;
  1209. }
  1210. else
  1211. {
  1212. ret = myDownLoadClient.Client.DownloadFiles(serverFileFullName, saveFileFullName.Trim(), backgroundWorker);
  1213. }
  1214. }
  1215. else
  1216. {
  1217. ret = myDownLoadClient.Client.DownloadFiles(serverFileFullName, saveFileFullName.Trim(), backgroundWorker);
  1218. }
  1219. }
  1220. else if (memoryMS != null)
  1221. {
  1222. string TempCachefilePath = TemporaryCachefilesPath + downloadFileInfo.FileMd5 + "_" + System.IO.Path.GetFileName(serverFileFullName);
  1223. byte[] TempCachefileBytes = null;
  1224. bool TempCachefileExists = false;
  1225. try
  1226. {
  1227. if (System.IO.File.Exists(TempCachefilePath))
  1228. {
  1229. TempCachefileBytes= System.IO.File.ReadAllBytes(TempCachefilePath);
  1230. TempCachefileExists = true;
  1231. }
  1232. }
  1233. catch { }
  1234. if (!TempCachefileExists&& downloadFileInfo.FileSize>0)
  1235. {
  1236. MemoryStream recMemoryMS = myDownLoadClient.Client.DownloadMemoryStream(serverFileFullName, backgroundWorker);
  1237. if (recMemoryMS != null)
  1238. {
  1239. try
  1240. {
  1241. if (!System.IO.Directory.Exists(TemporaryCachefilesPath))
  1242. {
  1243. System.IO.Directory.CreateDirectory(TemporaryCachefilesPath);
  1244. }
  1245. recMemoryMS.Position = 0;
  1246. byte[] bytes = new byte[recMemoryMS.Length];
  1247. recMemoryMS.Read(bytes, 0, bytes.Length);
  1248. System.IO.File.WriteAllBytes(TempCachefilePath, bytes);
  1249. Array.Clear(bytes, 0, bytes.Length);
  1250. bytes = null;
  1251. }
  1252. catch { }
  1253. recMemoryMS.WriteTo(memoryMS);
  1254. memoryMS.Position = 0;
  1255. recMemoryMS.Close();
  1256. recMemoryMS.Dispose();
  1257. recMemoryMS = null;
  1258. ret = true;
  1259. }
  1260. }
  1261. else {
  1262. memoryMS.Write(TempCachefileBytes, 0, TempCachefileBytes.Length);
  1263. System.Array.Clear(TempCachefileBytes, 0, TempCachefileBytes.Length);
  1264. TempCachefileBytes = null;
  1265. ret = true;
  1266. }
  1267. }
  1268. else
  1269. {
  1270. return "下载请求错误";
  1271. }
  1272. }
  1273. else
  1274. {
  1275. return downloadFileInfo.GetMsg;
  1276. }
  1277. }
  1278. else
  1279. {
  1280. return "网络连接失败,请检查网络环境";
  1281. }
  1282. if (ret)
  1283. {
  1284. tempMsg = "下载成功";
  1285. }
  1286. else
  1287. {
  1288. tempMsg = "下载失败";
  1289. }
  1290. }
  1291. catch (Exception ex)
  1292. {
  1293. tempMsg = "下载出错:" + ex.Message;
  1294. }
  1295. // finally
  1296. // {
  1297. // isFileServerIng = false;
  1298. // }
  1299. }
  1300. return tempMsg;
  1301. }
  1302. static TCP_NetworkClient tServerClient = null;
  1303. public static TCP_NetworkClient TServerClient
  1304. {
  1305. get
  1306. {
  1307. if (TCP_NetworkClient.tServerClient == null)
  1308. {
  1309. TCP_NetworkClient.tServerClient = new TCP_NetworkClient();
  1310. }
  1311. return TCP_NetworkClient.tServerClient;
  1312. }
  1313. }
  1314. #endregion
  1315. }
  1316. }