例子主要包括SocketAsyncEventArgs通訊封裝、服務端實現日志查看、SCOKET列表、上傳、下載、遠程文件流、吞吐量協議,用於測試SocketAsyncEventArgs的性能和壓力,最大連接數支持65535個長連接,最高命令交互速度達到250MB/S(使用的是127.0.0.1的方式,相當於千兆網卡1Gb=125MB/S兩倍的吞吐量)。服務端用C#編寫,並使用log4net作為日志模塊;客戶端使用DELPHI編寫,和以前的DELPHI版完成端口共用一個客戶端,提供C#版的上傳客戶端。
C#版完成端口具有以下特點:
- 連接在線管理(提供在線連接維護,連接會話管理,數據接收,連接斷開等相關事件跟蹤);
- 發送數據智能合並(組件會根據資源使用情況,對多個同時發送向同一連接的多個消息數據進行合並寫入緩沖區;
- 內存池管理(提供一系列的接收和發送buffer可復用池);
- 數據讀寫封裝;
- 通訊協議封裝;
由不同的類負責實現,比MSDN的例子代碼多了不少邏輯,為了方便大家閱讀和理解,把整體類框架設計整體如下。
類結構圖
服務端
服務端是一個控制台程序,支持分顏色顯示日志,界面截圖如下:
客戶端
用於對服務端進行性能測試,實現了吞吐量測試協議,還有日志、查看客戶端、上傳、下載、遠程文件流五個應用層協議,可以作為要實現其他協議的例子參考,其中遠程文件流可以作為分布式系統的底層數據交互模塊,界面截圖如下:
暫不提供NET的客戶端,NET的界面編程還在學習中,非常抱歉。
性能測試結果
支持65535個長連接,為了支持65535個連接,需要把程序用64位進行編譯。
循環發包網絡流量可以達到250MB/S,受限於是網卡流量,千兆網卡最大1Gb=125MB/S,為了測試最大吞吐量,我們需要把客戶端和服務器放在同一台電腦上,使用127.0.0.1這個IP測試,127.0.0.1是本機回送地址(Loopback Address),即主機IP堆棧內部的IP地址,主要用於網絡軟件測試以及本地機進程間通信,無論什么程序,一旦使用回送地址發送數據,協議軟件立即返回,不進行任何網絡傳輸。
其中截圖如下:
按文件上傳下載對服務器進行應用層速率測試,分為1、16、64、256個並發進行測試,發包大小分1、2、4、8、16、32、64、128、256、512、1024KB,測試結果匯總如下,其中最高速率達到250MB/S,綜合最優發包大小為16、32KB,其中速率計算有可能存在偏差,因為傳到最后,並發數會變小,造成整個的速率上升,可以作為性能測試的參考。
DEMO下載地址:http://download.csdn.net/detail/sqldebug_fan/7467745
免責聲明:此代碼只是為了演示C#完成端口編程,僅用於學習和研究,切勿用於商業用途。水平有限,C#也屬於初學,錯誤在所難免,歡迎指正和指導。郵箱地址:fansheng_hx@163.com。