TCP_NetworkServer.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  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.Management;
  8. using HPSocketCS.Extended;
  9. using System.Runtime.InteropServices;
  10. namespace LYFZ.Network.TCPNetworkServer
  11. {
  12. /// <summary>
  13. /// TCP网络通信服务端
  14. /// </summary>
  15. public class TCP_NetworkServer
  16. {
  17. public TCP_NetworkServer() {
  18. }
  19. #region 网络程序处理代码
  20. private AppState appState = AppState.Stoped;
  21. public HPSocketCS.TcpPackServer hp_Server = new HPSocketCS.TcpPackServer();
  22. /// <summary>
  23. /// 启动网络
  24. /// </summary>
  25. /// <param name="ip"></param>
  26. /// <param name="port"></param>
  27. public void StartRun(string ip="0.0.0.0",ushort port=8500)
  28. {
  29. try
  30. {
  31. if (!this.isInitializesNetwork)
  32. {
  33. this.InitializesNetwork();
  34. }
  35. ServerStartTimeStamp = DateTime.Now.ToString("yyyyMMddHHmmsss");
  36. // 写在这个位置是上面可能会异常
  37. SetAppState(AppState.Starting);
  38. hp_Server.IpAddress = ip;
  39. hp_Server.Port = port;
  40. // 启动服务
  41. if (hp_Server.Start())
  42. {
  43. SetAppState(AppState.Started);
  44. //AddMsg(string.Format("启动服务OK -> ({0}:{1})", ip, port));
  45. LYFZ.BLL.PhotoBackupHandling.SetUseEmbeddedColorManagement();
  46. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器网络启动成功 IP:" + ip+":"+port.ToString());
  47. }
  48. else
  49. {
  50. SetAppState(AppState.Stoped);
  51. throw new Exception(string.Format("$绑定套接字失败(套接字绑定),可能是端口“"+port.ToString()+"”被占用 -> {0}({1})", hp_Server.ErrorMessage, hp_Server.ErrorCode));
  52. }
  53. }
  54. catch (Exception ex)
  55. {
  56. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器网络启动失败:" + ex.Message);
  57. }
  58. }
  59. public void StopRun()
  60. {
  61. try
  62. {
  63. if (this.IsInitializesNetwork)
  64. {
  65. SetAppState(AppState.Stoping);
  66. // 停止服务
  67. // AddMsg("$停止服务");
  68. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器网络停止服务");
  69. if (hp_Server.Stop())
  70. {
  71. SetAppState(AppState.Stoped);
  72. }
  73. else
  74. {
  75. // AddMsg(string.Format("$停止服务出错-> {0}({1})", server.ErrorMessage, server.ErrorCode));
  76. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器网络停止服务时出错:" + hp_Server.ErrorMessage + "(" + hp_Server.ErrorCode + ")");
  77. }
  78. }
  79. }
  80. catch { }
  81. }
  82. bool isInitializesNetwork = false;
  83. /// <summary>
  84. /// 网络服务是否已初始化
  85. /// </summary>
  86. public bool IsInitializesNetwork
  87. {
  88. get { return isInitializesNetwork; }
  89. set { isInitializesNetwork = value; }
  90. }
  91. /// <summary>
  92. /// 初始化网络
  93. /// </summary>
  94. void InitializesNetwork()
  95. {
  96. try
  97. {
  98. // 设置服务器事件
  99. hp_Server.OnPrepareListen += new HPSocketCS.TcpServerEvent.OnPrepareListenEventHandler(OnPrepareListen);
  100. hp_Server.OnAccept += new HPSocketCS.TcpServerEvent.OnAcceptEventHandler(OnAccept);
  101. hp_Server.OnSend += new HPSocketCS.TcpServerEvent.OnSendEventHandler(OnSend);
  102. hp_Server.OnReceive += new HPSocketCS.TcpServerEvent.OnReceiveEventHandler(OnReceive);
  103. hp_Server.OnClose += new HPSocketCS.TcpServerEvent.OnCloseEventHandler(OnClose);
  104. hp_Server.OnShutdown += new HPSocketCS.TcpServerEvent.OnShutdownEventHandler(OnShutdown);
  105. // 设置包头标识,与对端设置保证一致性
  106. hp_Server.PackHeaderFlag = 0x1ff;
  107. // 设置最大封包大小
  108. hp_Server.MaxPackSize = 0x2000 * 32;
  109. hp_Server.SocketBufferSize = 512 * 1024;//hp_Server.MaxPackSize;
  110. this.isInitializesNetwork = true;
  111. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器初始化网络成功");
  112. SetAppState(AppState.Stoped);
  113. }
  114. catch (Exception ex)
  115. {
  116. SetAppState(AppState.Error);
  117. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器初始化网络时出错:"+ex.Message);
  118. }
  119. }
  120. /// <summary>
  121. /// 准备监听了事件
  122. /// </summary>
  123. /// <param name="soListen"></param>
  124. /// <returns></returns>
  125. HPSocketCS.HandleResult OnPrepareListen(IntPtr soListen)
  126. {
  127. // 监听事件到达了,一般没什么用吧?
  128. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器已成功开始网络侦听...");
  129. return HPSocketCS.HandleResult.Ok;
  130. }
  131. /// <summary>
  132. /// 连接到达事件
  133. /// </summary>
  134. /// <param name="connId"></param>
  135. /// <param name="pClient"></param>
  136. /// <returns></returns>
  137. HPSocketCS.HandleResult OnAccept(IntPtr connId, IntPtr pClient)
  138. {
  139. // 客户进入了
  140. // 获取客户端ip和端口
  141. string ip = string.Empty;
  142. ushort port = 0;
  143. if (hp_Server.GetRemoteAddress(connId, ref ip, ref port))
  144. {
  145. //AddMsg(string.Format(" > [{0},OnAccept] -> PASS[通过]收接连接请求({1}:{2})", connId, ip.ToString(), port));
  146. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("收接连接请求:" + ip+":"+port.ToString());
  147. }
  148. else
  149. {
  150. // AddMsg(string.Format(" > [{0},OnAccept] -> Server_GetClientAddress() Error 获取某个连接的远程ip和端口时出错", connId));
  151. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("获取某个连接的ip和端口时出错");
  152. return HPSocketCS.HandleResult.Error;
  153. }
  154. // 设置附加数据
  155. HPSocketCS.Extended.ClientInfo ci = new HPSocketCS.Extended.ClientInfo();
  156. ci.ConnId = connId;
  157. ci.IpAddress = ip;
  158. ci.Port = port;
  159. if (hp_Server.SetConnectionExtra(connId, ci) == false)
  160. {
  161. //AddMsg(string.Format(" > [{0},OnAccept] -> 设置连接的附加数据失败", connId));
  162. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("设置连接的附加数据失败,IP地址为 " + ip + ":" + port.ToString());
  163. return HPSocketCS.HandleResult.Error;
  164. }
  165. return HPSocketCS.HandleResult.Ok;
  166. }
  167. /// <summary>
  168. /// 数据包发送事件
  169. /// </summary>
  170. /// <param name="connId"></param>
  171. /// <param name="bytes"></param>
  172. /// <returns></returns>
  173. HPSocketCS.HandleResult OnSend(IntPtr connId, byte[] bytes)
  174. {
  175. // 服务器发数据了
  176. //AddMsg(string.Format(" > [{0},OnSend] -> ({1} bytes)", connId, bytes.Length));
  177. return HPSocketCS.HandleResult.Ok;
  178. }
  179. /// <summary>
  180. /// 数据到达
  181. /// </summary>
  182. /// <param name="connId"></param>
  183. /// <param name="bytes"></param>
  184. /// <returns></returns>
  185. HPSocketCS.HandleResult OnReceive(IntPtr connId, byte[] bytes)
  186. {
  187. // 数据到达了
  188. try
  189. {
  190. bool retProcessed = true;//处理情况
  191. //收到的数据
  192. byte[] receiveBytes = new byte[0];
  193. TcpHeadInfo header = hp_Server.BytesToStruct<TcpHeadInfo>(bytes);
  194. DataType dType = (DataType)header.MsgDataType;
  195. int headSize = Marshal.SizeOf(header);
  196. TcpTailInfo tail = new TcpTailInfo();
  197. if (header.IsTail)
  198. {
  199. //有附加尾数据时
  200. int tailSize = Marshal.SizeOf(tail);
  201. byte[] tailBytes = new byte[tailSize];
  202. Array.ConstrainedCopy(bytes, bytes.Length - tailSize, tailBytes, 0, tailBytes.Length);
  203. tail = hp_Server.BytesToStruct<TcpTailInfo>(tailBytes);
  204. receiveBytes = new byte[bytes.Length - headSize - tailSize];
  205. Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
  206. tailBytes = null;
  207. }
  208. else
  209. {
  210. // 因为没有附加尾数据,所以大小可以用length - objSize
  211. receiveBytes = new byte[bytes.Length - headSize];
  212. Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
  213. }
  214. bytes = null;
  215. //接收到的客户端发送来的数据
  216. byte[] recbytes = null;
  217. try
  218. {
  219. if (header.TransportStart && header.TransportEnd)
  220. {
  221. recbytes = receiveBytes;
  222. receiveBytes = null;
  223. }
  224. else
  225. {
  226. ReceiveData rData = hp_Server.SCommonLibrary.GetReceiveData(header);
  227. if (rData == null)
  228. {
  229. rData = new ReceiveData();
  230. hp_Server.SCommonLibrary.AddReceiveData(rData);
  231. }
  232. rData.ReceiveRemoteClientInfo = header;
  233. rData.ReceiveDataMstream.Write(receiveBytes, 0, receiveBytes.Length);
  234. if (header.TransportEnd)
  235. {
  236. rData.ReceiveDataMstream.Position = 0;
  237. //recbytes = rData.ReceiveDataMstream.ToArray();
  238. recbytes = new byte[rData.ReceiveDataMstream.Length];
  239. rData.ReceiveDataMstream.Read(recbytes, 0, recbytes.Length);
  240. hp_Server.SCommonLibrary.RemoveReceiveDataData(rData);
  241. }
  242. }
  243. if (recbytes != null)
  244. {
  245. recbytes = HPSocketCS.Extended.DataSetSerializerDeserialize.DataDecompressRetBytes(recbytes);
  246. switch (dType)
  247. {
  248. case DataType.Text:
  249. retProcessed = this.DataTypeTextProcessed(header, connId, recbytes);
  250. break;
  251. case DataType.File:
  252. // string ReceiveInfo = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
  253. FileRequestType RequestType = (FileRequestType)tail.RequestType;
  254. switch (RequestType)
  255. {
  256. case FileRequestType.Upload:
  257. //接收文件
  258. retProcessed = hp_Server.ReceiveFileToServerRootDirectory(header, tail, recbytes);
  259. break;
  260. case FileRequestType.Download:
  261. //发送文件
  262. retProcessed = hp_Server.SenFileToClient(header, tail, connId);
  263. break;
  264. }
  265. break;
  266. case DataType.SQLHelper:
  267. NetworkSQLHelper.SQLHelperDataRequestProcessed(hp_Server, header, connId, recbytes);
  268. break;
  269. case DataType.Serialization:
  270. SerializationRequestProcessed.SerializationDataRequestProcessed(hp_Server, header, connId, recbytes);
  271. break;
  272. case DataType.List:
  273. break;
  274. case DataType.Array:
  275. break;
  276. case DataType.None:
  277. break;
  278. }
  279. }
  280. }
  281. finally
  282. {
  283. try
  284. {
  285. System.Array.Clear(recbytes, 0, recbytes.Length);
  286. }
  287. catch { }
  288. recbytes = null;
  289. }
  290. /* if (hp_Server.Send(connId, bytes, bytes.Length))
  291. {
  292. return HPSocketCS.HandleResult.Ok;
  293. }*/
  294. if (retProcessed)
  295. {
  296. return HPSocketCS.HandleResult.Ok;
  297. }
  298. else
  299. {
  300. //return HandleResult.Error;
  301. return HPSocketCS.HandleResult.Ignore;
  302. }
  303. }
  304. catch (Exception ex)
  305. {
  306. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("接收数据时出错:" + ex.Message);
  307. return HPSocketCS.HandleResult.Ignore;
  308. }
  309. finally
  310. {
  311. System.GC.Collect();
  312. }
  313. }
  314. /// <summary>
  315. /// 连接关闭事件
  316. /// </summary>
  317. /// <param name="connId"></param>
  318. /// <param name="enOperation"></param>
  319. /// <param name="errorCode"></param>
  320. /// <returns></returns>
  321. HPSocketCS.HandleResult OnClose(IntPtr connId, HPSocketCS.SocketOperation enOperation, int errorCode)
  322. {
  323. hp_Server.SCommonLibrary.ClearInvalidConnectionResource(connId);
  324. if (hp_Server.SetConnectionExtra(connId, null) == false)
  325. {
  326. // AddMsg(string.Format(" > [{0},OnClose] -> SetConnectionExtra({0}, null) 设置连接的附加数据失败", connId));
  327. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("清除连接的附加数据失败:" + errorCode);
  328. }
  329. TCPNetworkServer.TCP_NetworkServer.AddOrSetClientList(new TCP_ClientConnectInfo(connId.ToInt32(), false));
  330. if (errorCode == 0)
  331. {
  332. // AddMsg(string.Format(" > [{0},OnClose] -> 连接关闭事件", connId));
  333. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("连接关闭:" + connId);
  334. }
  335. else if (enOperation == HPSocketCS.SocketOperation.Close)
  336. {
  337. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端已关闭连接 > [{0},OnError] -> OP:{1},CODE:{2}", connId, enOperation, errorCode));
  338. }
  339. else
  340. {
  341. LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("连接出错 > [{0},OnError] -> OP:{1},CODE:{2}", connId, enOperation, errorCode));
  342. // AddMsg(string.Format(" > [{0},OnError] -> OP:{1},错误码:{2}", connId, enOperation, errorCode));
  343. // return HPSocketSdk.HandleResult.Ok;
  344. return HPSocketCS.HandleResult.Error;
  345. }
  346. ClientRequestObject requestObject = new ClientRequestObject();
  347. try
  348. {
  349. requestObject.ConnID = connId.ToInt32();
  350. TCP_RemoteDataHandlerPassiveMode.RemoveGenerateThumbnailsRequest(requestObject);
  351. }
  352. catch { }
  353. finally {
  354. requestObject = null;
  355. }
  356. return HPSocketCS.HandleResult.Ok;
  357. }
  358. /// <summary>
  359. /// 服务器关闭事件
  360. /// </summary>
  361. /// <returns></returns>
  362. HPSocketCS.HandleResult OnShutdown()
  363. {
  364. // 服务关闭了
  365. hp_Server.SCommonLibrary.ClearAllInvalidResource();
  366. //AddMsg(" > [OnShutdown] -> 服务器关闭事件");
  367. return HPSocketCS.HandleResult.Ok;
  368. }
  369. /// <summary>
  370. /// 设置程序状态
  371. /// </summary>
  372. /// <param name="state"></param>
  373. void SetAppState(AppState state)
  374. {
  375. appState = state;
  376. }
  377. /// <summary>
  378. /// 服务器端接收客户端发送的文本数据请求并处理返回结果
  379. /// </summary>
  380. /// <param name="header">协议头</param>
  381. /// <param name="connId">连接ID</param>
  382. /// <param name="bytes">收到的数据</param>
  383. public bool DataTypeTextProcessed(TcpHeadInfo header, IntPtr connId, byte[] bytes)
  384. {
  385. bool ret = false;
  386. TCP_RemoteDataHandlerPassiveMode RDHandler = new TCP_RemoteDataHandlerPassiveMode();
  387. TransferRequestCommand Command = (TransferRequestCommand)Convert.ToInt32(header.RequestCommand);
  388. try
  389. {
  390. string ReceiveInfo = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
  391. TCP_ProtocolHelperXML pXml = new TCP_ProtocolHelperXML(ReceiveInfo);
  392. TCP_FileProtocol returnProtocol = new TCP_FileProtocol();
  393. TCP_FileProtocol recprotocol = pXml.GetProtocol();
  394. TCP_ClientConnectInfo cInfo = new TCP_ClientConnectInfo(connId.ToInt32(), header);
  395. recprotocol.ClientInfo = cInfo.ToString();
  396. try
  397. {
  398. // LYFZ.BLL.BLL_FileLogs.WriteMainLogs(String.Format("接收到命令请求{0},参数{1}", Command.ToString(), recprotocol.Content));
  399. switch (Command)
  400. {
  401. case TransferRequestCommand.Message:
  402. returnProtocol = new TCP_FileProtocol("服务器已接收到:" + recprotocol.Content + "...");
  403. break;
  404. case TransferRequestCommand.MainStoreTestInfo:
  405. returnProtocol = RDHandler.GetMainStoreTestInfo(recprotocol);
  406. break;
  407. case TransferRequestCommand.DeleteFile:
  408. returnProtocol = RDHandler.DeleteFile(recprotocol);
  409. break;
  410. case TransferRequestCommand.GeTFileList:
  411. returnProtocol = RDHandler.GeTFileList(recprotocol);
  412. break;
  413. case TransferRequestCommand.GetDirectoryList:
  414. returnProtocol = RDHandler.GetDirectoryList(recprotocol);
  415. break;
  416. case TransferRequestCommand.DeleteDirectory:
  417. returnProtocol = RDHandler.DeleteDirectory(recprotocol);
  418. break;
  419. case TransferRequestCommand.GetFileInfo:
  420. returnProtocol = RDHandler.GetFileInfo(recprotocol);
  421. break;
  422. case TransferRequestCommand.GetSavePath:
  423. returnProtocol = RDHandler.GetSavePath(recprotocol);
  424. break;
  425. case TransferRequestCommand.GetDataConne:
  426. returnProtocol = RDHandler.GetDataConne(recprotocol);
  427. break;
  428. case TransferRequestCommand.GetServerSoftwareInfo:
  429. try
  430. {
  431. if (this.EventClientLockVerified != null)
  432. {
  433. EventLockVerified eventObj = new EventLockVerified();
  434. eventObj.CInfo = hp_Server.GetClientInfo(connId);
  435. this.EventClientLockVerified(eventObj);
  436. }
  437. }
  438. catch { }
  439. returnProtocol = RDHandler.GetServerSoftwareInfo(recprotocol);
  440. break;
  441. case TransferRequestCommand.GetSavePhotoPathList:
  442. returnProtocol = RDHandler.GetSavePhotoPathList(recprotocol);
  443. break;
  444. case TransferRequestCommand.ServerDateTime:
  445. returnProtocol = RDHandler.GetServerDateTime(recprotocol);
  446. break;
  447. case TransferRequestCommand.GenerateThumbnails:
  448. returnProtocol = RDHandler.StartGenerateThumbnails(recprotocol);
  449. break;
  450. case TransferRequestCommand.DeleteOriginalPhoto:
  451. returnProtocol = RDHandler.DeleteOriginalPhoto(recprotocol);
  452. break;
  453. case TransferRequestCommand.DeleteBackupPhoto:
  454. returnProtocol = RDHandler.DeleteBackupPhoto(recprotocol);
  455. break;
  456. case TransferRequestCommand.GetClientList:
  457. returnProtocol = RDHandler.GetClientList(recprotocol);
  458. break;
  459. case TransferRequestCommand.RefreshClientList:
  460. returnProtocol = RDHandler.RefreshClientList(recprotocol);
  461. break;
  462. case TransferRequestCommand.GetBigData:
  463. returnProtocol = RDHandler.GetBigData(recprotocol);
  464. break;
  465. case TransferRequestCommand.VitalControl:
  466. returnProtocol = RDHandler.RunVitalControl(recprotocol);
  467. break;
  468. case TransferRequestCommand.GetBackupRecords:
  469. returnProtocol = RDHandler.GetBackupRecords(recprotocol);
  470. break;
  471. case TransferRequestCommand.GetMainShopBackupRecords:
  472. returnProtocol = RDHandler.GetMainShopBackupRecords(recprotocol);
  473. break;
  474. case TransferRequestCommand.LockPickPhotoOrder:
  475. returnProtocol = RDHandler.LockPickPhotoOrder(recprotocol);
  476. break;
  477. default:
  478. returnProtocol = new TCP_FileProtocol("非法指令,服务器拒绝执行...");
  479. break;
  480. }
  481. }
  482. catch (Exception ex)
  483. {
  484. returnProtocol = new TCP_FileProtocol("网络请求处理失败,原因:" + ex.Message);
  485. }
  486. // LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器端返回信息:" + returnProtocol.Content.Trim());
  487. byte[] sendBytes = null;
  488. if (returnProtocol.InfoType == EnumerateLibrary.InformationType.Data)
  489. {
  490. sendBytes = returnProtocol.DataArray;
  491. }
  492. else {
  493. sendBytes = Encoding.UTF8.GetBytes(returnProtocol.ToString());
  494. }
  495. ret = hp_Server.AutoUnpackingAndSend(connId, sendBytes, header.TransportID, DataType.Text, Command);
  496. RDHandler = null;
  497. System.GC.Collect();
  498. }
  499. catch(Exception ex) {
  500. try
  501. {
  502. LYFZ.BLL.BLL_FileLogs.WriteMainLogs("服务器处理客户端请求时出错:" + ex.Message);
  503. byte[] sendBytes = Encoding.UTF8.GetBytes(new TCP_FileProtocol("服务器处理客户端请求时出错:" + ex.Message).ToString());
  504. ret = hp_Server.AutoUnpackingAndSend(connId, sendBytes, header.TransportID, DataType.Text, Command);
  505. RDHandler = null;
  506. }
  507. catch {
  508. }
  509. }
  510. return ret;
  511. }
  512. static List<TCP_ClientConnectInfo> _ClientConnList = new List<TCP_ClientConnectInfo>();
  513. /// <summary>
  514. /// 获取客户端连接集合 用于管理客户端成功连接座席数
  515. /// </summary>
  516. public static List<TCP_ClientConnectInfo> ClientConnList
  517. {
  518. get { return _ClientConnList; }
  519. }
  520. /// <summary>
  521. /// 添加和设置客户端连接
  522. /// </summary>
  523. /// <param name="connInfo"></param>
  524. /// <param name="isRefresh">是否为刷新客户端连接,刷新客户端时不做客户端添加(一搬用于已满座席时)</param>
  525. public static void AddOrSetClientList(TCP_ClientConnectInfo connInfo, bool isRefresh = false)
  526. {
  527. if (connInfo.HostIdentity.Trim().ToLower() == "ServerHosts".ToLower())
  528. {
  529. return;
  530. }
  531. lock (ClientConnList)
  532. {
  533. bool isConnInfo = false;
  534. connInfo.ConnectionTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  535. foreach (TCP_ClientConnectInfo cinfo in ClientConnList)
  536. {
  537. try
  538. {
  539. if (cinfo.ConnId == connInfo.ConnId)
  540. {
  541. cinfo.ConnStatus = connInfo.ConnStatus;
  542. cinfo.ConnectionTime = connInfo.ConnectionTime;
  543. }
  544. }
  545. catch { }
  546. try
  547. {
  548. if (connInfo.ConnStatus && cinfo.HostIdentity.Trim().Length > 0)
  549. {
  550. if (cinfo.HostIdentity.Trim().ToLower() == connInfo.HostIdentity.Trim().ToLower())
  551. {
  552. cinfo.ConnId = connInfo.ConnId;
  553. cinfo.ConnStatus = connInfo.ConnStatus;
  554. cinfo.ConnectionTime = connInfo.ConnectionTime;
  555. cinfo.IP = connInfo.IP;
  556. cinfo.Port = connInfo.Port;
  557. cinfo.LoginUsername = connInfo.LoginUsername;
  558. isConnInfo = true;
  559. break;
  560. }
  561. }
  562. }
  563. catch { }
  564. }
  565. if (!isConnInfo && connInfo.ConnStatus && !isRefresh)
  566. {
  567. ClientConnList.Add(connInfo);
  568. }
  569. }
  570. }
  571. static string _ServerStartTimeStamp = "";
  572. /// <summary>
  573. /// 服务器启动时间标识
  574. /// </summary>
  575. public static string ServerStartTimeStamp
  576. {
  577. get { return TCP_NetworkServer._ServerStartTimeStamp; }
  578. set { TCP_NetworkServer._ServerStartTimeStamp = value; }
  579. }
  580. /// <summary>
  581. /// 申明委托
  582. /// </summary>
  583. /// <param name="e"></param>
  584. /// <returns></returns>
  585. public delegate void EventLockVerifiedHandler(EventLockVerified e);
  586. /// <summary>
  587. /// EventClientLockVerified事件
  588. /// </summary>
  589. public event EventLockVerifiedHandler EventClientLockVerified;
  590. #endregion
  591. }
  592. /// <summary>
  593. /// EventLockVerified 客户端连接事件对象
  594. /// </summary>
  595. public class EventLockVerified : EventArgs
  596. {
  597. public EventLockVerified()
  598. {
  599. }
  600. HPSocketCS.Extended.ClientInfo _CInfo;
  601. /// <summary>
  602. /// 客户端信息
  603. /// </summary>
  604. public HPSocketCS.Extended.ClientInfo CInfo
  605. {
  606. get { return _CInfo; }
  607. set { _CInfo = value; }
  608. }
  609. }
  610. }