消息發(fā)送失敗重發(fā)如何實(shí)現(xiàn)?。咳绾闻袛嘞l(fā)送失???和大文件斷點(diǎn)續(xù)傳怎么實(shí)現(xiàn)啊?
消息失敗重發(fā)
如果要精確判斷每個(gè)消息是否發(fā)送到客戶端,服務(wù)端可以將每條消息都存儲(chǔ)起來(mysql等),并且設(shè)置個(gè)是否已讀字段??蛻舳耸盏较⒑蠓祷匾粋€(gè)確認(rèn)包給服務(wù)端,服務(wù)端把對(duì)應(yīng)消息在存儲(chǔ)中置為已讀。
如果鏈接斷開,服務(wù)端會(huì)觸發(fā)onClose,這時(shí)讀取存儲(chǔ)看下對(duì)應(yīng)客戶端的消息數(shù)據(jù)中是否有未確認(rèn)的消息,有的話就是有消息發(fā)送失敗,沒有就是全部發(fā)送成功。
失敗的消息可以在客戶端重新連接服務(wù)端時(shí)(登錄權(quán)限驗(yàn)證時(shí))從存儲(chǔ)中讀取出來,重新發(fā)給客戶端。
注意
TCP的有保證TCP數(shù)據(jù)包按照發(fā)送順序到達(dá)對(duì)端的機(jī)制,所以在同一個(gè)鏈接上重發(fā)數(shù)據(jù)一般說是沒有意義的。
例如在鏈接1上發(fā)送數(shù)據(jù)A,假如客戶端沒收到,服務(wù)端在鏈接1上又重發(fā)了一次數(shù)據(jù)A,假如第一次發(fā)送的A沒收到,那么第二次發(fā)送的數(shù)據(jù)A也一定收不到。
斷點(diǎn)續(xù)傳
有多種實(shí)現(xiàn)方法。比如客戶端告訴服務(wù)端文件md5是什么以及這個(gè)數(shù)據(jù)有多大,服務(wù)端將客戶端上傳的數(shù)據(jù)保存到本地文件(md5命名)。如果上傳過程中鏈接斷開,下次客戶端上傳的時(shí)候仍然發(fā)送文件md5,服務(wù)端找到本地磁盤對(duì)應(yīng)的文件,獲得當(dāng)前磁盤文件大小發(fā)給客戶端,客戶端就知道服務(wù)端接收了多大的數(shù)據(jù),然后客戶端將文件偏移對(duì)應(yīng)的位置的數(shù)據(jù)發(fā)送過來即可。