JetMessageTcpClient.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using DocumentFormat.OpenXml.Spreadsheet;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace MECF.Framework.Common.Net
  9. {
  10. public class JetMessageTcpClient<TNetMessage,T> : JetTcpClient where TNetMessage : INetMessage<T>,new () where T:new ()
  11. {
  12. #region 内部变量
  13. private object _locker = new object();
  14. private int _lockTimeout = 1000;
  15. private TNetMessage _netMessage;
  16. #endregion
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="ip"></param>
  21. /// <param name="port"></param>
  22. public JetMessageTcpClient(string ip, int port) : base(ip, port)
  23. {
  24. _netMessage = new TNetMessage();
  25. }
  26. /// <summary>
  27. /// 申请数据
  28. /// </summary>
  29. /// <typeparam name="T">申请指令类型</typeparam>
  30. /// <param name="data">指令对象</param>
  31. /// <returns>返回数据对象</returns>
  32. public NetResult<T> ApplyData(T data)
  33. {
  34. if(Monitor.TryEnter(_locker,_lockTimeout))
  35. {
  36. NetResult result = ReadFromServer(data);
  37. if(!result.IsSuccess)
  38. {
  39. Monitor.Exit(_locker);
  40. return NetResult.CreateFailedResult<T>(result.ErrorCode, result.Message);
  41. }
  42. Monitor.Exit(_locker);
  43. return NetResult.CreateSuccessResult<T>(_netMessage.Decode());
  44. }
  45. else
  46. {
  47. return NetResult.CreateFailedResult<T>(NetErrorCode.GetLockTimeout);
  48. }
  49. }
  50. /// <summary>
  51. /// 设置数据
  52. /// </summary>
  53. /// <typeparam name="T"></typeparam>
  54. /// <param name="data"></param>
  55. /// <returns></returns>
  56. public NetResult SetData(T data)
  57. {
  58. if (Monitor.TryEnter(_locker, _lockTimeout))
  59. {
  60. NetResult result = ReadFromServer(data);
  61. if (!result.IsSuccess)
  62. {
  63. Monitor.Exit(_locker);
  64. return NetResult.CreateFailedResult(result.ErrorCode, result.Message);
  65. }
  66. bool confirmResult = _netMessage.ConfirmResponseResult();
  67. if(!confirmResult)
  68. {
  69. Monitor.Exit(_locker);
  70. return NetResult.CreateFailedResult(_netMessage.ErrorCode, _netMessage.ErrorMsg);
  71. }
  72. Monitor.Exit(_locker);
  73. return NetResult.CreateSuccessResult();
  74. }
  75. else
  76. {
  77. return NetResult.CreateFailedResult(NetErrorCode.GetLockTimeout);
  78. }
  79. }
  80. /// <summary>
  81. /// 从服务端读取数据
  82. /// </summary>
  83. /// <typeparam name="T"></typeparam>
  84. /// <param name="data"></param>
  85. /// <returns></returns>
  86. private NetResult ReadFromServer(T data)
  87. {
  88. byte[] buffer = _netMessage.Code(data);
  89. NetResult sendResult = Send(buffer);
  90. if (!sendResult.IsSuccess)
  91. {
  92. return NetResult.CreateFailedResult(sendResult.ErrorCode, sendResult.Message);
  93. }
  94. _netMessage.SendBytes = buffer;
  95. NetResult<byte[]> headerResult = Receive(_netMessage.ProtocolHeadBytesLength);
  96. if (!headerResult.IsSuccess)
  97. {
  98. return NetResult.CreateFailedResult(headerResult.ErrorCode, headerResult.Message);
  99. }
  100. _netMessage.HeadBytes = headerResult.Data;
  101. if (!_netMessage.CheckHeadBytesLegal())
  102. {
  103. return NetResult.CreateFailedResult(NetErrorCode.InvalidHeader);
  104. }
  105. int contentLength = _netMessage.GetContentLengthByHeadBytes();
  106. if (contentLength !=0)
  107. {
  108. NetResult<byte[]> contentResult = Receive(contentLength);
  109. if (!contentResult.IsSuccess)
  110. {
  111. return NetResult.CreateFailedResult(contentResult.ErrorCode, contentResult.Message);
  112. }
  113. _netMessage.ContentBytes = contentResult.Data;
  114. bool dataValid = _netMessage.CheckDataLegal();
  115. if (!dataValid)
  116. {
  117. return NetResult.CreateFailedResult(_netMessage.ErrorCode, _netMessage.ErrorMsg);
  118. }
  119. }
  120. return NetResult.CreateSuccessResult();
  121. }
  122. }
  123. }