天天看點

C#高性能大容量SOCKET并發(十一):編寫上傳用戶端

用戶端封裝整體架構

用戶端程式設計基于阻塞同步模式,隻有資料正常發送或接收才傳回,如果發生錯誤則抛出異常,基于TcpClient進行封裝,主要類結構如下圖:
C#高性能大容量SOCKET并發(十一):編寫上傳用戶端
TcpClient:NET系統封裝,實作了底層Socket操作,提供了阻塞和非阻塞調用; OutgoingDataAssembler m_outgoingDataAssembler:協定組裝器,用來組裝往外發送的指令,主要用于組裝協定格式; DynamicBufferManager m_sendBuffer:用于把指令和資料同時寫入到緩存中,調用一次發送,這樣伺服器就隻會産生一次IOCP回調,可以提高性能; IncomingDataParser m_incomingDataParser:收到資料的解析器,用于解析傳回的内容,主要是解析文本格式; protected DynamicBufferManager m_recvBuffer:接收資料的緩存,資料存到緩存中後,可以解析指令和資料;

TcpClient說明,阻塞和非阻塞

TcpClient封裝了NET的底層Socket操作,基于TCP協定,提供了阻塞和非阻塞模式調用,具體是設定m_tcpClient.Client.Blocking = true表示使用阻塞模式,反之則使用非阻塞模式。阻塞模式表示接收完指定長度的資料才傳回,非阻塞模式表示收到一點資料就傳回。 如我們調用m_tcpClient.Client.Receive(m_recvBuffer.Buffer, sizeof(int), packetLength, SocketFlags.None),假設傳入的長度為1024,阻塞模式一點要等到資料達到1024長度才傳回,否則一直等待Socket逾時或者鍊路斷了,非阻塞模式則不同,加入收到8位元組了,則傳回調用者,調用者使用循環繼續接受1024-8=1016的資料。

發送指令

發送資料和服務端相同,主要是對資料進行組包,然後調用發送函數發送,具體代碼如下:

接收指令

接收指令和發送相反,先接收長度,然後接收内容,然後對資料進行解包,具體代碼如下:

指令互動

封裝了底層Socket操作和協定解析後,實作一個指令互動如登入代碼如下:

上傳協定

上傳協定主要分為三個指令,第一個是Upload,向伺服器請求上傳的檔案,如果伺服器有相同的檔案,則傳回是否傳完,如果未傳完,傳回需要續傳的檔案位置,然後用戶端則從上一個位置開始傳輸,傳輸資料伺服器隻接收,不應答,用戶端傳輸完後,發完成(EOF)指令。是以三個指令封裝代碼如下:

調用過程: