TheRyuzaki.Network v0.001 PreAlpha - Критика и оптимизация - C#

Узнай цену своей работы

Формулировка задачи:

Client.cs

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Concurrent;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.IO;
  10. using System.Threading;
  11. namespace TheRyuzaki.Network
  12. {
  13. public class Client
  14. {
  15. public int build = 1;
  16. public Dictionary<string, object> Cl = new Dictionary<string, object>();
  17. #region Обьявление ссылок на функции
  18. /// <summary>
  19. /// Ссылка на функцию вызываемую при завершении действий по подключению к серверу.
  20. /// </summary>
  21. public Action ConnectToServer_Completed = null;
  22. /// <summary>
  23. /// Ссылка на функцию вызываемую при получении текста от сервера.
  24. /// </summary>
  25. public Action<string> ReadLineToServer = null;
  26. /// <summary>
  27. /// Ссылка на функцию вызываемую при завершении отключения от сервера.
  28. /// </summary>
  29. public Action DisconnectServer_Completed = null;
  30. #endregion
  31. /// <summary>
  32. /// Класс для клиента по работе с сервером работающиго на TheRyuzaki.Network
  33. /// </summary>
  34. /// <param name="ip">IP Адрес до сервера работающиго на TheRyuzaki.Network</param>
  35. /// <param name="port">Порт до сервера работающиго на TheRyuzaki.Network</param>
  36. public Client(string ip, int port)
  37. {
  38. Cl["connect_status"] = false;
  39. Cl["client_ip"] = ip;
  40. Cl["client_port"] = port;
  41. }
  42. public void ConnectToServer()
  43. {
  44. Cl["client_thread"] = new Thread(delegate ()
  45. {
  46. if (!(bool)Cl["connect_status"])
  47. try
  48. {
  49. Cl["client_tcp"] = new TcpClient((string)Cl["client_ip"], (int)Cl["client_port"]);
  50. Cl["client_ns"] = (Cl["client_tcp"] as TcpClient).GetStream();
  51. Cl["client_sr"] = new StreamReader((Cl["client_ns"] as NetworkStream));
  52. Cl["client_sw"] = new StreamWriter((Cl["client_ns"] as NetworkStream));
  53. Cl["connect_status"] = true;
  54. }
  55. catch
  56. {
  57. Cl["connect_status"] = false;
  58. }
  59. if (ConnectToServer_Completed != null) ConnectToServer_Completed();
  60. Reading();
  61. });
  62. (Cl["client_thread"] as Thread).Start();
  63. }
  64. /// <summary>
  65. /// Функция потокового прослушивания запросов от сервера
  66. /// </summary>
  67. private void Reading()
  68. {
  69. if ((bool)Cl["connect_status"])
  70. try
  71. {
  72. while(true)
  73. {
  74. var request = (Cl["client_sr"] as StreamReader).ReadLine();
  75. if (request.Length == 0) break;
  76. var ex = request.Split(';');
  77. switch (ex[0])
  78. {
  79. case "version":
  80. WriteForServer("version;" + build);
  81. break;
  82. default:
  83. if (ReadLineToServer != null) ReadLineToServer(request);
  84. break;
  85. }
  86. }
  87. Disconnect();
  88. }
  89. catch {
  90. if ((Thread)Cl["client_thread"] != null) Disconnect();
  91. }
  92. }
  93. /// <summary>
  94. /// Функция отправки запроса на сервер
  95. /// </summary>
  96. /// <param name="request">Запрос</param>
  97. /// <param name="WriteAllClients">Просто отправить всем клиентам</param>
  98. public void WriteForServer(string request, bool WriteAllClients = false)
  99. {
  100. if (!(bool)Cl["connect_status"])
  101. return;
  102. if (WriteAllClients)
  103. request = "WriteAllClients;" + request;
  104. (Cl["client_sw"] as StreamWriter).WriteLine(request);
  105. (Cl["client_sw"] as StreamWriter).Flush();
  106. }
  107. /// <summary>
  108. /// Функция разрыва соеденения с сервером
  109. /// </summary>
  110. public void Disconnect()
  111. {
  112. Cl["client_thread"] = null;
  113. try { (Cl["client_sr"] as StreamReader).Close(); } catch { }
  114. try { (Cl["client_sw"] as StreamWriter).Close(); } catch { }
  115. try { (Cl["client_ns"] as NetworkStream).Close(); } catch { }
  116. try { (Cl["client_tcp"] as TcpClient).Close(); } catch { }
  117. Cl["connect_status"] = false;
  118. if (DisconnectServer_Completed != null) DisconnectServer_Completed();
  119. }
  120. }
  121. }

Server.cs

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Concurrent;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.IO;
  10. using System.Threading;
  11. namespace TheRyuzaki.Network
  12. {
  13. public class Server
  14. {
  15. private int build = 1;
  16. public Dictionary<string, object> Config = new Dictionary<string, object>();
  17. public Dictionary<string, object> Srv = new Dictionary<string, object>();
  18. #region Ссылки на функции CallBack
  19. /// <summary>
  20. /// Ссылка на функцию которая вызывается при успешном запуске сервера
  21. /// </summary>
  22. public Action ServerStarted = null;
  23. /// <summary>
  24. /// Ссылка на функцию которая вызывается при остановке сервера
  25. /// </summary>
  26. public Action ServerStoped = null;
  27. /// <summary>
  28. /// Ссылка на функцию которая вызывается при подключении нового клиента
  29. /// </summary>
  30. public Action<int> ClientConnected = null;
  31. /// <summary>
  32. /// Ссылка на функцию которая вызывается при отключении клиента от сервера
  33. /// </summary>
  34. public Action<int, Dictionary<string, object>> ClientDisconnected = null;
  35. /// <summary>
  36. /// Ссылка на функцию которая вызывается при получении сообщения от клиента
  37. /// </summary>
  38. public Action<int, string> ClientSendedMessage = null;
  39. #endregion
  40. /// <summary>
  41. /// Класс по работе Сервер-Клиент по сердствам TheRyuzaki.Network
  42. /// </summary>
  43. /// <param name="IP">IP адрес прослушки в формате IPAddress</param>
  44. /// <param name="Port">Порт прослушиваемый</param>
  45. public Server(IPAddress IP, int Port)
  46. {
  47. Config["server_ip"] = IP;
  48. Config["server_port"] = Port;
  49. Config["last_session"] = 0;
  50. Srv["server_thread"] = null;
  51. Srv["Server"] = new Dictionary<string, object>();
  52. Srv["Users"] = new Dictionary<int, object>();
  53. (Srv["Server"] as Dictionary<string, object>)["Listener"] = new TcpListener(IP, Port);
  54. }
  55. /// <summary>
  56. /// Функция запуска сервера
  57. /// </summary>
  58. public void StartServer()
  59. {
  60. if ((Srv["server_thread"] as Thread) != null) return;
  61. ((Srv["Server"] as Dictionary<string, object>)["Listener"] as TcpListener).Start();
  62. Srv["server_thread"] = new Thread(delegate ()
  63. {
  64. if (ServerStarted != null) ServerStarted();
  65. while (true)
  66. {
  67. Socket Soc = null;
  68. try { Soc = ((Srv["Server"] as Dictionary<string, object>)["Listener"] as TcpListener).AcceptSocket(); } catch { break; }
  69. if (Soc.Connected)
  70. {
  71. Config["last_session"] = (int)Config["last_session"] + 1;
  72. var id_session = (int)Config["last_session"];
  73. (Srv["Users"] as Dictionary<int, object>)[id_session] = new Dictionary<string, object>();
  74. ((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["Thread"] = new Thread(delegate ()
  75. {
  76. try
  77. {
  78. ((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["Soc"] = Soc;
  79. ((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["NS"] = new NetworkStream(Soc);
  80. ((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SR"] = new StreamReader((((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["NS"] as NetworkStream));
  81. ((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SW"] = new StreamWriter((((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["NS"] as NetworkStream));
  82. if (ClientConnected != null) ClientConnected(id_session);
  83. while (true)
  84. {
  85. var request = (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SR"] as StreamReader).ReadLine();
  86. if (request.Length == 0) break;
  87. request = "WriteAllClients;" + request;
  88. var ex = request.Split(';');
  89. switch (ex[0])
  90. {
  91. case "version":
  92. if (build.ToString() != ex[1]) CloseSession(id_session);
  93. break;
  94. case "WriteAllClients":
  95. request = request.Replace("WriteAllClients;", "");
  96. (new Thread(delegate ()
  97. {
  98. foreach (var r in GetUsers())
  99. if ((Srv["Users"] as Dictionary<int, object>).ContainsKey(r.Key))
  100. SendMessage(request, r.Key);
  101. })).Start();
  102. break;
  103. default:
  104. if (ClientSendedMessage != null) ClientSendedMessage(id_session, request);
  105. break;
  106. }
  107. }
  108. CloseSession(id_session);
  109. }
  110. catch
  111. {
  112. CloseSession(id_session);
  113. }
  114. });
  115. (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["Thread"] as Thread).Start();
  116. }
  117. }
  118. });
  119. (Srv["server_thread"] as Thread).Start();
  120. }
  121. /// <summary>
  122. /// Функция остановки сервера
  123. /// </summary>
  124. public void StopServer()
  125. {
  126. if ((Srv["server_thread"] as Thread) == null) return;
  127. ((Srv["Server"] as Dictionary<string, object>)["Listener"] as TcpListener).Stop();
  128. foreach(var r in GetUsers())
  129. if ((Srv["Users"] as Dictionary<int, object>).ContainsKey(r.Key))
  130. CloseSession(r.Key);
  131. (Srv["server_thread"] as Thread).Abort();
  132. Srv["server_thread"] = null;
  133. if (ServerStoped != null) ServerStoped();
  134. }
  135. /// <summary>
  136. /// Функция завершения сеанса сессии.
  137. /// Возвращает ответ:
  138. /// 0 = Закрыт успешно.
  139. /// 1 = Такой сессии не существует.
  140. /// 2 = Возникла ошибка при закрытии сесии.
  141. /// </summary>
  142. public int CloseSession(int id, bool NotRemove = false)
  143. {
  144. int i = 0;
  145. if ((Srv["Users"] as Dictionary<int, object>).ContainsKey(id))
  146. try
  147. {
  148. try { (((Srv["Users"] as Dictionary<int, object>)[id] as Dictionary<string, object>)["Soc"] as Socket).Close(); } catch { }
  149. if (ClientDisconnected != null) ClientDisconnected(id, ((Srv["Users"] as Dictionary<int, object>)[id] as Dictionary<string, object>));
  150. Thread tmp = (((Srv["Users"] as Dictionary<int, object>)[id] as Dictionary<string, object>)["Thread"] as Thread);
  151. if (!NotRemove) (Srv["Users"] as Dictionary<int, object>).Remove(id);
  152. tmp.Abort();
  153. }
  154. catch
  155. {
  156. i = 2; // Записываем про чтоизошла ошибка
  157. }
  158. else
  159. i = 1;
  160. return i;
  161. }
  162. /// <summary>
  163. /// Функция отправки сообщения на клиент
  164. /// </summary>
  165. /// <param name="message">Само сообщение</param>
  166. /// <param name="id_session">ID сессии</param>
  167. public void SendMessage(string message, int id_session)
  168. {
  169. (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SW"] as StreamWriter).WriteLine(message);
  170. (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SW"] as StreamWriter).Flush();
  171. }
  172. /// <summary>
  173. /// Функция получения списка ID сессий активных пользователей. Желательно проверять при работе на достоверность if ((Srv["Users"] as Dictionary<int, object>).ContainsKey(r.Key))
  174. /// </summary>
  175. /// <returns>Dictionary<int, bool> - массив содержащий ID в ключе</returns>
  176. public Dictionary<int, bool> GetUsers()
  177. {
  178. var k =(Srv["Users"] as Dictionary<int, object>).Keys;
  179. Dictionary<int, bool> keys = new Dictionary<int, bool>();
  180. foreach(var r in k)
  181. keys.Add(r, true);
  182. return keys;
  183. }
  184. }
  185. }
Welcome критика, оптимизация и предложения.

Решение задачи: «TheRyuzaki.Network v0.001 PreAlpha - Критика и оптимизация»

textual
Листинг программы
  1.         public void SendMessage(string message, int id_session)
  2.         {
  3.             (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SW"] as StreamWriter).WriteLine(message);
  4.             (((Srv["Users"] as Dictionary<int, object>)[id_session] as Dictionary<string, object>)["SW"] as StreamWriter).Flush();
  5.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы