Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. using Microsoft.Extensions.Logging;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.Eventing.Reader;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Threading.Tasks;
  10. using Prescott.Messages;
  11.  
  12. namespace Prescott
  13. {
  14. public class PrescottTcpClient: IDisposable
  15. {
  16. private Socket _server;
  17. private NetworkStream _networkStream;
  18. private StreamReader _streamReader;
  19. private StreamWriter _streamWriter;
  20. private readonly IPAddress _ipAddress;
  21. private readonly int _port;
  22. private readonly string _username;
  23. private readonly string _password;
  24. private const int Timeout = 120000; // milliseconds
  25.  
  26. private bool _isDisposing = false;
  27. private bool _closeConnection = false;
  28. private long _openSequenceNumber;
  29.  
  30. private readonly ILogger<PrescottTcpClient> _logger;
  31.  
  32. public PrescottTcpClient(IPAddress ipAddress, int port, string username, string password, ILoggerFactory loggerFactory)
  33. {
  34. this._ipAddress = ipAddress;
  35. this._port = port;
  36. this._username = username;
  37. this._password = password;
  38.  
  39. _logger = loggerFactory.CreateLogger<PrescottTcpClient>();
  40. }
  41.  
  42. public void Start()
  43. {
  44. _closeConnection = false;
  45.  
  46. var ipep = new IPEndPoint(_ipAddress, this._port);
  47. _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  48.  
  49. try
  50. {
  51. _logger.LogInformation("Connecting to {1}:{2}", DateTime.Now, _ipAddress, _port);
  52. _server.Connect(ipep);
  53. }
  54. catch (SocketException ex)
  55. {
  56. // TODO Do we want to retry a few times? Failover?
  57. _logger.LogError("Unable to connect to server. Ex {0}", ex.ToString());
  58. return;
  59. }
  60.  
  61. _networkStream = new NetworkStream(_server);
  62. _streamReader = new StreamReader(_networkStream);
  63. _streamWriter = new StreamWriter(_networkStream);
  64.  
  65. Login();
  66. EventLoop();
  67. }
  68.  
  69. private void Login()
  70. {
  71. var login = $"loginmessage";
  72. _streamWriter.WriteLine(login);
  73. _streamWriter.Flush();
  74. _logger.LogTrace(login);
  75. }
  76.  
  77. // If the message ID's skip, we want to request missed messages
  78. private void GetSnapshot(long priorSequenceNumber, long currentSequenceNumber)
  79. {
  80. var snapshot = $"requestMissedMessages";
  81. _streamWriter.WriteLine(snapshot);
  82. _streamWriter.Flush();
  83. _logger.LogInformation(snapshot);
  84. }
  85.  
  86. private void EventLoop()
  87. {
  88. var reconnect = false;
  89.  
  90. try
  91. {
  92. while (!_closeConnection)
  93. {
  94. var data = _streamReader.ReadLineAsync();
  95. var hasMessage = data.Wait(Timeout);
  96.  
  97. if (hasMessage)
  98. {
  99. try
  100. {
  101. var message = Mapper.ToPrescottMessage(data.Result);
  102.  
  103. if (message is Message1)
  104. HandleMessage((Message1)message);
  105. else if (message is Message2)
  106. HandleMessage((Message2)message);
  107. /*
  108. * More message types here
  109. */
  110.  
  111. MessageRecieved?.Invoke(this, message);
  112. }
  113. catch (Exception ex)
  114. {
  115. _logger.LogError(ex.ToString());
  116. }
  117. }
  118. else
  119. {
  120. //Attempt to reconnect, because the timeout was hit.
  121. //TODO Reconnect limit maybe?
  122. _logger.LogInformation("Server did not respond, reconnecting");
  123. _closeConnection = true;
  124. reconnect = true;
  125. }
  126. }
  127. }
  128. catch (Exception ex)
  129. {
  130. //TODO Handle Server force shut downs
  131. _logger.LogError(ex.ToString());
  132. }
  133.  
  134. if (reconnect)
  135. Restart();
  136. }
  137.  
  138. public event EventHandler<MsrbMessage> MessageRecieved;
  139.  
  140. #region Message Handlers
  141.  
  142. private void HandleMessage(Message1 message)
  143. {
  144. // do stuff
  145. }
  146.  
  147. private void HandleMessage(Message2 message)
  148. {
  149. // do stuff
  150. }
  151.  
  152. /*
  153. * 5 or 6 different HandleMessage Methods here, all messages
  154. * inherit from abstract base "message"
  155. */
  156.  
  157. #endregion
  158.  
  159. public void Dispose()
  160. {
  161. if (!_isDisposing)
  162. Close();
  163. }
  164.  
  165. public void Restart()
  166. {
  167. Close();
  168. Start();
  169. }
  170.  
  171. public void Close()
  172. {
  173. _closeConnection = true;
  174.  
  175. //_server?.Shutdown(SocketShutdown.Both); // This might displose the streams and network..
  176. _server?.Dispose();
  177. _streamReader?.Dispose();
  178. _streamWriter?.Dispose();
  179. _networkStream?.Dispose();
  180. }
  181.  
  182. }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement