異步資料接收有可能收到的資料不是一個完整包,或者接收到的資料超過一個包的大小,是以我們需要把接收的資料進行緩存。異步發送我們也需要把每個發送的包加入到一個隊列,然後通過隊列逐個發送出去,如果每個都實時發送,有可能造成上一個資料包未發送完成,這時再調用SendAsync會抛出異常,提示SocketAsyncEventArgs正在進行異步操作,是以我們需要建立接收緩存和發送緩存。
接收
通過Completed事件響應後調用AsyncSocketInvokeElement.ProcessReceive,在ProcessReceive中,我們把收到資料先寫入一個緩存,然後進行分包,分包後壓給包處理函數ProcessPacket,ProcessPacket函數然後調用ProcessCommand處理具體的指令,也是各個協定實作業務邏輯的地方,具體代碼如下:
發送
通過Completed事件響應後調用AsyncSocketInvokeElement.SendCompleted,在SendCompleted中我們需要在隊列中清除已發送的包,并檢測是否還有剩餘需要發送的資料包,如果有,則繼續發送,具體實作如下:
在AsyncSocketInvokeElement中提供函數給子類發送資料,業務邏輯是把目前資料包寫入緩存,并檢測目前是否正在發送包,如果正在發送,則等待回調,如果沒有正在發送的資料包,則投遞發送請求。