2017-10-09 74 views
2

我正在創建一個windows服務,它接受TCP連接,處理髮送到服務器的數據,然後返回一條消息,說明過程已完成。有幾個客戶端將連接到該服務,並且該數量正在增長。爲了處理這些消息,我認爲使用非阻塞結構將是理想的。從最初的搜索,BeginAcceptTcpClient似乎是我正在尋找。我正在尋找at this tutorial以獲得樣本,但我有幾個問題如何工作。我的代碼基於這個例子如下。開始/異步tcplistener如何工作

  1. OnClientConnected函數中,爲什麼需要再次調用WaitForClients?爲什麼聽衆不一直都在聽呢?
  2. 如果在再次調用WaitForClients之前再次嘗試連接,會發生什麼情況?我知道這是OnClientConnected中的第一個聲明,但可能有兩個連接發生「同一時間」
  3. 我無法真正理解這是如何工作的多線程方面。如果我有10個模擬連接,看起來第一個將會輸入OnClientConnected,然後調用WaitForClients,這將允許處理另一個連接。這似乎是一種一次一個連接的方式,而不是有幾個可以處理大量流量的線程。

public class DeviceListener 
{ 
    private TcpListener listener = null; 

    public DeviceListener() 
    { 
     listener = new TcpListener(1001); 
    } 

    public void StartListener() 
    { 
     listener.Start(); 
     //TODO: Log listening started here 
     WaitForClients(); 
    } 

    private void WaitForClients() 
    { 
     listener.BeginAcceptTcpClient(OnClientConnected, null); 
    } 

    private void OnClientConnected(IAsyncResult asyncResult) 
    { 
     WaitForClients(); 
     TcpClient client = listener.EndAcceptTcpClient(asyncResult); 

     if(client != null) 
     { 
      //TODO: Log connected 
      HandleClientRequest(client); 
     } 
    } 

    private void HandleClientRequest(TcpClient client) 
    { 
     //Code to process client request 
    } 
} 

回答

2
  1. 沒有,它接受完全一樣多的連接BeginAcceptTcpClient調用,因此爲了接受一個又一個需要再次打電話BeginAcceptTcpClient。處理程序的開始似乎是一個合理的位置。
  2. 它將排隊和處理下一個電話BeginAcceptTcpClient或超時如果沒有及時發生。
  3. Please refer to the docs,這些很可能使用ThreadPool運行。