/// <summary> /// Ожидание сообщения по сокету конкретного клиента в отедльном потоке /// </summary> /// <param name="handler"></param> private static void ReciveClient(Socket handler) { while (handler?.Connected == true && IsMakedUp) { try { var bytes = new byte[1024]; if (handler?.Available == 0) { Thread.Sleep(50); continue; } var bytesLength = handler.Receive(bytes); if (bytesLength == 0) { continue; } var fullData = Encoding.UTF8.GetString(bytes, 0, bytesLength); var message = JsonSerializer.Deserialize <Message>(fullData); message.Sender.Handler = handler; if (message != null) { IncomingMessagesQueue.Enqueue(message); } } catch (Exception ex) { ServerMessage($"При получении сообщения возникло исключение: {ex.Message}"); } } }
/// <summary> /// Регистрация клиента в чате /// </summary> /// <returns></returns> private static bool RegisterClient() { while (!IsRegistered) { ConsoleMessage("Для регистрации в чате введите имя пользователя"); var data = ConsoleRead(); if (data == "Пока") { return(false); } if (string.IsNullOrWhiteSpace(data) || !regexClient.IsMatch(data)) { ConsoleMessage("Неверный формат данных"); continue; } Sender = new Client { NickName = data }; var message = new Message { Type = MessageType.Authorization, Sender = Sender }; message?.SendAsync(); var responce = GetMessage(true); IsRegistered = responce != null && responce.Content.StartsWith("Ok"); if (IsRegistered) { responce.Content = responce.Content.Substring(3); IncomingMessagesQueue.Enqueue(responce); } } return(true); }
/// <summary> /// Метод прриема входящих сообщений /// </summary> private static void ReceivingMessages() { while (ClientSocket?.Connected == true) { try { var message = GetMessage(); if (message != null) { IncomingMessagesQueue.Enqueue(message); } } catch (Exception ex) { ConsoleMessage($"При получении сообщения возникло исключение: {ex.Message}"); } } }
/// <summary> /// Обработка входящих сообщений /// </summary> private static void ProcessingIncomingMessage() { while (ClientSocket?.Connected == true || IncomingMessagesQueue.Any()) { try { if (!IncomingMessagesQueue.TryDequeue(out var message)) { continue; } var mess = ""; switch (message.Type) { case MessageType.Authorization: Console.ForegroundColor = ConsoleColor.Green; break; case MessageType.Server: Console.ForegroundColor = ConsoleColor.Red; break; case MessageType.Private: Console.ForegroundColor = ConsoleColor.Blue; mess += "!"; break; case MessageType.All: Console.ForegroundColor = ConsoleColor.Yellow; break; } ConsoleMessage($"{mess}[{message.Sender.NickName}]: {message.Content}"); Console.ResetColor(); } catch (Exception ex) { ConsoleMessage($"При обработке сообщения возникло исключение: {ex.Message}"); } } }
/// <summary> /// Обработка входящих сообщений /// </summary> private static void ProcessingIncomingMessage() { while (IsMakedUp || IncomingMessagesQueue.Any()) { try { if (!IncomingMessagesQueue.TryDequeue(out var message)) { continue; } if (message.Type != MessageType.Authorization && !Users.Any(x => x.Id == message.Sender.Id && x.NickName == message.Sender.NickName && x.Handler.Connected)) { OutgoingMessageQueue.Enqueue(message.ServerResponse($"Простите, {message.Sender.NickName}, но вас нет!")); continue; } switch (message.Type) { case MessageType.Authorization: if (Users.Any(x => x.NickName.Equals(message.Sender.NickName) || x.Id.Equals(message.Sender.Id))) { OutgoingMessageQueue.Enqueue(message.ServerResponse($"No/Пользователь с аналогичными регистрационными данными уже в чате", MessageType.Authorization)); break; } lock (Users) { Users.Add(message.Sender); } ServerMessage($"В чат вошел [{message.Sender.NickName}] ({message.Sender.Handler.RemoteEndPoint})"); var responceContent = $"Ok/Поздравляю {message.Sender.NickName}, Вы в чате. Список доступных команд:"; responceContent += AllCommandsString; responceContent += $"\n{Datas.ExitCommand.ComKey} --> {Datas.ExitCommand.Comment}"; OutgoingMessageQueue.Enqueue(message.ServerResponse(responceContent, MessageType.Authorization)); break; case MessageType.Server: if (message.Content.Equals(Datas.ExitCommand.ComKey)) { GoodByClient(message.Sender); break; } var com = AllCommands.FirstOrDefault(x => x.ComKey.Equals(message.Content)); OutgoingMessageQueue.Enqueue(message.ServerResponse(com != null ? com.Function?.Invoke("") : "Мой юнный мозг не выдержал перегрузки, вызванной Вашим вопросом, и сдулся.") ); break; case MessageType.Private: if (Users.Any(x => x.NickName == message.RecipientNickName)) { OutgoingMessageQueue.Enqueue(message); break; } OutgoingMessageQueue.Enqueue(message.ServerResponse($"Получатель сообщения [{message.RecipientNickName}] отсутствует в списке зарегистрированных пользователей")); break; case MessageType.All: foreach (var recipient in Users) { var answer = message.CloneExcept("RecipientNickName"); answer.RecipientNickName = recipient.NickName; OutgoingMessageQueue.Enqueue(answer); } break; } } catch (Exception ex) { ServerMessage($"При обработке сообщения возникло исключение: {ex.Message}"); } } }