專(zhuān)利名稱(chēng):一種異步網(wǎng)絡(luò)通信方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)通信技術(shù),尤其涉及一種異步網(wǎng)絡(luò)通信方法及裝置。
背景技術(shù):
操作系統(tǒng)中,執(zhí)行一個(gè)任務(wù)所需要使用的處理器或微控·制器的寄存器等資源,稱(chēng)為任務(wù)的上下文。執(zhí)行任務(wù)時(shí),系統(tǒng)會(huì)根據(jù)需要掛起或恢復(fù)任務(wù),而在這過(guò)程中,寄存器等資源可能發(fā)生變化,為了保證一個(gè)任務(wù)恢復(fù)時(shí),其所用的資源與之前該任務(wù)處于掛起狀態(tài)時(shí)相同,需要保存該任務(wù)在掛起時(shí)的上下文,并在任務(wù)恢復(fù)時(shí)恢復(fù)其上下文,稱(chēng)為上下文的切換。在現(xiàn)有的網(wǎng)絡(luò)通信技術(shù)中,當(dāng)前端用戶(hù)的請(qǐng)求線程越來(lái)越多時(shí),通常需要在客戶(hù)端的后臺(tái)開(kāi)啟額外的線程來(lái)完成異步通信,造成線程上下文頻繁的切換,導(dǎo)致系統(tǒng)性能低下。而且,在未建立對(duì)服務(wù)端的保護(hù)機(jī)制的情況下,當(dāng)客戶(hù)端的線程不斷地向服務(wù)端發(fā)出請(qǐng)求時(shí),容易導(dǎo)致服務(wù)端的請(qǐng)求擁塞,從而影響其他線程向服務(wù)端發(fā)出請(qǐng)求。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種異步網(wǎng)絡(luò)通信方法及裝置,可以有效以此降低線程上下文切換的頻率,提高系統(tǒng)的性能。根據(jù)本發(fā)明,所提供的異步網(wǎng)絡(luò)通信方法,包括以下步驟針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào);設(shè)置一個(gè)等待窗口,將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,注冊(cè)到等待窗口中,并將每次請(qǐng)求的函數(shù)接口以所述標(biāo)識(shí)號(hào)為鍵,放入等待窗口 ;針對(duì)客戶(hù)端的每次請(qǐng)求,均由服務(wù)端返回相應(yīng)的響應(yīng)包,并將響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口 ;解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。根據(jù)本發(fā)明的另一個(gè)方面,還提供了一種異步網(wǎng)絡(luò)通信裝置,包括以下模塊標(biāo)識(shí)設(shè)置模塊,用于針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào);等待窗口模塊,用于注冊(cè)以相應(yīng)的標(biāo)識(shí)號(hào)為鍵的每次請(qǐng)求和存儲(chǔ)以相應(yīng)的標(biāo)識(shí)號(hào)為鍵的每次請(qǐng)求的函數(shù)接口 ;接收響應(yīng)模塊,針對(duì)客戶(hù)端的每次請(qǐng)求而由服務(wù)端返回的相應(yīng)響應(yīng)包,將其響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口 ;解析響應(yīng)模塊,用于解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)I)可以有效降低線程上下文切換的頻率,提高系統(tǒng)的性能;2)可以顯著提高服務(wù)端的并發(fā)響應(yīng)能力,降低響應(yīng)時(shí)間;3)可以有效的進(jìn)行負(fù)載控制提高系統(tǒng)可用性。
通過(guò)閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯圖I為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的異步網(wǎng)絡(luò)通信方法流程圖;以及圖2為根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例的以回調(diào)函數(shù)和接收(receive)函數(shù)為例的異步網(wǎng)絡(luò)通信方法流程圖。
具體實(shí)施例方式下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。 根據(jù)本發(fā)明的一個(gè)方面,提供了一種異步網(wǎng)絡(luò)通信方法。需要說(shuō)明的是,本實(shí)施例中,可視客戶(hù)端的每次請(qǐng)求為一次線程的處理,下文將進(jìn)行詳細(xì)說(shuō)明。請(qǐng)參考圖1,圖I為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的異步網(wǎng)絡(luò)通信方法流程圖。如圖I所示,本發(fā)明所提供的異步網(wǎng)絡(luò)通信方法包括以下步驟步驟S101,針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào)(SessionID),也稱(chēng)為會(huì)話標(biāo)識(shí)。Session (會(huì)話)機(jī)制是一種標(biāo)識(shí)請(qǐng)求上下文的機(jī)制,客戶(hù)端使用一種類(lèi)似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息??蛻?hù)端每次發(fā)起一個(gè)新的請(qǐng)求時(shí),都會(huì)創(chuàng)建一個(gè)唯一標(biāo)識(shí)號(hào)(SessionID),主要用來(lái)匹配客戶(hù)端請(qǐng)求和服務(wù)器端的響應(yīng),SessionID存儲(chǔ)在等待窗口中。具體地,客戶(hù)端的請(qǐng)求包括各種類(lèi)型,有的請(qǐng)求發(fā)送到服務(wù)端后,無(wú)需服務(wù)端返回?cái)?shù)據(jù),如請(qǐng)求將數(shù)據(jù)添加到數(shù)據(jù)庫(kù),對(duì)于這種請(qǐng)求,不需要在客戶(hù)端的等待窗口中做相關(guān)的注冊(cè),客戶(hù)端封裝相應(yīng)的請(qǐng)求包發(fā)往服務(wù)端,服務(wù)端在接收到這種類(lèi)型的請(qǐng)求后直接進(jìn)行相關(guān)的處理,結(jié)果無(wú)需返回.有的請(qǐng)求發(fā)送到服務(wù)端后,需要服務(wù)端返回?cái)?shù)據(jù),如請(qǐng)求服務(wù)端統(tǒng)計(jì)當(dāng)日發(fā)布數(shù)據(jù)的用戶(hù)ID和所發(fā)布的數(shù)據(jù)內(nèi)容,并將統(tǒng)計(jì)的數(shù)據(jù)和發(fā)布的內(nèi)容反饋給客戶(hù)端,對(duì)于這種請(qǐng)求,對(duì)其定義一個(gè)回調(diào)函數(shù)(callback函數(shù)),其中,callback函數(shù)包含本領(lǐng)域技術(shù)人員通常所使用的含義,可以指通過(guò)函數(shù)指針調(diào)用的函數(shù),例如把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),稱(chēng)為回調(diào)函數(shù)。再例如,給統(tǒng)計(jì)數(shù)據(jù)的請(qǐng)求定義一個(gè)callback函數(shù),則從服務(wù)端返回統(tǒng)計(jì)數(shù)據(jù)的結(jié)果時(shí),將這個(gè)結(jié)果傳送到callback函數(shù)執(zhí)行,以進(jìn)行本請(qǐng)求需要處理的操作,如將統(tǒng)計(jì)的結(jié)果以圖表的方式進(jìn)行展示。綜上,回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用,用于對(duì)該事件或條件進(jìn)行響應(yīng)。對(duì)于客戶(hù)端的每次請(qǐng)求,都對(duì)其設(shè)定一個(gè)唯一的標(biāo)識(shí)號(hào),該標(biāo)識(shí)號(hào)優(yōu)選全局的、整數(shù)類(lèi)型的變量。如上文所述,可將每次請(qǐng)求視為一次線程的處理,而每個(gè)線程都有一個(gè)上下文,保存在線程的內(nèi)核對(duì)象中,這個(gè)上下文反映了請(qǐng)求執(zhí)行的狀態(tài),當(dāng)一個(gè)線程從掛起到恢復(fù)時(shí),需要恢復(fù)其上下文。由此,上文設(shè)定的標(biāo)識(shí)號(hào)可以對(duì)每次請(qǐng)求的上下文進(jìn)行標(biāo)識(shí)。步驟S102,設(shè)置一個(gè)等待窗口(WaitWindow),將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,并將需要處理請(qǐng)求所返回的數(shù)據(jù)的callback方法,注冊(cè)到等待窗口中。具體地,等待窗口為一個(gè)窗口變量,其中,存儲(chǔ)了客戶(hù)端的一些函數(shù)接口和服務(wù)端返回的數(shù)據(jù)。將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,注冊(cè)到等待窗口后,就可以根據(jù)標(biāo)識(shí)號(hào)從等待窗口中獲取相應(yīng)的數(shù)據(jù)。例如以時(shí)間為序,分別設(shè)置標(biāo)識(shí)號(hào)1、2、3,以標(biāo)識(shí)三個(gè)不同請(qǐng)求的上下文,并將這三個(gè)請(qǐng)求注冊(cè)到等待窗口后,就可以根據(jù)標(biāo)識(shí)號(hào)從等待窗口中獲取相應(yīng)的數(shù)據(jù)。將每次請(qǐng)求注冊(cè)到等待窗口的同時(shí),將每次請(qǐng)求的函數(shù)接口也以所述標(biāo)識(shí)號(hào)為鍵,放入等待窗口。如上文所述,不同請(qǐng)求中所定義的函數(shù)不同,如請(qǐng)求中定義的是callback函數(shù),則將該請(qǐng)求注冊(cè)到等待窗口的同時(shí),將該請(qǐng)求的callback函數(shù)接口放入等待窗口中,以等待服務(wù)端返回該接口所需的數(shù)據(jù)。步驟S103,針對(duì)客戶(hù)端的每次請(qǐng)求,均由服務(wù)端返回相應(yīng)的響應(yīng)包,并將響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口。具體地,客戶(hù)端的請(qǐng)求正常到達(dá)服務(wù)端以后,由服務(wù)端進(jìn)行相應(yīng)地處理,并將處理的結(jié)果返回給客戶(hù)端,例如,請(qǐng)求服務(wù)端統(tǒng)計(jì)當(dāng)日的發(fā)帖量,則服務(wù)端統(tǒng)計(jì)完當(dāng)日的發(fā)帖量 后,將統(tǒng)計(jì)的結(jié)果返回給客戶(hù)端,當(dāng)然,返回的內(nèi)容中,除了統(tǒng)計(jì)結(jié)果,還有一些其他內(nèi)容,如網(wǎng)絡(luò)通信協(xié)議版本號(hào)、請(qǐng)求的標(biāo)識(shí)號(hào)(也就是SessionID)、返回消息的長(zhǎng)度、返回的數(shù)據(jù)類(lèi)型、返回的數(shù)據(jù)內(nèi)容等等。為了簡(jiǎn)明起見(jiàn),將所返回的內(nèi)容定義為響應(yīng)包,通常,響應(yīng)包以協(xié)議的字節(jié)流形式返回。服務(wù)端返回響應(yīng)包后,如果響應(yīng)包正常到達(dá),客戶(hù)端從返回的響應(yīng)包中提取出SessionID和相關(guān)的數(shù)據(jù),根據(jù)SessionID在等待窗口中查找以SessionID為鍵的項(xiàng),如果找到則調(diào)用該項(xiàng)的鍵值中相關(guān)的Callback接口交接數(shù)據(jù)處理權(quán)。如果沒(méi)有找到則丟棄數(shù)據(jù)。如果響應(yīng)包超時(shí)到達(dá),則將所對(duì)應(yīng)的窗口數(shù)據(jù)移除,并拋出超時(shí)異常,進(jìn)行異常處理。其中,將等待窗口中每一份與請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)稱(chēng)為窗口數(shù)據(jù)。針對(duì)服務(wù)端返回響應(yīng)包的狀態(tài)信息,callback中定義了系列的事件(event),事件的內(nèi)容為當(dāng)服務(wù)端正常返回響應(yīng)包時(shí),根據(jù)相應(yīng)參數(shù),通知客戶(hù)端的相應(yīng)線程進(jìn)行操作,即該事件定義的是一個(gè)等待服務(wù)端返回響應(yīng)包和喚醒請(qǐng)求線程的過(guò)程。其中,event對(duì)象代表事件的狀態(tài),比如服務(wù)端是否正常返回響應(yīng)包。如上文所述,等待窗口中存入了客戶(hù)端所發(fā)送請(qǐng)求的標(biāo)識(shí)號(hào)、函數(shù)接口,還有服務(wù)端返回的響應(yīng)包的數(shù)據(jù)。步驟S104,解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。具體地,服務(wù)端返回響應(yīng)包后,客戶(hù)端對(duì)該響應(yīng)包進(jìn)行解析,將相應(yīng)的數(shù)據(jù)傳到相應(yīng)的請(qǐng)求線程。如上文所述,響應(yīng)包中存在請(qǐng)求的標(biāo)識(shí)號(hào)。解析響應(yīng)包時(shí),獲取其中的標(biāo)識(shí)號(hào),并找到與該標(biāo)識(shí)號(hào)相同的請(qǐng)求,將響應(yīng)包中的數(shù)據(jù)從等待窗口中,以參數(shù)的形式傳送到請(qǐng)求線程中的函數(shù)接口,由函數(shù)執(zhí)行相應(yīng)地功能。即根據(jù)標(biāo)識(shí)號(hào),將窗口數(shù)據(jù)傳送到請(qǐng)求的線程,用于后續(xù)操作。通常,將客戶(hù)端和服務(wù)端的一次通信稱(chēng)為一次會(huì)話,如此,客戶(hù)端發(fā)送一個(gè)請(qǐng)求時(shí),設(shè)置一個(gè)會(huì)話標(biāo)識(shí)號(hào),即上文提到的SessionID,而服務(wù)端返回響應(yīng)的數(shù)據(jù)時(shí),同樣,會(huì)帶回一個(gè)會(huì)話標(biāo)識(shí)號(hào),通過(guò)帶回來(lái)的標(biāo)識(shí)號(hào),找到客戶(hù)端中與該標(biāo)識(shí)號(hào)相同的標(biāo)識(shí)號(hào),并將窗口數(shù)據(jù)傳送到該標(biāo)識(shí)號(hào)的請(qǐng)求線程的函數(shù)接口,以進(jìn)行后續(xù)操作。例如,客戶(hù)端發(fā)送一個(gè)統(tǒng)計(jì)當(dāng)日發(fā)帖量的請(qǐng)求,設(shè)置本次會(huì)話的標(biāo)識(shí)號(hào)為1,如果服務(wù)端返回響應(yīng)的數(shù)據(jù)中,其中的一個(gè)標(biāo)識(shí)號(hào)為1,則將與標(biāo)識(shí)號(hào)I對(duì)應(yīng)的窗口數(shù)據(jù)傳送到標(biāo)識(shí)號(hào)為I的線程的函數(shù)接口,以進(jìn)行后續(xù)操作。需要說(shuō)明的是,本實(shí)施例中,標(biāo)識(shí)號(hào)與窗口數(shù)據(jù)是一一對(duì)應(yīng)的,即一個(gè)標(biāo)識(shí)號(hào)對(duì)應(yīng)一份窗口數(shù)據(jù)。優(yōu)選地,本實(shí)施例提供的 異步網(wǎng)絡(luò)通信方法還包括,對(duì)網(wǎng)絡(luò)通信的過(guò)程進(jìn)行擁塞控制,具體包括以下步驟a)將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制。具體地,在本技術(shù)領(lǐng)域,隊(duì)列是一種特殊的線性表,只允許在表的前端進(jìn)行刪除操作,在表的后端進(jìn)行插入操作。將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制,即發(fā)送時(shí)間較早的請(qǐng)求,排在隊(duì)列的較前端,通常越早由客戶(hù)端進(jìn)行處理。b)對(duì)所述隊(duì)列的長(zhǎng)度設(shè)置一個(gè)閾值,并在客戶(hù)端設(shè)置滑動(dòng)窗口,判斷一定時(shí)間內(nèi)隊(duì)列的長(zhǎng)度是否超過(guò)所述閾值,如果超過(guò),則將先加入的請(qǐng)求放入滑動(dòng)窗口 ;如果在所述閾值內(nèi),則將先加入的請(qǐng)求發(fā)送到服務(wù)端。具體地,本實(shí)施例基于異步機(jī)制進(jìn)行通信,換言之,客戶(hù)端將請(qǐng)求發(fā)送到服務(wù)端后,在未收到服務(wù)端返回的數(shù)據(jù)時(shí),即將處理本請(qǐng)求的線程進(jìn)行其他的操作。由此,客戶(hù)端可不斷地向服務(wù)端發(fā)送請(qǐng)求,一旦請(qǐng)求超過(guò)服務(wù)端的承受能力,就會(huì)造成服務(wù)端的數(shù)據(jù)擁塞。為了解決數(shù)據(jù)擁塞問(wèn)題,本發(fā)明在客戶(hù)端設(shè)置滑動(dòng)窗口,以控制請(qǐng)求發(fā)送的時(shí)延。當(dāng)然,滑動(dòng)窗口所采用的擁塞控制算法可以為本技術(shù)領(lǐng)域通用的算法。從客戶(hù)端發(fā)送請(qǐng)求時(shí),可通過(guò)滑動(dòng)窗口,容許客戶(hù)端在接收任何響應(yīng)之前傳送附加的請(qǐng)求,滑動(dòng)窗口的大小意味著服務(wù)端還有多大的緩沖區(qū)可以用于接收請(qǐng)求,客戶(hù)端也可以通過(guò)滑動(dòng)窗口的大小確定應(yīng)該發(fā)送多少字節(jié)的請(qǐng)求數(shù)據(jù)。為了使本實(shí)施例提供的異步網(wǎng)絡(luò)通信方法更加明確,下文以回調(diào)函數(shù)為例子進(jìn)行具體說(shuō)明,其中,還添加了擁塞控制機(jī)制。參照?qǐng)D2,圖2為根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例的以回調(diào)函數(shù)為例的異步網(wǎng)絡(luò)通信方法流程圖。根據(jù)圖2,異步網(wǎng)絡(luò)通信方法包括以下步驟步驟S201,客戶(hù)端發(fā)起請(qǐng)求。步驟S202,針對(duì)每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào)。步驟S203,以標(biāo)識(shí)號(hào)為鍵,將每次請(qǐng)求注冊(cè)到等待窗口中。步驟S204,將請(qǐng)求發(fā)往服務(wù)端之前,判斷請(qǐng)求隊(duì)列的長(zhǎng)度是否超過(guò)閾值,如果是,則進(jìn)入步驟S205 ;如果不是,則進(jìn)入步驟S206。步驟S205,將請(qǐng)求放入滑動(dòng)窗口中,通過(guò)擁塞控制算法控制發(fā)送的時(shí)延。步驟S206,將請(qǐng)求發(fā)往服務(wù)端。步驟S207,服務(wù)端收到請(qǐng)求后,判斷是否callback函數(shù)調(diào)用,如果不是,則直接處理還返回?cái)?shù)據(jù),進(jìn)入步驟S208 ;如果是,則將業(yè)務(wù)邏輯處理結(jié)果和所述的標(biāo)識(shí)號(hào)等相關(guān)信息封裝后返回給客戶(hù)端,進(jìn)入步驟S209。步驟S208,處理具體的業(yè)務(wù)邏輯。步驟S209,由客戶(hù)端接收服務(wù)端發(fā)回的響應(yīng)。步驟S210,判斷所接收的響應(yīng)是否超時(shí),如果是,進(jìn)入步驟S211,拋出異常,進(jìn)行異常處理,結(jié)束該線程;如果不是,進(jìn)入步驟S212,進(jìn)一步判斷是否callback函數(shù)調(diào)用,如果是,進(jìn)入步驟S213,調(diào)用callback函數(shù),進(jìn)行相應(yīng)處理,結(jié)束該線程。其中,callback函數(shù)可將正常接收的數(shù)據(jù)返回給請(qǐng)求線程,也可以喚醒請(qǐng)求線程進(jìn)行超時(shí)數(shù)據(jù)的異常處理。與現(xiàn)有技術(shù)相比,本發(fā)明所提供的異步網(wǎng)絡(luò)通信方法具有以下優(yōu)點(diǎn)I)通過(guò)設(shè)置等待窗口和對(duì)每次請(qǐng)求設(shè)置標(biāo)識(shí)號(hào),使得異步通信中,無(wú)需開(kāi)啟額外的線程進(jìn)行異步處理,這大大降低了線程的上下文切換頻率,提高了系統(tǒng)響應(yīng)的速度;2)通過(guò)設(shè)置滑動(dòng)窗口,可以對(duì)較好地解決服務(wù)端的數(shù)據(jù)擁塞問(wèn)題。
根據(jù)本發(fā)明的另一個(gè)方面,還提供了一種異步網(wǎng)絡(luò)通信裝置,包括以下模塊標(biāo)識(shí)設(shè)置模塊,用于針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào)。具體地,客戶(hù)端的請(qǐng)求包括各種類(lèi)型,有的請(qǐng)求發(fā)送到服務(wù)端后,無(wú)需服務(wù)端返回?cái)?shù)據(jù),如請(qǐng)求將數(shù)據(jù)添加到數(shù)據(jù)庫(kù),對(duì)于這種請(qǐng)求,不需要在客戶(hù)端的等待窗口中做相關(guān)的注冊(cè),客戶(hù)端封裝相應(yīng)的請(qǐng)求包發(fā)往服務(wù)端,服務(wù)端在接收到這種類(lèi)型的請(qǐng)求后直接進(jìn)行相關(guān)的處理,結(jié)果無(wú)需返回。有的請(qǐng)求發(fā)送到服務(wù)端后,需要服務(wù)端返回?cái)?shù)據(jù),如請(qǐng)求服務(wù)端統(tǒng)計(jì)當(dāng)日發(fā)布數(shù)據(jù)的用戶(hù)ID和所發(fā)布的數(shù)據(jù)內(nèi)容,并將統(tǒng)計(jì)的數(shù)據(jù)和發(fā)布的內(nèi)容反饋給客戶(hù)端,對(duì)于這種請(qǐng)求,也對(duì)其定義一個(gè)回調(diào)函數(shù)(callback函數(shù)),其中,callback函數(shù)包含本領(lǐng)域技術(shù)人員通常所使用的含義,可以指通過(guò)函數(shù)指針調(diào)用的函數(shù),例如把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),稱(chēng)為回調(diào)函數(shù)。再例如,給統(tǒng)計(jì)數(shù)據(jù)的請(qǐng)求定義一個(gè)callback函數(shù),則從服務(wù)端返回統(tǒng)計(jì)數(shù)據(jù)的結(jié)果時(shí),將這個(gè)結(jié)果傳送到callback函數(shù)執(zhí)行,以進(jìn)行本請(qǐng)求需要處理的操作,如將統(tǒng)計(jì)的結(jié)果以圖表的方式進(jìn)行展示。綜上,回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用,用于對(duì)該事件或條件進(jìn)行響應(yīng)。對(duì)于客戶(hù)端的每次請(qǐng)求,都由標(biāo)識(shí)設(shè)置模塊對(duì)其設(shè)定一個(gè)唯一的標(biāo)識(shí)號(hào),該標(biāo)識(shí)號(hào)優(yōu)選全局的、整數(shù)類(lèi)型的變量。如上文所述,可將每次請(qǐng)求視為一次線程的處理,而每個(gè)線程都有一個(gè)上下文,保存在線程的內(nèi)核對(duì)象中,這個(gè)上下文反映了線程上一次執(zhí)行時(shí)CPU的狀態(tài),當(dāng)一個(gè)線程從掛起到恢復(fù)時(shí),需要恢復(fù)其上下文。由此,上文設(shè)定的標(biāo)識(shí)號(hào)可以對(duì)每次請(qǐng)求的上下文進(jìn)行標(biāo)識(shí)。等待窗口模塊,用于注冊(cè)以相應(yīng)的標(biāo)識(shí)號(hào)為鍵的每次請(qǐng)求和存儲(chǔ)以相應(yīng)的標(biāo)識(shí)號(hào)為鍵的每次請(qǐng)求的函數(shù)接口。具體地,等待窗口模塊設(shè)置了等待窗口,等待窗口為一個(gè)窗口變量,其中,存儲(chǔ)了客戶(hù)端的一些函數(shù)接口和服務(wù)端返回的數(shù)據(jù)。將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,注冊(cè)到等待窗口后,就可以根據(jù)標(biāo)識(shí)號(hào)從等待窗口中獲取相應(yīng)的數(shù)據(jù)。例如以時(shí)間為序,分別設(shè)置標(biāo)識(shí)號(hào)1、2、3,以標(biāo)識(shí)三個(gè)不同請(qǐng)求的上下文,并將這三個(gè)請(qǐng)求注冊(cè)到等待窗口后,就可以根據(jù)標(biāo)識(shí)號(hào)從等待窗口中獲取相應(yīng)的數(shù)據(jù)。標(biāo)識(shí)設(shè)置模塊將每次請(qǐng)求注冊(cè)到等待窗口的同時(shí),由等待窗口模塊將每次請(qǐng)求的函數(shù)接口以所述標(biāo)識(shí)號(hào)為鍵,放入等待窗口。如上文所述,不同請(qǐng)求中所定義的函數(shù)不同,如請(qǐng)求中定義的是callback函數(shù),則將該請(qǐng)求注冊(cè)到等待窗口的同時(shí),將該請(qǐng)求的callback函數(shù)接口放入等待窗口中,以等待服務(wù)端返回該接口所需的數(shù)據(jù)。接收響應(yīng)模塊,針對(duì)客戶(hù)端的每次請(qǐng)求而由服務(wù)端返回的相應(yīng)響應(yīng)包,將其響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口。
具體地,客戶(hù)端的請(qǐng)求正常到達(dá)服務(wù)端以后,由服務(wù)端進(jìn)行相應(yīng)地處理,并將處理的結(jié)果返回給客戶(hù)端,例如,請(qǐng)求服務(wù)端統(tǒng)計(jì)當(dāng)日的發(fā)帖量,則服務(wù)端統(tǒng)計(jì)完當(dāng)日的發(fā)帖量后,將統(tǒng)計(jì)的結(jié)果返回給客戶(hù)端,當(dāng)然,返回的內(nèi)容中,除了統(tǒng)計(jì)結(jié)果,還有一些其他內(nèi)容,如網(wǎng)絡(luò)通信協(xié)議版本號(hào)、請(qǐng)求的標(biāo)識(shí)號(hào)、返回消息的長(zhǎng)度、返回的數(shù)據(jù)類(lèi)型、返回的數(shù)據(jù)內(nèi)容、方法執(zhí)行結(jié)果狀態(tài)等等。為了簡(jiǎn)明起見(jiàn),將所返回的內(nèi)容定義為響應(yīng)包,通常,響應(yīng)包以協(xié)議的字節(jié)流形式返回。服務(wù)端返回響應(yīng)包后,如果響應(yīng)包正常到達(dá),服務(wù)器返回?cái)?shù)據(jù)后客戶(hù)端接收并從數(shù)據(jù)中提取SessionId,根據(jù)SessionId在等待窗口中查找以SessionId為鍵的項(xiàng),如果找到則調(diào)用該項(xiàng)Value中相關(guān)的Callback接口交接數(shù)據(jù)處理權(quán)。如果沒(méi)有找到則丟棄數(shù)據(jù)。如果響應(yīng)包超時(shí)到達(dá),則拋出異常,進(jìn)行異常處理。其中,將等待窗口中每一份與請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)稱(chēng)為窗口數(shù)據(jù)。針對(duì)服務(wù)端返回響應(yīng)包的狀態(tài)信息,callback中定義了系列的事件(event),事件的內(nèi)容為當(dāng)服務(wù)端正常返回響應(yīng)包時(shí),根據(jù)相應(yīng)參數(shù),通知客戶(hù)端的相應(yīng)線程進(jìn)行操作,即該事件定義的是一個(gè)等待服務(wù)端返回響應(yīng)包和喚醒請(qǐng)求線程的過(guò)程。其中,event對(duì) 象代表事件的狀態(tài),比如服務(wù)端是否正常返回響應(yīng)包。如上文所述,等待窗口中存入了客戶(hù)端所發(fā)送請(qǐng)求的標(biāo)識(shí)號(hào)、函數(shù)接口,還有服務(wù)端返回的響應(yīng)包的數(shù)據(jù)。解析響應(yīng)模塊,用于解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。具體地,服務(wù)端返回響應(yīng)包后,客戶(hù)端對(duì)該響應(yīng)包進(jìn)行解析,將相應(yīng)的數(shù)據(jù)傳到相應(yīng)的請(qǐng)求線程。如上文所述,響應(yīng)包中存在請(qǐng)求的標(biāo)識(shí)號(hào)。解析響應(yīng)包時(shí),獲取其中的標(biāo)識(shí)號(hào),并找到與該標(biāo)識(shí)號(hào)相同的請(qǐng)求,將響應(yīng)包中的數(shù)據(jù)從等待窗口中,以參數(shù)的形式傳送到請(qǐng)求線程中的函數(shù)接口,由函數(shù)執(zhí)行相應(yīng)地功能。即根據(jù)標(biāo)識(shí)號(hào),將窗口數(shù)據(jù)傳送到請(qǐng)求的線程,用于后續(xù)操作。通常,將客戶(hù)端和服務(wù)端的一次通信稱(chēng)為一次會(huì)話,如此,客戶(hù)端發(fā)送一個(gè)請(qǐng)求時(shí),設(shè)置一個(gè)會(huì)話標(biāo)識(shí)號(hào),即上文提到的SessionID,而服務(wù)端返回響應(yīng)的數(shù)據(jù)時(shí),同樣,會(huì)帶回一個(gè)會(huì)話標(biāo)識(shí)號(hào),通過(guò)帶回來(lái)的標(biāo)識(shí)號(hào),找到客戶(hù)端中與該標(biāo)識(shí)號(hào)相同的標(biāo)識(shí)號(hào),并將窗口數(shù)據(jù)傳送到該標(biāo)識(shí)號(hào)的請(qǐng)求線程的函數(shù)接口,以進(jìn)行后續(xù)操作。例如,客戶(hù)端發(fā)送一個(gè)統(tǒng)計(jì)當(dāng)日發(fā)帖量的請(qǐng)求,設(shè)置本次會(huì)話的標(biāo)識(shí)號(hào)為1,如果服務(wù)端返回響應(yīng)的數(shù)據(jù)中,其中的一個(gè)標(biāo)識(shí)號(hào)為1,則將與標(biāo)識(shí)號(hào)I對(duì)應(yīng)的窗口數(shù)據(jù)傳送到標(biāo)識(shí)號(hào)為I的線程的函數(shù)接口,以進(jìn)行后續(xù)操作。需要說(shuō)明的是,本實(shí)施例中,標(biāo)識(shí)號(hào)與窗口數(shù)據(jù)是一一對(duì)應(yīng)的,即一個(gè)標(biāo)識(shí)號(hào)對(duì)應(yīng)一份窗口數(shù)據(jù)。優(yōu)選地,本實(shí)施例提供的異步網(wǎng)絡(luò)通信裝置還包括擁塞控制模塊,用于對(duì)網(wǎng)絡(luò)通信的過(guò)程進(jìn)行擁塞控制。擁塞控制模塊具體還包括隊(duì)列設(shè)置模塊,用于將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制。具體地,在本技術(shù)領(lǐng)域,隊(duì)列是一種特殊的線性表,只允許在表的前端進(jìn)行刪除操作,在表的后端進(jìn)行插入操作。將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制,即發(fā)送時(shí)間較早的請(qǐng)求,排在隊(duì)列的較前端,通常越早由客戶(hù)端進(jìn)行處理?;瑒?dòng)窗口和閾值設(shè)置模塊,用于對(duì)所述隊(duì)列的長(zhǎng)度設(shè)置閾值,并在客戶(hù)端設(shè)置滑動(dòng)窗口,判斷一定時(shí)間內(nèi)隊(duì)列的長(zhǎng)度是否超過(guò)所述閾值,如果超過(guò),則將先加入的請(qǐng)求放入滑動(dòng)窗口 ;如果在所述閾值內(nèi),則將先加入的請(qǐng)求發(fā)送到服務(wù)端。具體地,本實(shí)施例基于異步機(jī)制進(jìn)行通信,換言之,客戶(hù)端將請(qǐng)求發(fā)送到服務(wù)端后,在未收到服務(wù)端返回的數(shù)據(jù)時(shí),即將處理本請(qǐng)求的線程進(jìn)行其他的操作。由此,客戶(hù)端可不斷地向服務(wù)端發(fā)送請(qǐng)求,一旦請(qǐng)求超過(guò)服務(wù)端的承受能力,就會(huì)造成服務(wù)端的數(shù)據(jù)擁塞。為了解決數(shù)據(jù)擁塞問(wèn)題,在客戶(hù)端設(shè)置滑動(dòng)窗口,以控制請(qǐng)求發(fā)送的時(shí)延。當(dāng)然,滑動(dòng)窗口所采用的擁塞控制算法可以為本技術(shù)領(lǐng)域通用的算法。從客戶(hù)端發(fā)送請(qǐng)求時(shí),可通過(guò)滑動(dòng)窗口,容許客戶(hù)端在接收任何響應(yīng)之前傳送附加的請(qǐng)求,滑動(dòng)窗口的大小意味著服務(wù)端還有多大的緩沖區(qū)可以用于接收請(qǐng)求,客戶(hù)端也可以通過(guò)滑動(dòng)窗口的大小確定應(yīng)該發(fā)送多少字節(jié)的請(qǐng)求數(shù)據(jù)。本發(fā)明所提供的異步網(wǎng)絡(luò)通信裝置具有以下優(yōu)點(diǎn)
I)通過(guò)設(shè)置等待窗口和對(duì)每次請(qǐng)求設(shè)置標(biāo)識(shí)號(hào),使得異步通信中,無(wú)需開(kāi)啟額外的線程進(jìn)行異步處理,這大大降低了線程的上下文切換頻率,提高了系統(tǒng)響應(yīng)的速度;2)通過(guò)設(shè)置滑動(dòng)窗口,可以對(duì)較好地解決服務(wù)端的數(shù)據(jù)擁塞問(wèn)題。3)本發(fā)明較好地解決了線程的上下文切換和數(shù)據(jù)擁塞的問(wèn)題,提高了系統(tǒng)的性倉(cāng)泛。以上所揭露的僅為本發(fā)明的幾種較佳實(shí)施例而已,當(dāng)然不能以此來(lái)限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。
權(quán)利要求
1.一種異步網(wǎng)絡(luò)通信方法,包括以下步驟 針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào); 設(shè)置一個(gè)等待窗口,將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,注冊(cè)到等待窗口中,并將需要處理請(qǐng)求所返回的數(shù)據(jù)的回調(diào)方法注冊(cè)到等待窗口中; 針對(duì)客戶(hù)端的每次請(qǐng)求,均由服務(wù)端返回相應(yīng)的響應(yīng)包,并將響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口 ; 解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。
2.根據(jù)權(quán)利要求I所述的方法,其中,所述標(biāo)識(shí)號(hào)為全局變量;所述等待窗口存放客戶(hù)端所發(fā)送請(qǐng)求的標(biāo)識(shí)號(hào)、函數(shù)接口以及服務(wù)端返回的響應(yīng)包的數(shù)據(jù)。
3.根據(jù)權(quán)利要求I所述的方法,其中,所述的響應(yīng)包以協(xié)議的字節(jié)流形式返回,其中包括網(wǎng)絡(luò)通信協(xié)議版本號(hào)、請(qǐng)求的標(biāo)識(shí)號(hào)、返回消息的長(zhǎng)度、返回的數(shù)據(jù)類(lèi)型和返回的數(shù)據(jù)內(nèi)容。
4.根據(jù)權(quán)利要求1-3任一項(xiàng)所述的方法,還包括以下步驟 將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制; 對(duì)所述隊(duì)列的長(zhǎng)度設(shè)置一個(gè)閾值,并在客戶(hù)端設(shè)置滑動(dòng)窗口,判斷一定時(shí)間內(nèi)隊(duì)列的長(zhǎng)度是否超過(guò)所述閾值,如果超過(guò),則將先加入的請(qǐng)求放入滑動(dòng)窗口 ;如果在所述閾值內(nèi),則將先加入的請(qǐng)求發(fā)送到服務(wù)端。
5.根據(jù)權(quán)利要求4所述的方法,其中還包括以下步驟 服務(wù)端收到請(qǐng)求后,判斷是否回調(diào)函數(shù)調(diào)用; 如果是回調(diào)函數(shù)調(diào)用,則將業(yè)務(wù)邏輯處理結(jié)果和所述的標(biāo)識(shí)號(hào)以及相關(guān)信息返回給客戶(hù)端,否則直接處理還返回?cái)?shù)據(jù)。
6.一種異步網(wǎng)絡(luò)通信裝置,包括以下模塊 標(biāo)識(shí)設(shè)置模塊,用于針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào); 等待窗口模塊,用于注冊(cè)以相應(yīng)的標(biāo)識(shí)號(hào)為鍵的每次請(qǐng)求和注冊(cè)需要處理請(qǐng)求所返回的數(shù)據(jù)的回調(diào)方法; 接收響應(yīng)模塊,針對(duì)客戶(hù)端的每次請(qǐng)求而由服務(wù)端返回的相應(yīng)響應(yīng)包,將其響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口 ; 解析響應(yīng)模塊,用于解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。
7.根據(jù)權(quán)利要求6所述的裝置,其中,所述標(biāo)識(shí)號(hào)為全局的、整數(shù)類(lèi)型的變量。
8.根據(jù)權(quán)利要求6或7所述的裝置,其中,所述等待窗口存放客戶(hù)端所發(fā)送請(qǐng)求的標(biāo)識(shí)號(hào)、函數(shù)接口以及服務(wù)端返回的響應(yīng)包的數(shù)據(jù)。
9.根據(jù)權(quán)利要求6或7所述的裝置,其中,所述的響應(yīng)包以協(xié)議的字節(jié)流形式返回,包括網(wǎng)絡(luò)通信協(xié)議版本號(hào)、請(qǐng)求的標(biāo)識(shí)號(hào)、返回消息的長(zhǎng)度、返回的數(shù)據(jù)類(lèi)型和返回的數(shù)據(jù)內(nèi)容。
10.根據(jù)權(quán)利要求6-9任一項(xiàng)所述的裝置,還包括擁塞控制模塊,具體還包括 隊(duì)列設(shè)置模塊,用于將客戶(hù)端所有請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)設(shè)置成隊(duì)列機(jī)制; 滑動(dòng)窗口和閾值設(shè)置模塊,用于對(duì)所述隊(duì)列的長(zhǎng)度設(shè)置閾值,并在客戶(hù)端設(shè)置滑動(dòng)窗口,判斷一定時(shí)間內(nèi)隊(duì)列的長(zhǎng)度是否超過(guò)所述閾值,如果超過(guò),則將先加入的請(qǐng)求放入滑動(dòng) 窗口 ;如果在所述閾值內(nèi),則將先加入的請(qǐng)求發(fā)送到服務(wù)端。
全文摘要
本發(fā)明提供了一種異步網(wǎng)絡(luò)通信方法,包括以下步驟針對(duì)客戶(hù)端的每次請(qǐng)求,設(shè)置一個(gè)唯一的標(biāo)識(shí)號(hào);設(shè)置一個(gè)等待窗口,將每次請(qǐng)求以相應(yīng)的標(biāo)識(shí)號(hào)為鍵,注冊(cè)到等待窗口中,并將每次請(qǐng)求的函數(shù)接口以所述標(biāo)識(shí)號(hào)為鍵,放入等待窗口;針對(duì)客戶(hù)端的每次請(qǐng)求,均由服務(wù)端返回相應(yīng)的響應(yīng)包,并將響應(yīng)包的數(shù)據(jù)以所述標(biāo)識(shí)號(hào)為鍵,存入等待窗口;解析所返回的響應(yīng)包,獲取其中的標(biāo)識(shí)號(hào),根據(jù)所獲取的標(biāo)識(shí)號(hào),將響應(yīng)包中的數(shù)據(jù)傳到相應(yīng)的函數(shù)接口,由客戶(hù)端進(jìn)行相應(yīng)操作。本發(fā)明有效降低了線程上下文切換的頻率,提高了系統(tǒng)的性能。
文檔編號(hào)H04L29/06GK102801737SQ20121031158
公開(kāi)日2012年11月28日 申請(qǐng)日期2012年8月28日 優(yōu)先權(quán)日2012年8月28日
發(fā)明者劉曉飛, 陳春 申請(qǐng)人:北京城市網(wǎng)鄰信息技術(shù)有限公司