/// <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}");
         }
     }
 }
示例#2
0
 /// <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);
 }
示例#3
0
 /// <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}");
         }
     }
 }
示例#4
0
        /// <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}");
                }
            }
        }