WebSocketClient.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using System.Threading.Tasks;
  3. using WebSocketSharp;
  4. using Socket = WebSocketSharp.WebSocket;
  5. using Logger = InABox.Core.Logger;
  6. using InABox.Core;
  7. using InABox.Clients;
  8. using InABox.WebSocket.Shared;
  9. namespace InABox.Client.WebSocket
  10. {
  11. public class WebSocketClient : IDisposable
  12. {
  13. private Socket Socket;
  14. private Guid Session;
  15. private bool Closed = false;
  16. public WebSocketClient(string url, int port, Guid session)
  17. {
  18. Session = session;
  19. Uri uri = new Uri("http://" + url);
  20. Socket = new Socket($"ws://{uri.Host}:{port}/push");
  21. Socket.OnOpen += Socket_OnOpen;
  22. Socket.OnError += Socket_OnError;
  23. Socket.OnClose += Socket_OnClose;
  24. Socket.OnMessage += Socket_OnMessage;
  25. Socket.Connect();
  26. // Time to wait before disconnect - the default meant that the client disconnected during debugging, since the ping would fail
  27. Socket.WaitTime = TimeSpan.FromMinutes(10);
  28. }
  29. private void Socket_OnMessage(object? sender, MessageEventArgs e)
  30. {
  31. var message = SocketMessage.ReadMessage(e.RawData);
  32. if(message is PushMessage pushMessage)
  33. {
  34. var pushType = CoreUtils.GetEntity(pushMessage.EntityType);
  35. var pushObject = Serialization.Deserialize(pushType, pushMessage.EntityData);
  36. ClientFactory.PushHandlers.Push(pushType, pushObject);
  37. }
  38. else if(message is InitialMessage)
  39. {
  40. }
  41. }
  42. private void Socket_OnOpen(object? sender, EventArgs e)
  43. {
  44. Logger.Send(LogType.Information, "", "WebSocket connected to server");
  45. var initial = new InitialMessage(Session, ClientFactory.Platform);
  46. Socket.Send(initial.WriteToBytes());
  47. }
  48. private void Socket_OnClose(object? sender, CloseEventArgs e)
  49. {
  50. Logger.Send(LogType.Information, "", "WebSocket disconnected from server");
  51. if (!Closed)
  52. {
  53. Task.Run(() =>
  54. {
  55. if (!Socket.IsAlive)
  56. {
  57. Task.Delay(30_000).Wait(); // Try to reconnect after 30 seconds
  58. Socket.Connect();
  59. }
  60. });
  61. }
  62. }
  63. private void Socket_OnError(object? sender, ErrorEventArgs e)
  64. {
  65. Logger.Send(LogType.Error, "", $"WebSocket Error: {e.Message}");
  66. }
  67. public void Dispose()
  68. {
  69. Closed = true;
  70. if (Socket.IsAlive)
  71. {
  72. Socket.Close();
  73. }
  74. }
  75. }
  76. }