框架详解_BeetleX框架详解SAEA对象
最初.NET并沒有提供SocketAsyncEventArgs對象給Socket進行使用,只是提供同步和異步(Begin/End)模式。但在.net 1.0發布后才發現異步(Begin/End)模式并不適合高并發吞吐的需求,主要因為這種模式下會產生大量的異步回調對象從而影響GC的性能。在.Net 1.1升級為了提升這一塊的性能,引用了SocketAsyncEventArgs對象;這個對象可以用在accept,send和receive等操作中,由于有著可復用性所以在高吞吐下有著更出色的性能表現。
雖然十幾年過去了,但還有不少普通開發者喜歡用同步或異步(Begin/End)模式,實際上為了得到更好的性能建議統一使用SocketAsyncEventArgs來進行Socket的相關操作。使用這個對象需要關注以下幾個屬性,方法和事件。
BufferList
設置接收和發送的緩存沖,這個屬性是一個IList>;可以把一組發送或接收的緩存區綁定在SocketAsyncEventArgs,從而實現批量的數據發送和接收處理,該屬性和SetBuffer方法只能二選一。在BeetleX則是選用SetBuffer方法來設置,而Aspcore的Socket模塊則選擇BufferList屬性,具體想用那個就看自己需求。
BytesTransferred
獲取當前接收或發送完成的字節數量,當接收為0零的情況下表示連接已經關閉無須再次調用接收;在發送完成后判斷完成數量是否和設置發送緩沖區數量設置是否一致,如果小于緩沖區的數量即需要做下偏移發送剩下的內容(.net core暫無發現這情況,但在代碼處理上建議做這判斷)。
ConnectSocket
此屬于用于獲取當前Accept的Socket,這屬性只有在AcceptAsync時有用(注意:在調用Socket.AcceptAsync前請把該屬性進行一個清空).
SocketError
獲取Socket相關操作狀態,雖然是名稱上是錯誤,但成功狀態也是它的狀態之一。此狀態值非常有用,通過不同的值可以得到連接不可用狀態是由什么引起的,對于網絡上的錯誤排查非常有用。以下是連接不同狀態的詳細描述。
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketerror?view=netcore-3.1
SetBuffer
設置接收或發送的緩沖區和BufferList屬性有所不同,此方法只能設置一個緩沖區。
Completed
異步操作完成事件,這個事件是在Socket相關操作后異步回調事件;這個事件的回調對象包括完成的情況狀態。在TCP通訊中這個事件中完成對應的方法有:AcceptAsync、ReceiveAsync和SendAsync。注意:當相關操作是同步完成的情況下是不會觸發事件,這個時候需要手動調用相關事件引用的方法。
UserToken
用戶自定義信息,在操作前把需要傳遞的信息設置到該屬性上,然后在完成事件進行獲取處理。一般用于保存當前Socket對應的會話狀態信息。
擴展功能
SocketAsyncEventArgs對象是可以繼承的,OnCompleted方法也可以重寫;可以根據自己的需要繼承它來擴展一些更方便的功能來滿足需求。組件為了后期方便使用也是從SocketAsyncEventArgs派生出一個新的對象SocketAsyncEventArgsX
public class SocketAsyncEventArgsX : SocketAsyncEventArgs { protected override void OnCompleted(SocketAsyncEventArgs e) { base.OnCompleted(e); if (e.SocketError != SocketError.Success) { LastSocket = null; } } public IBuffer BufferX { get; internal set; } public bool IsReceive { get; set; } public ISession Session { get; internal set; } public void AsyncFrom(System.Net.Sockets.Socket socket, object useToken, int size) public void AsyncFrom(ISession session, object useToken, int size) public void AsyncTo(System.Net.Sockets.Socket socket, object userToken, int length) public void AsyncTo(ISession session, object userToken, int length) }在這里擴展比較簡單主要是為了操作更方便,加了一些發送和接收的方法,對應的會話對象和關聯緩存對象。這樣封裝后SocketAsyncEventArgs除了針對Socket操作外還能直接針對會話對象進行操作。
BeetleX
開源跨平臺通訊框架(支持TLS)
輕松實現高性能:tcp、http、websocket、redis、rpc和網關等服務應用
https://beetlex.io
總結
以上是生活随笔為你收集整理的框架详解_BeetleX框架详解SAEA对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Steam 在 2022 共计上线 12
- 下一篇: 曝小米13还有大屏版!或采用6.7英寸直