На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Многопоточный сервер на C#
    Здравствуйте!
    Возможно такая тема уже есть, тогда простите.

    Стоит задача реализовать многопоточный сервер на C#. Допустим пока для обмена текстовыми сообщения.
    Написал однопоточный.
    Реализовал так:

    Запускай новый поток и в нем:

    ExpandedWrap disabled
         Int32 port = 8812;
                  IPAddress localAddr = IPAddress.Parse("127.0.0.1");
                  TcpListener server = new TcpListener(localAddr, port);
                  server.Start();

    После этого вхожу в цикл бесконечный для прослушивания запросов на подключение от клиентов.
    В нем после успешного соединения, включаю еще один фактически бесконечный цикл, для приема сообщений от конкретного соединения. После того как обрывается соединение - закрываю всю лавочку.
    ExpandedWrap disabled
             while (true)
                      {
                      connection = server.AcceptSocket();
                      socketStream = new NetworkStream(connection);
                      writer = new BinaryWriter(socketStream);
                      reader = new BinaryReader(socketStream);
       
                      AppendText(displayTextBox, "Соединение " + counter + " принято. \r\n");
                      writer.Write("SERVER>>> Connection successful");
       
                      inputTextBox.ReadOnly = false;
                      string theReply = "";
       
                      //считывание строки данных от клиента
                      do
                      {
                         try
                          {
                         //Считываем строку, отправленную на сервер
                              theReply = reader.ReadString();
       
                              //Отображение сообщения
                              AppendText(displayTextBox, "\r\n" + theReply);
                             // displayTextBox.Text += "\r\n" + theReply;
                          }
                          //Обработка исключения при ошибке считывания данных
                          catch (Exception)
                          {
                              break;
                          }
                      } while (theReply != "CLIENT>>> TERMINATE" && connection.Connected);
                      AppendText(displayTextBox, "\r\nПользователь оборвал соединение");
       
       
                      SwitchButton(button1);
                      //Шаг 5: Закрытие соединения
                      writer.Close();
                      reader.Close();
                      socketStream.Close();
                      connection.Close();
                      
                      ++counter;
                  }

    Вопрос: Как правильно еще добавить потоки, что бы оптимально сделать сервер многопоточным?
    По идее, нужно выделить вложенный цикл который принимает сообщения в отдельный поток?
    ExpandedWrap disabled
             do
                      {
                      ..............................
                      } while (theReply != "CLIENT>>> TERMINATE" && connection.Connected);

    Но ведь при этом нужно для каждого нового соединения открывать новый поток? Это чисто ручками писать?
    Или есть инструменты которые допустим сразу регистрируют 10 потоков. (а не каждый по отдельности) и даллее уже мы просто включаем их и выключаем?

    Есть ли вообще способы упрощения всего?
    Допустим, что бы потом можно было лишь использованием какой либо функции встроенной библиотеки пересылать файл по сети и т.д.
    С Ув. Сергей!
    Сообщение отредактировано: IDE -
      Не уверен, поскольку не знаю какие задачи стоят перед Вашим сервером, но
      возможно Вам поможет System.Threading.ThreadPool.
      Как видно из названия это его предназначение держать пул потоков.
        Вот статья поможет тебе http://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx описан подход к написанию высокоскоростного многопоточного сокет сервера.
          Спасибо за статью!


          Можно еще один вопрос в догонку?
          Заталкиваю image в поток, а затем поток в byte[] data, таким образом:

          ExpandedWrap disabled
                      System.IO.MemoryStream stream = new System.IO.MemoryStream();
                      e.WebCamImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
                      data = stream.ToArray();


          Нужно произвести обратную операцию, из массива байтов, переписать в поток, а из потока в Image.
          Каким образом можно это сделать?

          P.S. Только разбираюсь с Шарпом. Пока с ним на Вы. :(
            ExpandedWrap disabled
              Byte[] data;
              //...
              MemoryStream ms = new memoryStream(data);


            У Image есть то ли конструктор то ли стат. метод, который создаёт его из потока. Там распознаётся формат картинки, размери и т.п.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0250 ]   [ 16 queries used ]   [ Generated: 7.05.24, 18:16 GMT ]