ClientThread.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.DATA:
  71. if (loggedin)
  72. {
  73. metingen.Add(input.Meting);
  74. server.SendToDoctor(input);
  75. }
  76. else
  77. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session));
  78. break;
  79. case NetCommand.CommandType.CHAT:
  80. if (loggedin)
  81. {
  82. chat.Add(new ChatMessage(name, input.ChatMessage, false));
  83. server.SendToDoctor(input);
  84. }
  85. else
  86. NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session));
  87. break;
  88. case NetCommand.CommandType.LOGOUT:
  89. loggedin = false;
  90. running = false;
  91. Console.WriteLine(name + " logged out");
  92. FileHandler.WriteMetingen(session, metingen);
  93. FileHandler.WriteChat(session, chat);
  94. client.Close();
  95. break;
  96. case NetCommand.CommandType.ERROR:
  97. Console.WriteLine("An error occured, assuming client disconnected");
  98. loggedin = false;
  99. running = false;
  100. Console.WriteLine(name + " logged out due to an error");
  101. FileHandler.WriteMetingen(session, metingen);
  102. FileHandler.WriteChat(session, chat);
  103. client.Close();
  104. break;
  105. default:
  106. if(loggedin)
  107. throw new FormatException("Unknown command");
  108. break;
  109. }
  110. }
  111. server.RemoveActiveSession(this);
  112. }
  113. public void SendToClient(NetCommand command)
  114. {
  115. NetHelper.SendNetCommand(client, command);
  116. if (command.Type == NetCommand.CommandType.CHAT)
  117. {
  118. chat.Add(new ChatMessage("Doctor", command.ChatMessage, true));
  119. }
  120. }
  121. }
  122. }