文件消息模型分片實現:
- 發送中沒法取消文件發送。若是發送方中斷了鏈接,那麼這個時候他是一箇中斷的狀態,他並非說他取消了整個文件的傳輸,這不屬於取消。
- 大文件傳輸過程中容錯率較低。由於咋們整個傳輸一旦出現問題,那麼整個文件的一個問題就暴露了,若是說這個文件很是大,大於了幾M甚至 是G的文件,那麼這樣的狀況下,整個文件是沒辦法進行校驗的,咱們不知道文件在哪一個部分可能會出現錯誤,而若是咱們把文件分紅一小份 一小份的方式傳輸,加入謀一份出現問題的時候,那麼前面的部分我能夠保證他的完整性。
- 同一鏈接沒法實現文件、普通消息優先級。咱們在隊列當中加入了一個文件傳輸的消息,而且加入了一個字符串的消息,此時文件傳輸的消息先 進行執行了,那此時他會徹底佔用整個鏈接,直到文件傳輸完成以後,纔會去發送咋們的普通消息。在這個過程中沒法中途去中斷咋們的 文件消息,在中途去添加咋們的文字消息,必定得等到前面的文件徹底發送完畢以後,才能夠發送你的普通消息,這是一個劣勢。固然你能夠 把他分紅不一樣的鏈接,這就暴露了咋們必須基於一個Packet發送完成,才能發送下一個Packet,沒法實現多個Packet同時發送的可能性,在 同一個鏈接當中,這就是劣勢。
文件數據分片
無非就是把一個大的數據分紅不一樣的小份數據,一小份一小份的發送,每一個小份數據包前面都攜帶一個頭部,來描述這一小份數據的長度。而後 接受方,會分別接受到一個小的數據頭,而且進過這個頭的計算以後,他能夠獲得我後面這個小的幀的大小。而後接收方接受到許多許多這些 小份數據,最終再把這些分片的頭部去掉,只留下內容,把內容組合起來就造成了咋們Packet的body部分,也就實現了咋們數據分片傳輸的理論 實現。
分片數據傳輸流程
首先Packet依然是input stream,而後會加入一個小的buffer,這個buffer可能存在於讀取的channel當中,而後我會把數據經過咋們的buffer ,接受到數據以後,再把每個buffer數據填充到Frame分片裏面去。而後咋們的分片接受完了以後有可能沒有接受滿,這個時候會循環的讀取, 直到把當前的分片讀取滿了以後,這個時候會把這個分片發送,這就是新的傳輸邏輯。
分片邏輯實現:
- 根據文件大小計算分片、並讀取數據分片。
- 分片數據固定格式打包發送。
- 分片數據解析與分片組裝。
- Dispatcher調度邏輯調整。這裏能夠理解爲咱們以前的一個發送是基於咋們的Packet級別,Packet首先把數據傳輸到IoArgs裏面,最後在將IoArgs 進行一個網絡發送,能夠理解爲這是2層的一個數據緩存。這個時候咱們又給他加入新的東西叫作分片,這個地方咱們能夠理解爲他實際上是3層緩存的 邏輯,那麼越往外層Packet級別走就越大,越往內層走,那麼它越小,越貼近於實際的網絡傳輸的底層的一個邏輯。
Packet規則
Packet部分,先發送包頭,再根據包頭信息去接受包體。
分片消息規則
幀不須要太大,由於他是承載數據的,這裏只給當前幀大小分配了2個字節,而且2個字節強制他只能是正數,這2個字節標識的最大信息長度是 65535個字節,由於0佔了一個字節。幀類型表明這是首幀仍是數據幀,幀標誌信息這個字節能夠存儲一些加密的信息。對應包惟一標識這1個字節 只有正數,表明1-255之間的一個值 0通常不使用,能夠理解爲個人一個消息Packet標識爲1,他的頭髮送的時候,這個頭幀是1,他的數據幀也是 1,第二個Packet過來的時候,我會給他分配爲2,分配爲2的狀況下,他頭幀天然而然是2,數據幀也是2。那麼我接受到數據爲2的時候,我就往 一樣的這個接受方往一樣的Packet裏賽數據,這種狀況下,我能夠最多實現併發255這樣的Packet消息傳輸。預留空間用於可能性的擴展。
首幀數據內容
紅色框上面是每一幀數據的部分,紅色框起來的部分是數據部分。首幀數據裏面Data Length(5)是整個包體的大小,用5個字節來表示。 Data Type(1)表明type值。
文件快傳總結:
- 文件傳輸與普通消息傳輸的區別。
- 重點:分片數據的概念、數據包發送與接受實現。把一個大的Packet分紅不一樣的小的分片Frame,每一個小的分片進行獨立的傳輸,把小的分片 傳輸與接受整個流程拉通以後,前面的Packet能夠作分片的發送,接受方能夠接受到不一樣的分片,而後根據不一樣的分片,拼接到不一樣的 Packet裏面去,最終實現咋們數據包的一個發送與接受的實現。
- 難點:若是進行一個數據分片並在穿插的狀況下進行Packet組合