簡體   English   中英

TCP / IP .NET套接字效率

[英]TCP/IP .NET Sockets Efficiency

我創建了一個處理TCP連接的庫。 它存在於服務器和客戶端之外。 根據MSDN的所有示例以及受信任來源的建議,我應該在TcpClient和TcpListener之間建立連接,然后將數據從TcpClient發送到TcpListener並接收響應,最后關閉連接。

但是我采用了另一種方法:首先,我沒有使用異步連接。 其次,我沒有讓客戶端在向服務器發送數據后等待響應。 第三,我沒有關閉連接。

我不選擇異步路徑,因為我不知道使用它的好處。 我沒有讓客戶端等待響應,因為服務器不會響應某些消息。 我沒有關閉連接,因為我覺得客戶端需要很長時間才能重新連接到服務器,只是為了通過流快速發送一些數據。 由於連接沒有關閉,我仍然希望新客戶端能夠連接,因此我使現有客戶端的流偵聽器在不同的線程上偵聽。 由於我不知道如何使用FTP,因此我使用FileStream讀取文件並將其轉換為字節以通過TCP連接發送。

我的問題是:1.為什么使用異步連接? 2.客戶端是否應該始終收到服務器的響應? 3.如果您知道在上一次發送數據后不久將發送數據,則是否應該關閉連接。 4.讓不同的線程處理每個客戶端的通信是否是一個好主意。 即使不確定線程​​的執行方式,我也使用ThreadPool。 在一個線程中異步執行不同的操作嗎? 5.使用我的通過TCP連接從文件發送讀取字節以實現文件共享而不是使用FTP方法有什么缺點嗎?

  1. 為什么要使用異步連接?

異步避免阻塞操作。 阻塞操作意味着被阻塞的線程不可用於其他任何東西,如果它是UI線程,則UI也將被阻塞。

線程是寶貴的資源,在Windows *上 ,不要浪費線程等待可能永遠無法響應的其他進程。

  1. 客戶端是否應該始終收到服務器的響應? 3.如果您知道在上一次發送數據后不久將發送數據,則是否應該關閉連接。

這些都取決於您正在實現的協議。 在某些情況下,簡單的請求,響應和關閉是方法。 在其他情況下,大多數方式的連接可能會長期存在。 在某些情況下,單個客戶端可以使用多個並發套接字。

  1. 使不同的線程處理每個客戶端的通信是否是一個好主意

否。請參見上面有關線程昂貴的內容。 最好有一個小的線程池為大量的客戶端服務。 對於簡單的情況-例如。 學習的時候-它可以更容易地開始與每個客戶端模型的線程,但它不能按比例超出客戶的小**號。

最后 ,您幾乎不可能做得比框架中的要好:使用TCP / IP實施服務器的歷史上有很多經驗(失敗的方法*** )。

  1. 使用我的方法通過TCP連接從文件發送讀取字節以實現文件共享而不是使用FTP方法有什么缺點嗎?

您想要多長時間列表? 從...開始:

  • FTP是一種標准且受到廣泛支持。
  • FTP允許單個客戶端會話執行許多操作。
  • 在用盡其他資源之前,您將使CPU陷入線程調度的困境(假設您首先沒有耗盡線程堆棧的虛擬地址空間)。

*不同的操作系統具有不同的線程/進程模型,並具有不同的工程權衡。

**您沒有說系統的大小(客戶端數量,連接速率,數據量等),所以我只能說很籠統。

***例如, Socket類在其中支持三種不同的異步模型。

  1. 為什么異步? 這很容易! 您有2個選擇:打開新線程並在套接字讀取操作時將其阻止或使用異步套接字。 線程的唯一問題是線程是重物。 每個打開的.net線程都占用1MB的內存,並且您還需要開始考慮多線程范例。

  2. 沒有

  3. 沒有

  4. 沒有異步,您別無選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM