Показать сообщение отдельно
Непрочитано 20.06.2015, 23:53   #1
Пользователь

Автор темы (Топик Стартер) С# клиент-сервер

Доброго времени суток, господа. Есть ли у кого готовое решение на с# для получения и отправки информации, где одно приложение сервер-распространитель, а другое - клиент(-ы)? Искал, гуглил, читал на хабре, киберфоруме, и даже книжечку. Но видимо, ума не хватает.
Код:
static void Main(string[] args)
        {
            Data.Connect = "Database=bdworld;Data Source=localhost;User Id=root;Password=root";
            TcpListener server = null;
            try
            {               
                int MaxThreadsCount = Environment.ProcessorCount * 4;
                Console.WriteLine(MaxThreadsCount.ToString());
                // Максимальное количество рабочих потоков
                ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
                // Минимальное количество рабочих потоков
                ThreadPool.SetMinThreads(2, 2);


                // Порт для TcpListener = 9595.
                Int32 port = 9595;
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");
                int counter = 0;
                server = new TcpListener(localAddr, port);
                
                    Data.parse_skills();
                
                // Запускаем TcpListener и начинаем слушать клиентов.
                server.Start();

                // Принимаем клиентов в бесконечном цикле.
                while (true)
                {
                    Console.Write("\nWaiting for a connection... ");
                    // При появлении клиента добавляем в очередь потоков его обработку.
                    ThreadPool.QueueUserWorkItem(ObrabotkaZaprosa, server.AcceptTcpClient());   
                }
            }
            catch (SocketException e)
            {
                //В случае ошибки, выводим что это за ошибка.
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Останавливаем TcpListener.
                server.Stop();
            }
        }
В обработке запросов(ObrabotkaZaprosa):
Код:
  static void ObrabotkaZaprosa(object client_obj)
        {
            try
            {
                // Буфер для принимаемых данных.
                Byte[] bytes = new Byte[256];
                String data = null;

                //Можно раскомментировать Thread.Sleep(1000); 
                //Запустить несколько клиентов
                //и наглядно увидеть как они обрабатываются в очереди. 
                //Thread.Sleep(1000);

                Data.client = client_obj as TcpClient;

                data = null;

                // Получаем информацию от клиента
                Data.stream = Data.client.GetStream();

                int i;

                // Принимаем данные от клиента в цикле пока не дойдём до конца.
                while ((i = Data.stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Преобразуем данные в ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

                    //В handling switch с определением что за сообщение, обработка его и возврат ответа в дату.
                    data = Data.handling(data);

                    // Преобразуем полученную строку в массив Байт.
                    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                    try
                    {
                        // Отправляем данные обратно клиенту (ответ).
                        Data.stream.Write(msg, 0, msg.Length);
                    }
                    catch (Exception err)
                    { Console.WriteLine(err.ToString()); }

                }

                // Закрываем соединение.
                Data.client.Close();
            }
            catch { }

        }
Самое неприятное, что при очень быстром количестве запросов от клиента(раз в 100 мс) - сервер выпадает не удосужившись толком обьяснить в чём дело, ссылается на то, что было обращение к уже уничтоженным обьектам(самым разным). Может есть у кого готовое решение? Не могу до конца понять, как же всё-таки должен сервер общаться с клиентами. Код ужасен, помидорами кидайте, но помогите плс))
kpNemo вне форума Ответить с цитированием