C# TCPListener


1: 有兩個地方必須做異常處理,異常類型為IOException 

服務器讀客戶端發來的信息時:

LeafTCPClient client = (LeafTCPClient)ar.AsyncState;
try
{

if (client.NetWork.Connected)
{
NetworkStream ns = client.NetWork.GetStream();
byte[] recdata = new byte[ns.EndRead(ar)];//遠程異常關閉時,執行完這句話后發生IOException異常

......

}

catch(IOException ex)

{

MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

  遠程客戶端異常斷開時(比如斷電),服務器正在讀客戶端發來的信息,若無異常處理,則會如下

服務器向客戶端寫數據時,如果此時客戶端已經異常斷開,則

2如何知曉遠程連接的客戶端突然斷開,比如客戶端突然斷電斷網

(1)心跳包,保持客戶端與服務器的數據交互

(2)向客戶端發送數據,客戶端如果是斷開連接的話,則會發生IOException,則在異常中釋放該TCPClient,釋放資源。

3  .NET/C# 實現 TCP 高性能服務的不同方式

  • 在任何 TCP Server 的實現中,一定存在一個 Accept Socket Loop,用於接收 Client 端的 Connect 請求以建立 TCP Connection。
  • 在任何 TCP Server 的實現中,一定存在一個 Read Socket Loop,用於接收 Client 端 Write 過來的數據。

如果 Accept 循環阻塞,則會導致無法快速的建立連接,服務端 Pending Backlog 滿,進而導致 Client 端收到 Connect Timeout 的異常。如果 Read 循環阻塞,則顯然會導致無法及時收到 Client 端發過來的數據,進而導致 Client 端 Send Buffer 滿,無法再發送數據。

從實現細節的角度看,能夠導致服務阻塞的位置可能在:

  1. Accept 到新的 Socket,構建新的 Connection 需要分配各種資源,分配資源慢;
  2. Accept 到新的 Socket,沒有及時觸發下一次 Accept;
  3. Read 到新的 Buffer,判定 Payload 消息長度,判定過程長;
  4. Read 到新的 Buffer,發現 Payload 還沒有收全,繼續 Read,則 "可能" 會導致一次 Buffer Copy;
  5. Payload 接收完畢,進行 De-Serialization 轉成可識別的 Protocol Message,反序列化慢;
  6. 由 Business Module 來處理相應的 Protocol Message,處理過程慢;

1-2 涉及到 Accept 過程和 Connection 的建立過程,3-4 涉及到 ReceiveBuffer 的處理過程,5-6 涉及到應用邏輯側的實現。

 http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM