前言
成都創新互聯是專業的洪雅網站建設公司,洪雅接單;提供成都網站設計、做網站、成都外貿網站建設公司,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行洪雅網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!socket是軟件之間通訊最常用的一種方式。c#實現socket通訊有很多中方法,其中效率最高就是異步通訊。
異步通訊實際是利用windows完成端口(IOCP)來處理的,關于完成端口實現原理,大家可以參考網上文章。
我這里想強調的是采用完成端口機制的異步通訊是windows下效率最高的通訊方式,沒有之一!
異步通訊比同步通訊處理要難很多,代碼編寫中會遇到許多“坑“。如果沒有經驗,很難完成。
我搜集了大量資料,完成了對異步socket的封裝。此庫已用穩定高效的運行幾個月。
縱觀網上的資料,我還沒有遇到一個滿意的封裝庫。許多文章把數據收發和協議處理雜糅在一塊,代碼非常難懂,也無法擴展。
在編寫該庫時,避免以上缺陷。將邏輯處理層次化,模塊化!同時實現了高可用性與高性能。
為了使大家對通訊效率有初步了解,先看測試圖。
主機配置情況
百兆帶寬基本占滿,cpu占用40%,我的電腦在空閑時,cpu占用大概20%,也就是說程序占用cpu 20%左右。
這個庫是可擴展的,就是說即使10萬個連接,收發同樣的數據,cpu占用基本相同。
庫的結構圖
目標
即可作為服務端(監聽)也可以作為客戶端(主動連接)使用。
可以適應任何網絡協議。收發的數據針對字節流或一個完整的包。對協議內容不做處理。
高可用性。將復雜的底層處理封裝,對外接口非常友好。
高性能。大限度優化處理。單機可支持數萬連接,收發速度可達幾百兆bit。
實現思路
網絡處理邏輯可以分為以下幾個部分:
網絡監聽 可以在多個端口實現監聽。負責生成socket,生成的socket供后續處理。監聽模塊功能比較單一,如有必要,可對監聽模塊做進一步優化。
主動連接 可以異步或同步的連接對方。連接成功后,對socket的后續處理,與監聽得到的socket完全一樣。注:無論是監聽得到的socket,還是連接得到的socket,后續處理完全一樣。
Socket收發處理 每個socket對應一個收發實例,socket收發只針對字節流處理。收發時,做了優化。比如發送時,對數據做了沾包,提高發送性能;接收時,一次投遞1K的數據。
組包處理 一般數據包都有包長度指示;比如 報頭的前倆個字節表示長度,根據這個值就可以組成一個完整的包。
NetListener 監聽
using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace IocpCore { class NetListener { private Socket listenSocket; public ListenParam _listenParam { get; set; } public event Action<ListenParam, AsyncSocketClient> OnAcceptSocket; bool start; NetServer _netServer; public NetListener(NetServer netServer) { _netServer = netServer; } public int _acceptAsyncCount = 0; public bool StartListen() { try { start = true; IPEndPoint listenPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), _listenParam._port); listenSocket = new Socket(listenPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(listenPoint); listenSocket.Listen(200); Thread thread1 = new Thread(new ThreadStart(NetProcess)); thread1.Start(); StartAccept(); return true; } catch (Exception ex) { NetLogger.Log(string.Format("**監聽異常!{0}", ex.Message)); return false; } } AutoResetEvent _acceptEvent = new AutoResetEvent(false); private void NetProcess() { while (start) { DealNewAccept(); _acceptEvent.WaitOne(1000 * 10); } } private void DealNewAccept() { try { if(_acceptAsyncCount <= 10) { StartAccept(); } while (true) { AsyncSocketClient client = _newSocketClientList.GetObj(); if (client == null) break; DealNewAccept(client); } } catch (Exception ex) { NetLogger.Log(string.Format("DealNewAccept 異常 {0}***{1}", ex.Message, ex.StackTrace)); } } private void DealNewAccept(AsyncSocketClient client) { client.SendBufferByteCount = _netServer.SendBufferBytePerClient; OnAcceptSocket?.Invoke(_listenParam, client); } private void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs acceptEventArgs) { try { Interlocked.Decrement(ref _acceptAsyncCount); _acceptEvent.Set(); acceptEventArgs.Completed -= AcceptEventArg_Completed; ProcessAccept(acceptEventArgs); } catch (Exception ex) { NetLogger.Log(string.Format("AcceptEventArg_Completed {0}***{1}", ex.Message, ex.StackTrace)); } } public bool StartAccept() { SocketAsyncEventArgs acceptEventArgs = new SocketAsyncEventArgs(); acceptEventArgs.Completed += AcceptEventArg_Completed; bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArgs); Interlocked.Increment(ref _acceptAsyncCount); if (!willRaiseEvent) { Interlocked.Decrement(ref _acceptAsyncCount); _acceptEvent.Set(); acceptEventArgs.Completed -= AcceptEventArg_Completed; ProcessAccept(acceptEventArgs); } return true; } ObjectPool<AsyncSocketClient> _newSocketClientList = new ObjectPool<AsyncSocketClient>(); private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { try { using (acceptEventArgs) { if (acceptEventArgs.AcceptSocket != null) { AsyncSocketClient client = new AsyncSocketClient(acceptEventArgs.AcceptSocket); client.CreateClientInfo(this); _newSocketClientList.PutObj(client); _acceptEvent.Set(); } } } catch (Exception ex) { NetLogger.Log(string.Format("ProcessAccept {0}***{1}", ex.Message, ex.StackTrace)); } } } }
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
名稱欄目:C#中一個高性能異步socket封裝庫的實現思路分享-創新互聯
路徑分享:http://m.newbst.com/article4/hpgoe.html
成都網站建設公司_創新互聯,為您提供網站制作、移動網站建設、虛擬主機、服務器托管、小程序開發、網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯