AppGlobal.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. using Newtonsoft.Json;
  2. using FietsLibrary.JSONObjecten;
  3. using FietsLibrary;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Net.Security;
  13. using System.IO;
  14. using System.Security.Authentication;
  15. namespace ServerV2
  16. {
  17. class AppGlobal
  18. {
  19. public TcpListener listener { get; private set; }
  20. public List<Client> clients { get; private set; } = new List<Client>();
  21. public List<User> users { get; private set; } = new List<User>();
  22. public AppGlobal()
  23. {
  24. listener = new TcpListener(IPAddress.Any, 1288);
  25. listener.Start();
  26. string dir = @"JSON Files";
  27. string filename = @"UserData.Json";
  28. if(!Directory.Exists(dir))
  29. {
  30. Directory.CreateDirectory(dir);
  31. }
  32. if (!File.Exists(dir + @"\" + filename))
  33. {
  34. TestMethode();
  35. saveData2Json();
  36. }
  37. else
  38. {
  39. readDataFromJson();
  40. }
  41. while (true)
  42. {
  43. Console.WriteLine(FietsLibrary.JsonConverter.GetUserSessions(users.ElementAt(1)));
  44. Console.WriteLine("waiting for clients...");
  45. TcpClient client = listener.AcceptTcpClient();
  46. Console.WriteLine("connection received");
  47. new Thread(receive).Start(client);
  48. }
  49. }
  50. private void TestMethode()
  51. {
  52. users.Add(new User("JK123", "jancoow", 5, true, 100));
  53. users.Add(new User("patient", "patient", 0, false, 0));
  54. users.Add(new User("doctor", "doctor", 0, false, 0, true));
  55. users.Add(new User("admin", "admin", 80, false, 77, true));
  56. Random r = new Random();
  57. Session session = new Session(1);
  58. for (int i = 0; i < 20; i++)
  59. session.AddMeasurement(new Measurement(r.Next(100, 200), r.Next(60, 100), r.Next(100, 150), i, r.Next(100), r.Next(100), r.Next(100), i));
  60. users.ElementAt(1).sessions.Add(session);
  61. Session session2 = new Session(2);
  62. for (int i = 0; i < 50; i++)
  63. session2.AddMeasurement(new Measurement(r.Next(100, 200), r.Next(60, 100), r.Next(100, 150), i, r.Next(100), r.Next(100), r.Next(100), i));
  64. users.ElementAt(1).sessions.Add(session2);
  65. }
  66. private SslStream InitialiseConnection(TcpClient client)
  67. {
  68. SslStream sslStream = new SslStream(client.GetStream());
  69. try
  70. {
  71. sslStream.AuthenticateAsServer(SSLCrypto.LoadCert(), false, SslProtocols.Default, false);
  72. }
  73. catch (IOException e)
  74. {
  75. Console.WriteLine("IOExeption occured while a client tried to connect.");
  76. Console.WriteLine(e.StackTrace);
  77. //Stop();
  78. }
  79. Console.WriteLine("New client connected");
  80. return sslStream;
  81. }
  82. //Save data to UserData.Json
  83. private void saveData2Json()
  84. {
  85. File.WriteAllText(@"JSON Files\UserData.Json", JsonConvert.SerializeObject(users));
  86. }
  87. private void readDataFromJson()
  88. {
  89. //Read UserDate file
  90. string s = File.ReadAllText(@"JSON Files\UserData.Json");
  91. dynamic results = JsonConvert.DeserializeObject<dynamic>(s);
  92. //Clear list
  93. users = new List<User>();
  94. foreach (dynamic r in results)
  95. {
  96. users.Add(new User(r.id.ToString(), r.password.ToString(), Int32.Parse(r.age.ToString()),
  97. Boolean.Parse(r.gender.ToString()), Int32.Parse(r.weight.ToString()),
  98. Boolean.Parse(r.isDoctor.ToString())));
  99. int i = 1;
  100. foreach (dynamic ses in r.sessions)
  101. {
  102. Session tempSession = new Session(i);
  103. i++;
  104. foreach (dynamic m in ses.measurements)
  105. {
  106. Measurement measurement = new Measurement(Int32.Parse(m.pulse.ToString()), Int32.Parse(m.rpm.ToString()), Int32.Parse(m.speed.ToString()), Int32.Parse(m.distance.ToString()), Int32.Parse(m.requestedPower.ToString()), Int32.Parse(m.energy.ToString()), Int32.Parse(m.actualPower.ToString()), Int32.Parse(m.time.ToString()));
  107. tempSession.AddMeasurement(measurement);
  108. }
  109. users.Last().AddSession(tempSession);
  110. }
  111. }
  112. }
  113. private void receive(object obj)
  114. {
  115. TcpClient client = obj as TcpClient;
  116. User currentUser;
  117. SslStream sslStream = InitialiseConnection(client);
  118. while (!(client.Client.Poll(0, SelectMode.SelectRead) && client.Client.Available == 0))
  119. {
  120. byte[] bytesFrom = new byte[(int)client.ReceiveBufferSize];
  121. try
  122. {
  123. sslStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize);
  124. }
  125. catch (Exception e)
  126. {
  127. Console.WriteLine("Exception occured while trying to get data from client. Disconnecting...");
  128. Console.WriteLine(e.StackTrace);
  129. //Stop();
  130. }
  131. string[] response = Encoding.ASCII.GetString(bytesFrom).Split('|');
  132. switch (response[0])
  133. {
  134. case "0":
  135. if (response.Length == 4)
  136. {
  137. int admin, id = 0;
  138. //check username and password
  139. foreach (User u in users)
  140. {
  141. if (u.id == response[1] && u.password == response[2])
  142. {
  143. admin = u.isDoctor ? 1 : 0;
  144. id = users.IndexOf(u);
  145. }
  146. }
  147. if (id > -1)
  148. {
  149. var user = users.FirstOrDefault(item => item.id == response[1]);
  150. if (user == null)
  151. {
  152. Console.WriteLine("received incorrect username or password");
  153. Communication.Send("0|0|0|", sslStream); // Does not exist
  154. }
  155. else if (user.isDoctor)
  156. {
  157. Console.WriteLine("received login from docter username: " + response[1]);
  158. Communication.Send("0|1|1|", sslStream); // Doctor
  159. }
  160. else if (!user.isDoctor)
  161. {
  162. Console.WriteLine("received login from patient username: " + response[1]);
  163. Communication.Send("0|1|0|", sslStream); //Patient
  164. }
  165. clients.Add(new Client(client, sslStream, response[1]));
  166. }
  167. else
  168. {
  169. Console.WriteLine("IOException");
  170. Communication.Send("0|0|0|", sslStream); // Does not exist
  171. }
  172. }
  173. break;
  174. case "1": //meetsessies ophalen
  175. currentUser = users.First(item => item.id == response[1]);
  176. Communication.Send("1|" + FietsLibrary.JsonConverter.GetUserSessions(currentUser), sslStream);
  177. break;
  178. case "2": //Livedata OPVRAGEN
  179. currentUser = users.First(item => item.id == response[1]);
  180. string lastMeasurement = FietsLibrary.JsonConverter.GetLastMeasurement(currentUser.sessions.Last());
  181. Communication.Send("2|" + lastMeasurement + "|", sslStream);
  182. break;
  183. case "3": //Nieuwe meetsessie aanmaken
  184. if (true)
  185. {
  186. foreach (User u in users)
  187. {
  188. if (u.id == response[1])
  189. {
  190. if (u.GetSessions().Count != 0)
  191. {
  192. int sessionID = u.GetSessions().LastOrDefault().id;
  193. u.AddSession(new Session(sessionID));
  194. }
  195. else
  196. {
  197. u.AddSession(new Session(1));
  198. }
  199. }
  200. }
  201. }
  202. break;
  203. case "4": // Nieuwe patient
  204. users.Add(new User(response[1], response[2], Int32.Parse(response[3]), Boolean.Parse(response[4]), Int32.Parse(response[5])));
  205. saveData2Json();
  206. readDataFromJson();
  207. break;
  208. case "5": //data pushen naar meetsessie (opslaan)
  209. // uitleg response[]:
  210. // response[1] = idPatient
  211. // response[2] = idCurrentDoctor
  212. // response[3] = measurement
  213. // opslaan van measurement
  214. currentUser = users.FirstOrDefault(item => item.id == response[1]);
  215. Measurement outputMeasurement = null;
  216. if (currentUser != null && currentUser.sessions.LastOrDefault() != null)
  217. {
  218. dynamic DynMeasurement = JsonConvert.DeserializeObject<dynamic>(response[3]);
  219. outputMeasurement = new Measurement((int)DynMeasurement.pulse, (int)DynMeasurement.rpm, (int)DynMeasurement.speed, (int)DynMeasurement.distance, (int)DynMeasurement.requestedPower, (int)DynMeasurement.energy, (int)DynMeasurement.actualPower, (int)DynMeasurement.time);
  220. currentUser.sessions.Last().AddMeasurement(outputMeasurement);
  221. }
  222. // einde opslaan measurement
  223. // nu sturen we het naar de doctor
  224. if (outputMeasurement != null && response[2] != "")
  225. {
  226. Client Case5Client = clients.FirstOrDefault(item => item.username == response[2]);
  227. string Case5String = "2|" + response[1] + "|" + JsonConvert.SerializeObject(outputMeasurement) + "|";
  228. Communication.Send(Case5String, Case5Client.sslStream);
  229. }
  230. break;
  231. case "6": //chatberichten ontvangen van gebruikers
  232. //controleren of het bericht wel tekens bevat
  233. if (response[3] != null)
  234. {
  235. string message = response[3].TrimEnd('\0');
  236. string receiver = response[2];
  237. string sender = response[1];
  238. string case6str = "7|" + sender + "|" + receiver + "|" + message;
  239. Console.WriteLine(case6str);
  240. Communication.Send(case6str, sslStream);
  241. for (int i = 0; i < clients.Count; i++)
  242. {
  243. if (clients[i].username == receiver)
  244. Communication.Send("7|" + sender + "|" + receiver + "|" + message, clients[i].sslStream);
  245. }
  246. }
  247. break;
  248. case "8": //alle online Patients sturen naar Doctorclient
  249. if (response[1] != null)
  250. {
  251. if (response[1] == "doctor" || true) //TODO: doctor check
  252. {
  253. List<string> patients = new List<string>();
  254. foreach (Client c in clients)
  255. {
  256. User user = users.FirstOrDefault(item => item.id == c.username);
  257. if (user != null)
  258. if (!user.isDoctor)
  259. patients.Add(user.id);
  260. }
  261. string strToSend = "8|";
  262. if (!(patients.Count > 0))
  263. strToSend += "-1";
  264. else
  265. foreach (string patient in patients)
  266. {
  267. strToSend += (patient + '\t');
  268. }
  269. Communication.Send(strToSend.TrimEnd('\t'), sslStream);
  270. }
  271. }
  272. break;
  273. case "9": //alles doorsturen voor de dokter
  274. // BUG: er wordt teveel data verstuurd!!!!
  275. //Console.WriteLine("send users");
  276. string file = "9|" + FietsLibrary.JsonConverter.GetUsers(users);
  277. Communication.Send(file, sslStream);
  278. break;
  279. case "10":
  280. if (response[1] == "1" || response[1] == "0") //start of stop sesie (met check)
  281. {
  282. Client Case10Client = clients.FirstOrDefault(item => item.username == response[2].TrimEnd('\0'));
  283. string Case10String = "10|" + response[1] + "|" + response[2] + "|" + response[3].TrimEnd('\0') + "|";
  284. Communication.Send(Case10String, Case10Client.sslStream);
  285. if (response[1] == "1")
  286. {
  287. Communication.Send("10|" + "1" + "|" + response[2] + "|" + response[3].TrimEnd('\0') + "|", sslStream);
  288. }
  289. }
  290. break;
  291. case "11":
  292. saveData2Json();
  293. break;
  294. case "20":
  295. Client Case20Client = clients.FirstOrDefault(item => item.username == response[1]);
  296. if (Case20Client != null)
  297. {
  298. string Case20String = "20|" + response[2] + "|";
  299. Communication.Send(Case20String, Case20Client.sslStream);
  300. }
  301. break;
  302. case "21":
  303. Client Case21Client = clients.FirstOrDefault(item => item.username == response[1]);
  304. if (Case21Client != null)
  305. {
  306. string Case20String = "21|" + response[2] + "|" + response[3] + "|";
  307. Communication.Send(Case20String, Case21Client.sslStream);
  308. }
  309. break;
  310. case "22":
  311. Client Case22Client = clients.FirstOrDefault(item => item.username == response[1]);
  312. if (Case22Client != null)
  313. {
  314. string Case22String = "22|" + response[2] + "|";
  315. Communication.Send(Case22String, Case22Client.sslStream);
  316. }
  317. break;
  318. default:
  319. break;
  320. }
  321. }
  322. }
  323. }
  324. class Client
  325. {
  326. public TcpClient client { get; private set; }
  327. public SslStream sslStream { get; private set; }
  328. public string username;
  329. public Client(TcpClient client, SslStream sslStream, string username)
  330. {
  331. this.client = client;
  332. this.sslStream = sslStream;
  333. this.username = username;
  334. }
  335. }
  336. }