2010-12-31 2 views
14

Привет
Я хочу использовать NamedPipeServerStream, который является новичком в .NET 3.5 для обмена сообщениями с именами. Я хочу написать многопоточный сервер трубопроводов. это обрабатывается по умолчанию, или я должен написать для этого код. мой сервер труб должен обрабатывать несколько запросов за разМногопоточность NamePipeServer в C#

любое решение или код?

+0

Что максимальное количество запросов от клиента к серверу имя трубы? – Ehsan

+0

Нет ограничений на количество чтений и записей, которые клиент может сделать в именованном канале до тех пор, пока оба конца канала открыты. –

ответ

20

Каждый экземпляр NamedPipeServerStream представляет собой реализацию Stream, переносящую дескриптор в экземпляр именованного канала. Вы можете (и сервер с многопоточным каналом) иметь несколько экземпляров NamedPipeServerStream для одного и того же именованного канала: каждый переносит дескриптор в другой экземпляр именованного канала, обслуживая другого клиента. Именованные экземпляры pipe (даже для одного и того же канала) хранятся отдельно операционной системой, поэтому нет необходимости в каком-либо явном кодировании, чтобы поддерживать связь каждого клиента с сервером отдельно.

То, что вам нужно явно указать, это модель потоковой передачи для сервера. Самый простой подход к многопоточности сервера объясняется в this SO answer, который включает в себя шаблон псевдокода. Более масштабируемые реализации, если необходимо поддерживать большое количество одновременных вызывающих абонентов, будут использовать пул потоков и асинхронные методы вместо создания выделенного потока для каждого соединения.

+0

Итак, нам нужно создать новый серверный поток для каждого клиента? – Ehsan

+1

Да, это правильно –

0

NamedPipeServerStream - это точка-точка. Вы сами должны сами синхронизировать вызовы - например, вызовы, написанные в очередь, и ваш сервер читает из синхронизированной очереди и выполняет вызовы.

24

Вы можете написать многопоточный сервер труб, повторно создавая NamedPipeServerStream и ожидая одного соединения, а затем создавая поток для этого экземпляра NamedPipeServerStream.

У вас может быть только 254 одновременных клиентов, хотя в соответствии с документацией .NET MSDN, приведенной ниже. Для Win32 API, хотя вы можете передать специальное значение, чтобы получить неограниченное количество на основе системных ресурсов. Похоже, что документация MSDN неверна, как указано ниже.

Ниже код не проверяется поэтому, пожалуйста, не просто скопировать и вставить для использования в производстве без тестирования:

public class PipeServer 
    { 
     bool running; 
     Thread runningThread; 
     EventWaitHandle terminateHandle = new EventWaitHandle(false, EventResetMode.AutoReset); 
     public string PipeName { get; set; } 

     void ServerLoop() 
     { 
      while (running) 
      { 
       ProcessNextClient(); 
      } 

      terminateHandle.Set(); 
     } 

     public void Run() 
     { 
      running = true; 
      runningThread = new Thread(ServerLoop); 
      runningThread.Start(); 
     } 

     public void Stop() 
     { 
      running = false; 
      terminateHandle.WaitOne(); 
     } 

     public virtual string ProcessRequest(string message) 
     { 
      return ""; 
     } 

     public void ProcessClientThread(object o) 
     { 
      NamedPipeServerStream pipeStream = (NamedPipeServerStream)o; 

      //TODO FOR YOU: Write code for handling pipe client here 

      pipeStream.Close(); 
      pipeStream.Dispose(); 
     } 

     public void ProcessNextClient() 
     { 
      try 
      { 
       NamedPipeServerStream pipeStream = new NamedPipeServerStream(PipeName, PipeDirection.InOut, 254); 
       pipeStream.WaitForConnection(); 

       //Spawn a new thread for each request and continue waiting 
       Thread t = new Thread(ProcessClientThread); 
       t.Start(pipeStream); 
      } 
      catch (Exception e) 
      {//If there are no more avail connections (254 is in use already) then just keep looping until one is avail 
      } 
     } 
+0

@Brian: Почему вы говорите «у вас может быть только 254 одновременных клиентов»? По умолчанию NamedPipeServerStream указывает PIPE_UNLIMITED_INSTANCES при вызове API Win32 CreateNamedPipe, а в документации по Win32 указано, что количество создаваемых экземпляров труб ограничено только наличием системных ресурсов. –

+0

'ArgumentOutOfRangeException' вызывается, когда' maxNumberofServerInstances меньше единицы или больше 254. http://msdn.microsoft.com/en-us/library/bb355105.aspx –

+2

@Brian: Документация для NamedPipeServerStream ctor лежит. Значение '-1', соответствующее' PIPE_UNLIMITED_INSTANCES', также является приемлемым значением. 'Если (((maxNumberOfServerInstances <1) || (maxNumberOfServerInstances> 0xfe)) && (maxNumberOfServerInstances = -1)!) { певд ArgumentOutOfRangeException ("maxNumberOfServerInstances", SR.GetString ("ArgumentOutOfRange_MaxNumServerInstances")); } ' –

Смежные вопросы