本發(fā)明涉及數(shù)據(jù)處理領域,具體而言,涉及數(shù)據(jù)發(fā)送、接收方法及其裝置。
背景技術:
::目前,Table是Lua腳本語言中表現(xiàn)力最豐富的數(shù)據(jù)結構。在應用中可以使用table來表示數(shù)據(jù),例如,在游戲進程中可以用如下一個table來表示玩家的數(shù)據(jù):當要在服務器與客戶端或不同的服務器(簡稱為跨服)之間傳輸數(shù)據(jù)的時候,例如,傳輸key-value(名-值)形式的數(shù)據(jù)時,在相關技術中是發(fā)送方將table序列化(Serialize)成文本,接收方再將文本編譯成字節(jié)碼,執(zhí)行還原出table。使用這種傳輸方式時,在table較大的情況下,接收方編譯會有不小的CPU開銷,還原速度不快。下面以一個例子來進行說明。如下數(shù)據(jù){Name=”A”,Gold=8135},序列化成字符串:{Name=“A“,7B4E616D653D2241222CGold=8135}476F6C643D383133357D當使用上述table來表示玩家完整的數(shù)據(jù)時,在跨服玩法中就會碰到如何將A進程中的table傳輸?shù)紹進程的問題。此時的處理時將A進程內存中的table序列化成文本,通過網絡發(fā)送給B進程,B進程將文本先編譯成字符碼,然后執(zhí)行,在內存中還原出A中的table。普通玩家數(shù)據(jù)序列化成文本后有70-80K,有的跨服玩法短時間內會有大量玩家從不同的服務器涌入同一臺服務器進行PK,目標服務器短時間要對大量的文本進行反序列化,CPU壓力巨大,玩家經常在傳送過程中出現(xiàn)卡頓掉線用戶體驗不好。針對現(xiàn)有技術中發(fā)送方發(fā)送序列化成文本的數(shù)據(jù),接收方再將文本編譯成字節(jié)碼再還原為數(shù)據(jù)所存在的問題,目前尚未提出有效的解決方案。技術實現(xiàn)要素:本發(fā)明實施例提供了數(shù)據(jù)發(fā)送、接收方法及其裝置,以解決現(xiàn)有技術中接收方將數(shù)據(jù)文本編譯成可執(zhí)行的字節(jié)碼再還原數(shù)據(jù)所存在的問題。根據(jù)本發(fā)明實施例的一個方面,提供給了一種數(shù)據(jù)發(fā)送方法,包括:將數(shù)據(jù)轉換為字節(jié)碼;向接收方發(fā)送所述字節(jié)碼。進一步地,將所述數(shù)據(jù)轉換為所述字節(jié)碼包括:將所述數(shù)據(jù)構造成為常量數(shù)組,其中,所述數(shù)據(jù)每一條為’名稱=值’格式,所述數(shù)據(jù)中的每一條數(shù)據(jù)中名稱和值分別作為所述常量數(shù)組中的一個數(shù)值,所述數(shù)據(jù)中的每一條數(shù)據(jù)出現(xiàn)的順序作為所述常量數(shù)組的下標;至少根據(jù)所述常量數(shù)組構造所述字節(jié)碼,其中,所述常量數(shù)組的下標表示所述常量數(shù)組中的數(shù)值在棧中的位置。進一步地,將所述數(shù)據(jù)構造成為常量數(shù)組包括:確定在所述常量數(shù)組中的成員個數(shù)是否超過允許的閾值;在超過允許的閾值的情況下,將超過閾值的數(shù)據(jù)加載到棧上;將所述棧上的數(shù)據(jù)加載到所述常量數(shù)組中。進一步地,所述數(shù)據(jù)包括Table格式的數(shù)據(jù)。進一步地,將所述數(shù)據(jù)轉換為所述字節(jié)碼包括:在所述Table格式的數(shù)據(jù)包括嵌套數(shù)據(jù)的情況下,遍歷所述數(shù)據(jù);將遍歷得到的數(shù)據(jù)構造成為所述常量數(shù)組,使用所述常量數(shù)組構造所述字節(jié)碼。根據(jù)本發(fā)明實施例的另一個方面,還提供了一種數(shù)據(jù)接收方法,包括:接收來自發(fā)送方的字節(jié)碼;使用所述字節(jié)碼獲得所述發(fā)送方發(fā)送的數(shù)據(jù)。根據(jù)本發(fā)明實施例的另一個方面,還提供了一種數(shù)據(jù)發(fā)送裝置,包括:轉換模塊,用于將數(shù)據(jù)轉換為字節(jié)碼;發(fā)送模塊,用于向接收方發(fā)送所述字節(jié)碼。進一步地,所述轉換模塊用于,將所述數(shù)據(jù)構造成為常量數(shù)組,其中,所述數(shù)據(jù)每一條為’名稱=值’格式,所述數(shù)據(jù)中的每一條數(shù)據(jù)中名稱和值分別作為所述常量數(shù)組中的一個數(shù)值,所述數(shù)據(jù)中的每一條數(shù)據(jù)出現(xiàn)的順序作為所述常量數(shù)組的下標;根據(jù)所述常量數(shù)組構造所述字節(jié)碼,其中,所述常量數(shù)組的下標表示所述常量數(shù)組中的數(shù)值在棧中的位置。進一步地,所述轉換模塊用于:確定在所述常量數(shù)組中的成員個數(shù)是否超過允許的閾值;在超過允許的閾值的情況下,將超過閾值的數(shù)據(jù)加載到棧上;將所述棧上的數(shù)據(jù)加載到所述常量數(shù)組中。根據(jù)本發(fā)明實施例的另一個方面,提供了一種數(shù)據(jù)接收裝置,包括:接收模塊,用于接收來自發(fā)送方的字節(jié)碼;獲得模塊,用于使用所述字節(jié)碼獲得所述發(fā)送方發(fā)送的數(shù)據(jù)。通過上述實施例,采用了將數(shù)據(jù)轉換為字節(jié)碼;向接收方發(fā)送所述字節(jié)碼。通過本發(fā)明實施例現(xiàn)有技術中接收方將數(shù)據(jù)文本編譯成可執(zhí)行的字節(jié)碼再還原數(shù)據(jù)所存在的問題,提高了接收方還原出原數(shù)據(jù)的速度。附圖說明構成本申請的一部分的附圖用來提供對本發(fā)明的進一步理解,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中:圖1是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)發(fā)送方法的流程圖;圖2是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)接收方法的流程圖;圖3是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)發(fā)送裝置的示意圖;圖4是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)接收裝置的示意圖;以及,圖5是根據(jù)本發(fā)明實施例的構造常量數(shù)組的示意圖。具體實施方式需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結合實施例來詳細說明本發(fā)明。為了使本
技術領域:
:的人員更好地理解本發(fā)明方案,下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應當屬于本發(fā)明保護的范圍。需要說明的是,本發(fā)明的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的本發(fā)明的實施例。此外,術語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對于這些過程、方法、產品或設備固有的其它步驟或單元。本實施例提供了一種數(shù)據(jù)發(fā)送方法,圖1是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)發(fā)送方法的流程圖,如圖1所示,該數(shù)據(jù)發(fā)送方法方法包括步驟如下:步驟S102,將數(shù)據(jù)轉換為字節(jié)碼,這種轉換也可以稱為序列化;步驟S104,向接收方發(fā)送字節(jié)碼。通過上述步驟,在發(fā)送方將數(shù)據(jù)直接序列化為字節(jié)碼,而不同于現(xiàn)有技術中先將數(shù)據(jù)序列化成文本,接收方再將文本編譯成字節(jié)碼,由于本實施例是直接發(fā)送的字節(jié)碼,所以不需要將文本執(zhí)行還原出數(shù)據(jù)這樣的步驟,從而解決了現(xiàn)有技術中還原出數(shù)據(jù)時編譯耗費CPU,數(shù)據(jù)又占用內存速度過慢的問題。同時對于發(fā)送方而言,將數(shù)據(jù)轉換為文本格式也需要消耗資源,而將數(shù)據(jù)轉換為字節(jié)碼的資源消耗與轉換為文本的資源消耗相仿,因此,對于發(fā)送方而言,其資源的消耗也沒有太大變化,但是,對于接收方而言其處理速度以及對資源的消耗就會得到優(yōu)化。上述步驟中的轉換為字節(jié)碼的方法可以應用到各種編程語言中,轉換成字節(jié)碼的方式有很多中,在以下的可選的實施方式中,采用了常量數(shù)組以及棧的方式來進行轉換。這種方式僅僅是一種比較優(yōu)的實施例,采用其他轉換方式也能夠實現(xiàn)本發(fā)明的技術效果,例如,可以自定義一個函數(shù)來實現(xiàn)該功能。下面對本發(fā)明實施例的可選實施方式進行說明。作為另一種可選的實施方式,可以將數(shù)據(jù)構造成為常量數(shù)組,設定常量數(shù)組的長度,其中,數(shù)據(jù)每一條為‘名稱=值’格式,數(shù)據(jù)中的每一條數(shù)據(jù)中名稱和值分別作為常量數(shù)組中的一個數(shù)值,數(shù)據(jù)中的每一條數(shù)據(jù)出現(xiàn)的順序作為常量數(shù)組的下標;然后,根據(jù)常量數(shù)組構造字節(jié)碼,其中,常量數(shù)組的下標表示常量數(shù)組中的數(shù)值在棧中的位置。這種數(shù)據(jù)處理方式相對較優(yōu)。在某些語言中,在定義了常量數(shù)組之后,可以通過指令來對常量數(shù)組進行處理,例如,Lua語言中,其并沒有直接將數(shù)據(jù)轉換為字節(jié)碼的函數(shù),在一個可選的實施例中,利用了編程語言中生成單個指令的函數(shù)來構造指令數(shù)組的方式來實現(xiàn)字節(jié)碼的轉換。例如,在Lua腳本語言中,與構造table(數(shù)據(jù))相關的字節(jié)碼函數(shù)有3個:OP_NEWTABLE,OP_SETTABLE,OP_LOADK;通過構建指令數(shù)組編碼每個函數(shù)的參數(shù)。OP_NEWTABLE用于設置table和子table在棧上的位置,為常量數(shù)組分配棧上位置;OP_SETTABLE用于指示常量數(shù)組的成員(每個常量值)依次加載到上述分配的棧上;所構造的常量數(shù)組的第一位表示是棧上的位置或是常量數(shù)組的下標;其他成員放在棧上的預分配的剩余位置,如果超出了預分配的位置(超出了閾值),則需要用OP_LOADK指令常量先加載到棧的新位置上。例如:常量數(shù)組余留有9位,第1位表示棧上的位置或是常量數(shù)組的下標,其他8位最多可以表示256個不同的值。預分配的剩余棧上位置不超過256,但是常量數(shù)組的大小超過256是很常見的事,當常量的總數(shù)超過256時,則使用OP_LOADK將常量先加載到新棧上。圖5是根據(jù)本發(fā)明實施例的構造常量數(shù)組的示意圖,如圖5所示,可以根據(jù)常量數(shù)組構造字節(jié)碼,其中,常量數(shù)組的下標表示常量數(shù)組中的數(shù)值在棧中的位置。通過這種格式及使用下標標注數(shù)值在棧中的位置,可以簡便的不重復的記載常量數(shù)組的信息,并且清楚的找到各個數(shù)值在在棧中的位置。在本實施例中,作為一個可選的實施方式,還可以構造指令數(shù)組(即OP_NEWTABLE,OP_SETTABLE存放的地方),其中,指令數(shù)組用于指示常量數(shù)組在棧上的初始位置及常量數(shù)組在棧上的初始容量大小(OP_NEWTABLE);指令數(shù)組用于指示常量數(shù)組的成員依次加載到上述分配的棧上(OP_SETTABLE);構造指令數(shù)組的長度,然后根據(jù)根據(jù)上述常量數(shù)組和上述指令數(shù)組構造字節(jié)碼。由于本實施例構造字符串‘return{Name=”Apple”,Grade=95,…}’所對應的字節(jié)碼序列時沒有使用嵌套函數(shù)、局部變量、upvalue和參數(shù),只構造了指令數(shù)組以及存放key、value的常量數(shù)組,(key為常量的值,value為該常量在常量數(shù)組中的下標)根據(jù)常量值-下標映射表對常量數(shù)組進行構造,上述實施方式在相同的常量在常量數(shù)組中只出現(xiàn)一次,同時減少了參數(shù)、變量、和嵌套函數(shù)的使用,僅構造了指令數(shù)組和常量數(shù)組使得不再耗費CPU、還原出原數(shù)據(jù)的速度得到提高。在一個可選的實施方式中,在常量數(shù)組中的成員個數(shù)超過OP_SETTABLE的參數(shù)允許的閾值的情況下,指令數(shù)組中增加用于指示將超出閾值的常量加載到棧上的指令,(OP_LOADK)。這樣可以將超過閾值的常量首先加載在棧上,然后,再通過OP_SETTABLE操作棧上已經加載好的常量。通過本實施例,可以在超量數(shù)組的成員個數(shù)超出范圍時,分配棧,從而解決了在數(shù)據(jù)量龐大時數(shù)據(jù)的暫存問題。以圖5為例,OP_SETTABLE的指令參數(shù)與常量數(shù)組下標的關系可以如下Name=“Apple”,此時需要生成相應的指令:OP_SETTABLE“Name”“Apple”,“Name”在常量數(shù)組中的下標是1,“Apple”下標是2,OP_SETTABLE的兩個參數(shù)規(guī)定正數(shù)表示棧上的位置,負數(shù)的絕對值表示在常量數(shù)組中的位置,所以Name=“Apple”最終生成的指令是OP_SETTABLE-1-2。當常量數(shù)目比較多,假設OS=“Linux”,“OS”在常量數(shù)組中的下標是500,“Linux”是503,都超出了OP_SETTABLE參數(shù)允許的范圍,這時需要用OP_LOADK先把常量加載到棧上:OP_LOADKN-500//加載“OS”O(jiān)P_LOADKN+1-503//加載“Linux”O(jiān)P_SETTABLENN+1//OS=“Linux”。在一個可選的實施方式中,當遇到有嵌套的table(數(shù)據(jù))時,也可以使用上述方法進行構造字節(jié)碼,只需要根據(jù)遍歷得到的數(shù)據(jù)進行構造即可,該方法可以包括如下步驟:1)設定初始值;2)遍歷原table;遍歷結束后,棧的容量變?yōu)槌A繑?shù)組中常量的總數(shù);回到原table的分配的棧的位置;4)如果沒有遍歷原table,則增加常量數(shù)組中常量的總數(shù);5)判斷是否是嵌套子table;6)如果不是嵌套子table則判斷常量數(shù)組中常量的總數(shù)是否到閾值7)如果常量總數(shù)沒有增加到閾值,則直接將增加的常量值加到常量數(shù)組中,如果常量總數(shù)增加到了閾值,則將超出閾值的常量加載到棧上;8)如果是嵌套子table;分配新table的棧的位置;執(zhí)行7);9)輸出。其中在遞歸遍歷源table的過程中,使用一個變量,當碰到嵌套子table時,變量加1,當遍歷完該子table時,變量減1回退,這個過程就相當于當碰到嵌套子table時,分配新table的棧的位置,當遍歷完該子table時,回到原table的分配的棧的位置,反復循環(huán)利用棧上的位置,而不占用內存。結合一個例子進行說明。例如:子table和原table反復利用R(2)和R(1)的位置,R(A)代表要改變的table,A代表在棧上分配A位置的table。通過上述的方法,在數(shù)據(jù)序列化遍歷原table階段,本實施例直接生成字符碼而不是文本,實現(xiàn)了在服務器之間(跨服)傳輸table時,發(fā)送方開銷不變,接收方還原構造出源table時,只要直接執(zhí)行字符碼來反序列化即可,節(jié)省了編譯的開銷,使得整個過程的處理速度大大提升。驗證實驗:將一個table(數(shù)據(jù))序列化成文本、從文本反序列化各執(zhí)行2000次;再將此table(數(shù)據(jù))序列化為字節(jié)碼(OPCode)、從字節(jié)碼(OPCode)反序列化執(zhí)行2000次;下表是將一個table序列化和反序列化各執(zhí)行2000次的時空復雜度實驗結果對比表:由上表可知,將一個table(數(shù)據(jù))序列化成字節(jié)碼(OPCode)還原速度比常規(guī)方法序列化為文本省去了編譯分析時間,速度提升了近5倍。對于接收方而言,圖2是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)接收方法的流程圖。如圖2所示,該一種數(shù)據(jù)接收方法包括步驟如下:步驟S202,接收來自發(fā)送方的字節(jié)碼;步驟S204,使用字節(jié)碼獲得發(fā)送方發(fā)送的數(shù)據(jù)。使用上述方法,接收方還原構造出源數(shù)據(jù)(例如,table)的速度大大提升。本實施例還提供了一種數(shù)據(jù)發(fā)送裝置。該裝置可以通過轉換模塊實現(xiàn)其功能。需要說明的是,本實施例的數(shù)據(jù)發(fā)送裝置可以用于執(zhí)行本實施例所提供一種數(shù)據(jù)發(fā)送方法,本實施例的一種數(shù)據(jù)發(fā)送方法也可以通過本發(fā)明實施例所提供的數(shù)據(jù)發(fā)送裝置來執(zhí)行。圖3是根據(jù)本發(fā)明實施例的數(shù)據(jù)發(fā)送裝置的示意圖。如圖3所示,包括:轉換模塊32,用于將數(shù)據(jù)轉換為字節(jié)碼;發(fā)送模塊34,用于向接收方發(fā)送字節(jié)碼。作為一個可選的實施方式,轉換模塊32用于,調用腳本語言中的字節(jié)碼函數(shù)將數(shù)據(jù)轉換為字節(jié)碼,其中,字節(jié)碼函數(shù)用于將數(shù)據(jù)轉換為字節(jié)碼。作為一個可選的實施方式,轉換模塊32用于,將數(shù)據(jù)構造成為常量數(shù)組,其中,數(shù)據(jù)每一條為’名稱=值’格式,數(shù)據(jù)中的每一條數(shù)據(jù)中名稱和值分別作為常量數(shù)組中的一個數(shù)值,數(shù)據(jù)中的每一條數(shù)據(jù)出現(xiàn)的順序作為常量數(shù)組的下標;然后,根據(jù)常量數(shù)組構造字節(jié)碼,其中,常量數(shù)組的下標表示常量數(shù)組中的數(shù)值在棧中的位置。本實施例還提供了一種數(shù)據(jù)接收裝置。該裝置可以通過接收模塊實現(xiàn)其功能。需要說明的是,本實施例的數(shù)據(jù)接收裝置可以用于執(zhí)行本實施例所提供的數(shù)據(jù)接收方法,本實施例的數(shù)據(jù)接收方法也可以通過本實施例所提供的數(shù)據(jù)接收裝置來執(zhí)行。圖4是根據(jù)本發(fā)明實施例的數(shù)據(jù)接收裝置的示意圖。如圖4所示,包括:接收模塊42,用于接收來自發(fā)送方的字節(jié)碼;獲得模塊44,用于使用字節(jié)碼獲得發(fā)送方發(fā)送的數(shù)據(jù)。上述數(shù)據(jù)發(fā)送和接收裝置的實施例是與數(shù)據(jù)發(fā)送和接受方法相對應的,所以對于有益效果不再贅述。需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。在上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。在本申請所提供的幾個實施例中,應該理解到,所揭露的裝置,可通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性或其它的形式。作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網絡單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中?;谶@樣的理解,本發(fā)明的技術方案本質上或者說對現(xiàn)有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產品的形式體現(xiàn)出來,該計算機軟件產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可為個人計算機、移動終端、服務器或者網絡設備等)執(zhí)行本發(fā)明各個實施例方法的全部或部分步驟。而前述的存儲介質包括:U盤、只讀存儲器(ROM,Read-OnlyMemory)、隨機存取存儲器(RAM,RandomAccessMemory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質。以上僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領域的技術人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內。當前第1頁1 2 3 當前第1頁1 2 3