專利名稱:一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)服務(wù)端多線程環(huán)境下的數(shù)據(jù)處理領(lǐng)域,尤其涉及一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法。
背景技術(shù):
在CS架構(gòu)的服務(wù)端通信中,為了處理多個(gè)客戶端并發(fā)的請求,往往會開啟多個(gè)線程或者是線程池來處理業(yè)務(wù),以提高服務(wù)的處理能力,如果一個(gè)客戶端連續(xù)向服務(wù)器發(fā)送請求包,而且對包的先后順序有嚴(yán)格的要求,在這種情況下,服務(wù)器的多線程處理就有可能打亂此客戶端數(shù)據(jù)包的先后順序,不能保證客戶端的數(shù)據(jù)包順序到達(dá)服務(wù)端,順序返回客戶端。
發(fā)明內(nèi)容
針對上述技術(shù)問題,本發(fā)明設(shè)計(jì)開發(fā)了一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,目的在保證客戶端的數(shù)據(jù)包順序到達(dá)服務(wù)端,順序返回客戶端,有效控制多線程化境下的數(shù)據(jù)包的處理順序。本發(fā)明提供的技術(shù)方案為:一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,包括以下步驟:步驟一、一個(gè)線程不斷接收多個(gè)客戶端向服務(wù)端發(fā)送的多個(gè)數(shù)據(jù)包并放到源隊(duì)列中緩存;步驟二、另一個(gè)線程循環(huán)的遍歷源隊(duì)列,每遍歷一條記錄就判斷這條記錄是否在目標(biāo)隊(duì)列中,若不在目標(biāo)隊(duì)列中,就將這條記錄取出放到目標(biāo)隊(duì)列尾部,并記下此客戶端的ID,接著遍歷下一條記錄,若在目標(biāo)隊(duì)列中,判斷這條記錄之前是否存在同一客戶端的數(shù)據(jù)包在等待處理,若不存在,記下這個(gè)位置,接著遍歷下一條記錄,若存在,跳到等待處理的數(shù)據(jù)包的位置,取出這個(gè)數(shù)據(jù)包放到目標(biāo)隊(duì)列尾部,接著遍歷下一條記錄;步驟三、其他線程不斷從目標(biāo)隊(duì)列取走排在頭部的客戶端的數(shù)據(jù)包進(jìn)行處理。優(yōu)選的是,所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,一個(gè)客戶端一次向服務(wù)端發(fā)送一個(gè)數(shù)據(jù)包,所述數(shù)據(jù)包按服務(wù)端接收的先后順序保存到源隊(duì)列中。優(yōu)選的是,所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,所述目標(biāo)隊(duì)列中只能保存一個(gè)客戶端的一個(gè)數(shù)據(jù)包。優(yōu)選的是,所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,當(dāng)發(fā)現(xiàn)目標(biāo)隊(duì)列中有客戶端的數(shù)據(jù)包被處理完成,馬上從源隊(duì)列中取出這個(gè)客戶端等待處理的數(shù)據(jù)包填充到目標(biāo)隊(duì)列尾部。優(yōu)選的是,所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,所述步驟二源隊(duì)列中已經(jīng)放到目標(biāo)隊(duì)列的記錄刪除后,繼續(xù)從源隊(duì)列頭部開始遍歷源隊(duì)列。本發(fā)明所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法具有以下有益效果:服務(wù)端最初接收到的數(shù)據(jù)包保存在源隊(duì)列中,它本身就是有序的,保證了客戶端的數(shù)據(jù)包順序到達(dá)服務(wù)端。由于目標(biāo)隊(duì)列保存的是一個(gè)客戶端的一個(gè)數(shù)據(jù)包,不會有這個(gè)客戶端的第二個(gè)數(shù)據(jù)包,因此經(jīng)過遍歷后,多個(gè)客戶端的數(shù)據(jù)包將從源隊(duì)列順序放到目標(biāo)隊(duì)列中進(jìn)行數(shù)據(jù)處理,保證了處理后的數(shù)據(jù)順序返回客戶端,有效控制了多線程化境下的數(shù)據(jù)包的處理順序。
圖1是本發(fā)明所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法的流程圖;圖2是本發(fā)明的一個(gè)實(shí)施例的示意圖。
具體實(shí)施例方式下面結(jié)合附圖對本發(fā)明做進(jìn)一步的詳細(xì)說明,以令本領(lǐng)域技術(shù)人員參照說明書文字能夠據(jù)以實(shí)施。如圖1所示,本發(fā)明提供一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,包括以下步驟:步驟一、一個(gè)線程不斷接收多個(gè)客戶端向服務(wù)端發(fā)送的多個(gè)數(shù)據(jù)包并放到源隊(duì)列中緩存;步驟二、另一個(gè)線程循環(huán)的遍歷源隊(duì)列,每遍歷一條記錄就判斷這條記錄是否在目標(biāo)隊(duì)列中,若不在目標(biāo)隊(duì)列中,就將這條記錄取出放到目標(biāo)隊(duì)列尾部,并記下此客戶端的ID,接著遍歷下一條記錄,若在目標(biāo)隊(duì)列中,判斷這條記錄之前是否存在同一客戶端的數(shù)據(jù)包在等待處理,若不存在,記下這個(gè)位置,接著遍歷下一條記錄,若存在,跳到等待處理的數(shù)據(jù)包的位置,取出這個(gè)數(shù)據(jù)包放到目標(biāo)隊(duì)列尾部,接著遍歷下一條記錄;步驟三、其他線程不斷從目標(biāo)隊(duì)列取走排在頭部的客戶端的數(shù)據(jù)包進(jìn)行處理。所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,一個(gè)客戶端一次向服務(wù)端發(fā)送一個(gè)數(shù)據(jù)包,所述數(shù)據(jù)包按服務(wù)端接收的先后順序保存到源隊(duì)列中。所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,所述目標(biāo)隊(duì)列中只能保存一個(gè)客戶端的一個(gè)數(shù)據(jù)包。所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,當(dāng)發(fā)現(xiàn)目標(biāo)隊(duì)列中有客戶端的數(shù)據(jù)包被處理完成,馬上從源隊(duì)列中取出這個(gè)客戶端等待處理的數(shù)據(jù)包填充到目標(biāo)隊(duì)列尾部。所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法中,所述步驟二源隊(duì)列中已經(jīng)放到目標(biāo)隊(duì)列的記錄刪除后,繼續(xù)從源隊(duì)列頭部開始遍歷源隊(duì)列。本發(fā)明的實(shí)施例中,客戶端以user表示,數(shù)據(jù)包以packet表示,用數(shù)字1、2、3......區(qū)分不同的客戶端和數(shù)據(jù)包。多個(gè)客戶端不斷向服務(wù)端發(fā)送數(shù)據(jù)包,一個(gè)線程將四個(gè)客戶端發(fā)送的八個(gè)數(shù)據(jù)包按接收到的先后順序保存到源隊(duì)列中,另一個(gè)線程循環(huán)遍歷源隊(duì)列,將userl的packetl移到目標(biāo)隊(duì)列,并記下此userl正在被處理,當(dāng)遍歷到userl,packet2時(shí),發(fā)現(xiàn)源隊(duì)列有userl的packetl正在處理,而且在它之前沒有userl的packet在等待處理,記下userl的packet2的位置N,接著遍歷下一條,當(dāng)遍歷到user2, packetl時(shí),發(fā)現(xiàn)不在目標(biāo)隊(duì)列中,將它移到目標(biāo)隊(duì)列中,依次類推,user3, packetl和user4, packet2都被移動目標(biāo)隊(duì)列中。刪除源隊(duì)列中已經(jīng)移到目標(biāo)隊(duì)列的數(shù)據(jù)包,用NULL表示已刪除,繼續(xù)從源隊(duì)列頭部開始遍歷此隊(duì)列,重復(fù)前面的操作。若目標(biāo)隊(duì)列中的userl,packetl已經(jīng)被處理掉了,正好源隊(duì)列遍歷到了 userl,packet3位置,發(fā)現(xiàn)在它之前有userl,packet2在等待處理,優(yōu)先處理userl, packet2,將userl, packet2放到目標(biāo)隊(duì)列尾部,然后跳回到userl,packet3位置開始重新遍歷,最終目標(biāo)隊(duì)列中保存的是所有user的單個(gè)數(shù)據(jù)包,其他的包將留在源隊(duì)列中等待處理。盡管本發(fā)明的實(shí)施方案已公開如上,但其并不僅僅限于說明書和實(shí)施方式中所列運(yùn)用,它完全可以被適用于各種適合本發(fā)明的領(lǐng)域,對于熟悉本領(lǐng)域的人員而言,可容易地實(shí)現(xiàn)另外的修改,因此在不背離權(quán)利要求及等同范圍所限定的一般概念下,本發(fā)明并不限于特定的細(xì)節(jié)和這里示出與描述的圖例。
權(quán)利要求
1.一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,包括以下步驟: 步驟一、一個(gè)線程不斷接收多個(gè)客戶端向服務(wù)端發(fā)送的多個(gè)數(shù)據(jù)包并放到源隊(duì)列中緩存; 步驟二、另一個(gè)線程循環(huán)的遍歷源隊(duì)列,每遍歷一條記錄就判斷這條記錄是否在目標(biāo)隊(duì)列中,若不在目標(biāo)隊(duì)列中,就將這條記錄取出放到目標(biāo)隊(duì)列尾部,并記下此客戶端的ID,接著遍歷下一條記錄,若在目標(biāo)隊(duì)列中,判斷這條記錄之前是否存在同一客戶端的數(shù)據(jù)包在等待處理,若不存在,記下這個(gè)位置,接著遍歷下一條記錄,若存在,跳到等待處理的數(shù)據(jù)包的位置,取出這個(gè)數(shù)據(jù)包放到目標(biāo)隊(duì)列尾部,接著遍歷下一條記錄; 步驟三、其他線程不斷從目標(biāo)隊(duì)列取走排在頭部的客戶端的數(shù)據(jù)包進(jìn)行處理。
2.如權(quán)利要求1所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,一個(gè)客戶端一次向服務(wù)端發(fā)送一個(gè)數(shù)據(jù)包,所述數(shù)據(jù)包按服務(wù)端接收的先后順序保存到源隊(duì)列中。
3.如權(quán)利要求2所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,所述目標(biāo)隊(duì)列中只能保存一個(gè)客戶端的一個(gè)數(shù)據(jù)包。
4.如權(quán)利要求3所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,當(dāng)發(fā)現(xiàn)目標(biāo)隊(duì)列中有客戶端的數(shù)據(jù)包被處理完成,馬上從源隊(duì)列中取出這個(gè)客戶端等待處理的數(shù)據(jù)包填充到目標(biāo)隊(duì)列尾部。
5.如權(quán)利要求4所述的基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,所述步驟二源隊(duì)列中已經(jīng)放到目標(biāo)隊(duì)列的記錄刪除后,繼續(xù)從源隊(duì)列頭部開始遍歷源隊(duì)列。
全文摘要
本發(fā)明公開了一種基于多線程環(huán)境網(wǎng)絡(luò)數(shù)據(jù)包亂序控制方法,其特征在于,包括以下步驟一個(gè)線程不斷接收多個(gè)客戶端向服務(wù)端發(fā)送的數(shù)據(jù)包放到源隊(duì)列中緩存;另一個(gè)線程循環(huán)遍歷源隊(duì)列,每遍歷一條記錄就判斷是否在目標(biāo)隊(duì)列中,若不在,就將這條記錄取出放到目標(biāo)隊(duì)列尾部,并記下此客戶端的ID,接著遍歷下一條記錄,若在,判斷這條記錄之前是否存在同一客戶端的數(shù)據(jù)包在等待處理,若不存在,記下這個(gè)位置,接著遍歷下一條記錄,若存在,跳到等待處理的數(shù)據(jù)包位置,取出這個(gè)數(shù)據(jù)包放到目標(biāo)隊(duì)列尾部,接著遍歷下一條記錄;其他線程不斷從目標(biāo)隊(duì)列取走排在頭部的客戶端的數(shù)據(jù)包進(jìn)行處理。本發(fā)明所述的方法有效控制了多線程化境下的數(shù)據(jù)包的處理順序。
文檔編號H04L29/08GK103078811SQ201310037379
公開日2013年5月1日 申請日期2013年1月31日 優(yōu)先權(quán)日2013年1月31日
發(fā)明者徐志剛, 張立 申請人:北京金和軟件股份有限公司