UDP,鑒於其丟包和亂序(后發先至)問題,為保證其可靠性設計如下報頭協議,供大家參考
數據包設計
數據包總大小按照MTU設計設置,小於1500字節
數據包示意圖
包頭類型說明
1.類型(1字節)
數值 | 說明 |
---|---|
0 | 文字類型 |
1 | 圖片類型 |
2 | 文件類型 |
2.傳輸狀態(1字節)
目前數值4未使用,可考慮后期使用
數值 | 說明 |
---|---|
0 | 客戶端發送給服務器提示要傳大文件 |
1 | 服務器發送給客戶端已准備好接受 |
2 | 客戶端發送文件中 |
3 | 客戶端發送完成,詢問服務端接收情況 |
4 | 服務端發送客戶端接收完成 |
5 | 要求客戶端重發丟包數據 |
6 | 用於文件數據適用於單個包發送 |
3.包序列號(2字節):序列號為發送包在分割包中的位置
4.大文件傳輸的分割包總數(2字節):用於確定包是否接收完整有無丟包
傳輸思路
1.在大文件發送時進行通知准備和准備確定
- client端發起大文件發送請求(包頭:文件類型:6,傳輸狀態為0,包序列號0,總包數:分割包總數)
- server端收到請求,完整准備后,回復請求發送分割包(包頭:文件類型:6,傳輸狀態為1,包序列號0,總包數:1)
2.大文件(各分割包)傳輸
- client端發送各個分割數據包(包頭:文件類型,傳輸狀態為2,包序列號:分割包位置,總包數:分割包總數)
- server端通過包頭部分識別包的類型,序列號等保存接收到的各個數據包體
3.大文件發送完畢
- client端發起傳輸完畢請求(包頭:文件類型:6,傳輸狀態為3,包序列號0,總包數:1)
- server通過檢查接收的包個數,回復client端接收情況
- 數據包完整,按照序列號拼接數據,進行展示
- 數據包有丟失,向client端發起重發請求(包頭:文件類型:6,傳輸狀態為5,包序列號0,總包數:1),包體中以數組方式存放未接收到的數據包序列號,回到步驟2
4.文件傳輸示意圖
OC代碼
這里不po出具體代碼,有興趣的同學可自行前往下載demo,demo中有使用opencv,如不需要自行刪除即可,如文中有錯誤之處望指出!