ClientThread.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using ErgometerLibrary;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace ErgometerServer
  11. {
  12. class ClientThread
  13. {
  14. TcpClient client;
  15. Server server;
  16. public string name;
  17. public int session { get; }
  18. bool running;
  19. bool loggedin;
  20. public bool personaldatareceived;
  21. List<Meting> metingen;
  22. List<ChatMessage> chat;
  23. public ClientThread(TcpClient client, Server server)
  24. {
  25. this.client = client;
  26. this.server = server;
  27. this.name = "Unknown";
  28. this.session = 0;
  29. this.running = false;
  30. this.loggedin = false;
  31. this.personaldatareceived = false;
  32. metingen = new List<Meting>();
  33. chat = new List<ChatMessage>();
  34. session = FileHandler.GenerateSession();
  35. Console.WriteLine("Generated new session: " + session);
  36. }
  37. public void run()
  38. {
  39. running = true;
  40. NetHelper.SendNetCommand(client, new NetCommand(session));
  41. while (running)
  42. {
  43. NetCommand input = NetHelper.ReadNetCommand(client);
  44. switch(input.Type)
  45. {
  46. case NetCommand.CommandType.SESSION:
  47. break;
  48. case NetCommand.CommandType.LOGIN:
  49. if(! server.CheckPassword(input.DisplayName, input.Password))
  50. {
  51. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.LOGINWRONG, session));
  52. loggedin = false;
  53. }
  54. else
  55. {
  56. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.LOGINOK, session));
  57. loggedin = true;
  58. if (input.IsDoctor)
  59. {
  60. server.ChangeClientToDoctor(client, this);
  61. Console.WriteLine("Doctor connected");
  62. running = false;
  63. }
  64. else
  65. {
  66. name = input.DisplayName;
  67. loggedin = true;
  68. FileHandler.CreateSession(session, name);
  69. }
  70. }
  71. break;
  72. case NetCommand.CommandType.UITLEG:
  73. if (loggedin)
  74. {
  75. server.SendToDoctor(input);
  76. }
  77. break;
  78. case NetCommand.CommandType.PERSONDATA:
  79. if (loggedin)
  80. {
  81. personaldatareceived = true;
  82. FileHandler.SavePersonalData(input);
  83. }
  84. break;
  85. case NetCommand.CommandType.TESTRESULT:
  86. if (loggedin)
  87. {
  88. FileHandler.SaveTestResult(input);
  89. }
  90. break;
  91. case NetCommand.CommandType.DATA:
  92. if (loggedin)
  93. {
  94. metingen.Add(input.Meting);
  95. server.SendToDoctor(input);
  96. }
  97. else
  98. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session));
  99. break;
  100. case NetCommand.CommandType.CHAT:
  101. if (loggedin)
  102. {
  103. chat.Add(new ChatMessage(name, input.ChatMessage, false));
  104. server.SendToDoctor(input);
  105. }
  106. else
  107. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session));
  108. break;
  109. case NetCommand.CommandType.LOGOUT:
  110. loggedin = false;
  111. running = false;
  112. Console.WriteLine(name + " logged out");
  113. FileHandler.WriteMetingen(session, metingen);
  114. FileHandler.WriteChat(session, chat);
  115. client.Close();
  116. server.SendToDoctor(new NetCommand(session, "De client heeft uitgelogd."));
  117. server.RemoveBacklogDisconnectedClient(session);
  118. break;
  119. case NetCommand.CommandType.ERROR:
  120. Console.WriteLine("An error occured, assuming client disconnected");
  121. loggedin = false;
  122. running = false;
  123. Console.WriteLine(name + " logged out due to an error");
  124. FileHandler.WriteMetingen(session, metingen);
  125. FileHandler.WriteChat(session, chat);
  126. client.Close();
  127. break;
  128. default:
  129. if(loggedin)
  130. throw new FormatException("Unknown command");
  131. break;
  132. }
  133. }
  134. server.RemoveActiveSession(this);
  135. }
  136. public void SendToClient(NetCommand command)
  137. {
  138. NetHelper.SendNetCommand(client, command);
  139. if (command.Type == NetCommand.CommandType.CHAT)
  140. {
  141. chat.Add(new ChatMessage("Doctor", command.ChatMessage, true));
  142. }
  143. }
  144. }
  145. }