Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2013, 00:29   #1
Strangers
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 64
По умолчанию Асинхронный многопоточный сервер

Добрый вечер уважаемые программисты. Возникла задача написать асинхронный многопоточный сервер. Поискав в гугле нашел следующую предложенную реализацию:
Код:
 public class AsyncServer
 {
     
     private Socket _serverSocket;

     
     private static ManualResetEvent _connectionMutex =
              new ManualResetEvent(false);

    
     private ClientManager _clientManager;

     public AsyncServer(string ipAddrees, int port)
     {
         try
         {
             
             this._serverSocket = new Socket(AddressFamily.InterNetwork,
                 SocketType.Stream, ProtocolType.Tcp);

             
             this._serverSocket.Bind(
               new IPEndPoint(IPAddress.Parse(ipAddrees), port));

         }
         catch (Exception ex)
         {
             throw new Exception("Ошибка инициализации сервера.", ex);
         }
     }

     private BackgroundWorker _listenThread = new BackgroundWorker();

    
     public void Start()
     {
         this._clientManager = new ClientManager(this._clientConnections);

         this._listenThread.WorkerReportsProgress = true;
         this._listenThread.WorkerSupportsCancellation = true;
         this._listenThread.DoWork +=
              new DoWorkEventHandler(ListenThread_DoWork);

         this._listenThread.RunWorkerAsync(this._serverSocket);
     }

     
     private void ListenThread_DoWork(object sender, DoWorkEventArgs e)
     {
         Socket serverSocket = (Socket)e.Argument;

         
         serverSocket.Listen(100);

         while (true)
         {
             
             _connectionMutex.Reset();
          
             serverSocket.BeginAccept(
             new AsyncCallback(this.AcceptCallback), this._serverSocket);

            
             _connectionMutex.WaitOne();
         }
     }

     
     private List _clientConnections = new List();
  
         
     public int ConnectionsCount
     {
         get { return this._clientConnections.Count; }
     }

     
     private void AcceptCallback(IAsyncResult asyncResult)
     {
         
         _connectionMutex.Set();

         Socket serverSocket = (Socket)asyncResult.AsyncState;
         Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);
         this._clientConnections.Add(clientSocket);

        
         this._clientManager.HandleClient(clientSocket);
     }

 }
 


   /// Менеджер для работы с клиентским подключениями   
   public class ClientManager
   {       
        
       private List<BackgroundWorker> _clientProcessors = new List<BackgroundWorker>();
      
        
       private List<Socket> _connections;       

      
       public ClientManager(List<Socket> connections)
       {
           this._connections = connections;
       }
      
                   
       public void HandleClient(Socket clientSocket)
       {
           BackgroundWorker clientProcessor = new BackgroundWorker();
           clientProcessor.DoWork += new DoWorkEventHandler(ClientProcessing);

          
           this._clientProcessors.Add(clientProcessor);

           List<object> args = new List<object>();
           // добавление аргументов для потока
           // args.Add(...);           

         
           clientProcessor.RunWorkerAsync(args);
       }
      
                   
       private void ClientProcessing(object sender, DoWorkEventArgs e)
       {
          
           List<object> args = (List<object>)e.Argument;          

           ProtocolSerializer serializer = new ProtocolSerializer();

           try
           {
               while (socket.Connected)
               {               
                   // получение или отправка данных
                 
               }
           }
           catch (SocketException)
           {
              // обработка исключений
           }
           catch (Exception)
           {
              // обработка исключений
           }
       }
   }
В общих чертах все понятно кроме таких вот строк
Код:
List<object> args = new List<object>();
           // добавление аргументов для потока
           // args.Add(...);
в методе HandleClient. Так же непонятен метод ClientProcessing. Я так понял в нем идет непосредственная работа с клиентом, но у меня не получилось выполнить прием\передачу данных. Подскажите пожалуйста как правильно реализовать метод ClientProcessing.
Strangers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
многопоточный 3-х звенный клиент сервер Misha666 C# (си шарп) 4 14.12.2012 17:57
c#. Многопоточный сервер tiger Помощь студентам 1 13.09.2012 13:24
Многопоточный сервер FAiver Работа с сетью в Delphi 18 31.03.2008 08:51
многопоточный сервер мандарин Работа с сетью в Delphi 6 24.04.2007 07:22