示例#1
0
            public void Process()
            {
                Stream = tcpClient.GetStream();
                Console.WriteLine("Клиент с номером потока {0} - подключился", ThreadNumber);
                File.AppendAllText(path, "Клиент с номером потока " + ThreadNumber + " - подключился\n");
                string oldMessage = null;

                while (true)
                {
                    try
                    {
                        if (ClientNumber <= 2)
                        {
                            string newMessage = GetMessage(Stream);
                            if (MessagesInProcces.Any(m => m == newMessage))
                            {
                                string attention = "Данный запрос уже находится в обработке!";
                                SendMessage(attention, Stream);
                                if (ClientWithDublet.All(c => c.Item2 != newMessage))
                                {
                                    ClientWithDublet.Add(new Tuple <Client, string>(this, newMessage));
                                }
                            }
                            else
                            {
                                if (serverIsBusy)
                                {
                                    string attention = "Запрос уже обрабатывается!";
                                    SendMessage(attention, Stream);
                                }
                                else
                                {
                                    oldMessage = newMessage;
                                    ProcessingMessage(oldMessage, Stream);
                                    oldMessage = null;
                                }
                            }
                        }
                        else
                        {
                            GetMessage(Stream);
                            SendMessage("Превышен лимит потоков, попробуйте позже", Stream);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Клиент с номером потока {0} - отключился", ThreadNumber);
                        File.AppendAllText(path, "Клиент с номером потока " + ThreadNumber + " - отключился\n");
                        Clients.Remove(this);
                        for (int i = 0; i < Clients.Count; i++)
                        {
                            Clients[i].ClientNumber = i;
                        }
                        return;
                    }
                }
            }
示例#2
0
            async void ProcessingMessage(string message, NetworkStream stream)
            {
                await Task.Run(() =>
                {
                    serverIsBusy = true;
                    MessagesInProcces.Add(message);

                    Thread.Sleep(5000);
                    var answer        = Answers[random.Next(3)];
                    string fullAnswer = DateTime.Now.ToShortTimeString() + ": " + answer + message;
                    Console.WriteLine("Номер клиeнта {0}, " + fullAnswer, ThreadNumber);
                    SendMessage(fullAnswer, stream);

                    var clients       = ClientWithDublet.Where(c => c.Item2 == message);
                    var clientNumbers = clients.Select(c => c.Item1);
                    foreach (var clientWithDuplet in clientNumbers)
                    {
                        var client = Clients.FirstOrDefault(c => c.ClientNumber == clientWithDuplet.ClientNumber);
                        if (client == null)
                        {
                            continue;
                        }

                        Console.WriteLine("Номер клиeнта {0}, " + fullAnswer, client.ThreadNumber);
                    }

                    clients.Distinct();
                    foreach (var clientWithDuplet in clients.ToList())
                    {
                        SendMessage(fullAnswer, clientWithDuplet.Item1.Stream);
                        ClientWithDublet.Remove(clientWithDuplet);
                    }

                    MessagesInProcces.Remove(message);
                    serverIsBusy = false;
                });
            }