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 滿,無法再發送數據。
從實現細節的角度看,能夠導致服務阻塞的位置可能在:
- Accept 到新的 Socket,構建新的 Connection 需要分配各種資源,分配資源慢;
- Accept 到新的 Socket,沒有及時觸發下一次 Accept;
- Read 到新的 Buffer,判定 Payload 消息長度,判定過程長;
- Read 到新的 Buffer,發現 Payload 還沒有收全,繼續 Read,則 "可能" 會導致一次 Buffer Copy;
- Payload 接收完畢,進行 De-Serialization 轉成可識別的 Protocol Message,反序列化慢;
- 由 Business Module 來處理相應的 Protocol Message,處理過程慢;
1-2 涉及到 Accept 過程和 Connection 的建立過程,3-4 涉及到 ReceiveBuffer 的處理過程,5-6 涉及到應用邏輯側的實現。
http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html
