ClientThread.cs 5.6 KB

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