專利名稱:一種多用戶并發(fā)接入裝置及其方法
技術領域:
本發(fā)明涉及一種多用戶并發(fā)接入裝置及其方法,尤其涉及一種基于TCP/IP服務器的多用戶并發(fā)接入裝置及其方法。
背景技術:
現(xiàn)有的各種TCP/IP服務器中,對于多用戶并發(fā)接入,往往采用多線程甚至多進程的方式,即對每一個接入的用戶請求,開一個線程或者進程來單獨處理該請求。在中國專利申請?zhí)枮?8125973.1的“服務器內分派客戶請求時執(zhí)行語義并發(fā)控制的裝置和方法”專利所描述的方法中,對每一個存儲請求,分別使用了一個線程進行處理。在該專利申請所公開的技術方案中,在多個用戶同時訪問服務端時,其線程切換消耗了大量的CPU和內存資源,大大降低了處理的速度。
另外,在專利號為6,301,604的“Multimedia Server”(“多媒體服務器”)美國專利中,則對每一個客戶端分配一個線程。這種方式的缺點也是大量的線程或者進程占用了更多的CPU和內存的資源,使得系統(tǒng)處理的速度降低。
發(fā)明內容
本發(fā)明所要解決的技術問題在于提供一種多用戶并發(fā)接入裝置及其方法,其可通過單線程來實現(xiàn)多個用戶并發(fā)同時訪問服務器,從而克服了現(xiàn)有技術中的多用戶并發(fā)接入時TCP/IP服務器中多線程和多進程占用了無謂的資源而導致系統(tǒng)整體的處理速度降低的缺點。
為了實現(xiàn)上述目的,本發(fā)明提供了一種多用戶并發(fā)接入裝置,應用于TCP/IP服務器,包括TCP模塊、應用層協(xié)議模塊和消息處理模塊;所述TCP模塊包含有TCP主線程單元,用于建立偵聽;
TCP鏈路管理線程單元,用于等待、接收來自客戶端的連接請求,并發(fā)送所述連接請求至應用層協(xié)議模塊;TCP接收數(shù)據(jù)線程單元,用于接收來自客戶端的數(shù)據(jù),并發(fā)送至應用層協(xié)議模塊;所述應用層協(xié)議模塊包含有應用層協(xié)議線程單元,用于等待、接收來自TCP模塊的連接請求和/或數(shù)據(jù)請求,并為所述連接請求和/或數(shù)據(jù)請求建立相應的會話,以及用于接收所述TCP模塊發(fā)送的數(shù)據(jù),并發(fā)送該數(shù)據(jù)至所述消息處理模塊進行處理;所述消息處理模塊包含有消息處理線程單元,用于對來自所述應用層協(xié)議模塊的數(shù)據(jù)進行數(shù)據(jù)處理。
上述的多用戶并發(fā)接入裝置,其中所述應用層協(xié)議模塊基于HTTP協(xié)議、SMTP協(xié)議、IMAP4協(xié)議以及其它基于TCP/IP的各種應用層協(xié)議。
本發(fā)明還提供一種利用上述的多用戶并發(fā)接入裝置的多用戶并發(fā)接入方法,其通過所述TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程、應用層協(xié)議線程和消息處理線程處理多個客戶端應用同時訪問服務端,實現(xiàn)多用戶的并發(fā)接入,該方法包含如下步驟步驟一,應用層協(xié)議線程通過TCP主線程建立一個偵聽,等待客戶端的連接請求消息;步驟二,TCP鏈路管理線程等待客戶端的連接請求消息,并在收到客戶端的連接請求消息后,把該連接請求消息發(fā)給應用層協(xié)議線程;TCP數(shù)據(jù)接收線程也等待客戶端的數(shù)據(jù),并在收到數(shù)據(jù)后把數(shù)據(jù)發(fā)送給應用層協(xié)議線程;步驟三,應用層協(xié)議線程收到來自TCP鏈路管理線程的連接請求消息,并為該連接建立一個會話,在該會話中分配套接字和內存,等待接收數(shù)據(jù),然后阻塞該應用層協(xié)議線程,等待下一個連接或者數(shù)據(jù)請求,下一個請求如果是連接請求,則重復步驟三,如果是數(shù)據(jù)請求,則轉到步驟四;步驟四,應用層協(xié)議線程收到來自TCP數(shù)據(jù)接收線程的數(shù)據(jù)請求消息,然后根據(jù)收到的該數(shù)據(jù)請求消息所攜帶的信息找到相應的會話,然后接收數(shù)據(jù),并把數(shù)據(jù)發(fā)送給消息處理線程,然后阻塞該應用層協(xié)議線程,等待下一個數(shù)據(jù)或者連接請求,下一個請求如果是連接請求,則轉到步驟一,如果是數(shù)據(jù)請求,則轉到步驟二;
步驟五,消息處理線程收到來自應用層協(xié)議的數(shù)據(jù)請求,對數(shù)據(jù)進行處理,并且在進行數(shù)據(jù)處理的過程中,TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程和應用層協(xié)議線程可以不斷地接收連接和數(shù)據(jù)請求,并把該請求消息放到消息處理線程的消息隊列中;當執(zhí)行完操作后,消息處理線程檢查消息隊列,如果有消息,則繼續(xù)處理,沒有則阻塞該消息處理線程。
上述的多用戶并發(fā)接入方法,其中,在步驟一之前還包括一步驟為TCP模塊定義一個數(shù)據(jù)結構鏈路控制塊,設置允許并發(fā)接入的用戶數(shù)目,該數(shù)據(jù)結構鏈路控制塊包括有表示該鏈路所使用的套接字、應用層協(xié)議的索引以及鏈路狀態(tài)的字段,并相應地為應用層協(xié)議定義一個會話信息數(shù)據(jù)結構。
上述的多用戶并發(fā)接入方法,其中,該鏈路的狀態(tài)包括空閑狀態(tài)、等待連接狀態(tài)和等待接收數(shù)據(jù)狀態(tài)。
上述的多用戶并發(fā)接入方法,其中,在步驟一中,該TCP主線程收到來自應用協(xié)議層線程的服務器注冊消息后,喚醒該TCP主線程,并取出收到的消息,根據(jù)消息中攜帶的信息申請一個空閑的數(shù)據(jù)結構鏈路控制塊,并建立偵聽,將該數(shù)據(jù)結構鏈路控制塊設置成等待連接狀態(tài),等待客戶端的連接請求。
上述的多用戶并發(fā)接入方法,其中,在步驟二中,當TCP數(shù)據(jù)接收線程檢查到該鏈路狀態(tài)為等待接收數(shù)據(jù)狀態(tài)時,該TCP數(shù)據(jù)接收線程開始通過異步方式接收來自客戶端的數(shù)據(jù)。
上述的多用戶并發(fā)接入方法,其中,所述TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程、應用層協(xié)議線程和消息處理線層為一條件循環(huán)過程。
上述的多用戶并發(fā)接入方法,其中,所述應用層協(xié)議為HTTP協(xié)議、SMTP協(xié)議、IMAP4協(xié)議以及其它基于TCP/IP的各種應用層協(xié)議。
通過上述裝置及其方法,用很少的線程實現(xiàn)了多用戶的并發(fā)接入,第一個用戶的處理還沒有完成的時候,第二個用戶也可以接入,同樣第三,第四個也可以接入,直到達到會話數(shù)量的限制為止,因此不需要為每一個接入的用戶分配一個線程。
采用本發(fā)明所述方法,與現(xiàn)有技術相比,可通過少量幾個線程處理多用戶并發(fā)請求,節(jié)省了時間和CPU內存,提高了處理速度,避免了線程切換消耗的CPU和內存資源,從而提高了處理的速度。
以下結合附圖和具體實施例對本發(fā)明進行詳細描述,但不作為對本發(fā)明的限定。
圖1為本發(fā)明的多用戶并發(fā)接入裝置示意圖;圖2為本發(fā)明的多用戶并發(fā)接入方法中TCP主線程流程圖;圖3為本發(fā)明的多用戶并發(fā)接入方法中TCP鏈路管理線程流程圖;圖4為本發(fā)明的多用戶并發(fā)接入方法中TCP數(shù)據(jù)接收線程流程圖;圖5為本發(fā)明的多用戶并發(fā)接入方法中HTTP線程流程圖;圖6為本發(fā)明的多用戶并發(fā)接入方法中消息處理線程流程圖。
具體實施例方式
請參照圖1,本發(fā)明的多用戶并發(fā)接入裝置包括包括TCP模塊10、應用層協(xié)議模塊20、消息處理模塊30。該TCP模塊10包括了TCP主線程單元11、TCP鏈路管理線程單元12、TCP接收數(shù)據(jù)線程單元13。該TCP主線程單元11用于建立偵聽;該TCP鏈路管理線程單元12,用于等待、接收來自客戶端的連接請求,并發(fā)送所述連接請求至應用層協(xié)議模塊;該TCP接收數(shù)據(jù)線程單元13,用于接收來自客戶端的數(shù)據(jù),并發(fā)送至應用層協(xié)議模塊。該應用層協(xié)議模塊20,用于等待、接收來自TCP模塊的連接請求和/或數(shù)據(jù)請求,并為所述連接請求和/或數(shù)據(jù)請求建立相應的會話,以及用于接收TCP模塊發(fā)送的數(shù)據(jù),并發(fā)送該數(shù)據(jù)至消息處理模塊進行處理。該消息處理模塊30,用于對來自應用層協(xié)議模塊的數(shù)據(jù)進行數(shù)據(jù)處理。
本發(fā)明的多用戶并發(fā)接入方法中,主要使用了五個線程,TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程、應用層協(xié)議線程和消息處理線程。通過上述線程處理多個客戶端應用同時訪問服務端,實現(xiàn)多用戶的并發(fā)接入,其實現(xiàn)步驟包括步驟一,首先應用層協(xié)議線程通過TCP主線程建立一個偵聽,等待客戶端的連接請求。
步驟二,TCP鏈路管理線程會通過select阻塞的方式,來等待客戶端的連接請求,當收到客戶端的連接請求后,把該連接請求發(fā)給應用層協(xié)議線程;TCP數(shù)據(jù)接收線程也通過select方式阻塞,等待客戶端的數(shù)據(jù),收到數(shù)據(jù)后把數(shù)據(jù)發(fā)送給應用層協(xié)議線程。
步驟三,應用層協(xié)議線程收到來自TCP鏈路管理線程的連接請求,應用層協(xié)議線程為該連接建立一個會話,并在該會話中分配套接字(socket)和內存,等待接收數(shù)據(jù),然后應用層協(xié)議線程阻塞,等待下一個連接或者數(shù)據(jù)請求,下一個如果是連接請求,則轉到步驟三,如果是數(shù)據(jù)請求,則轉到步驟四。
步驟四,應用層協(xié)議線程收到來自TCP接收數(shù)據(jù)線程的數(shù)據(jù)請求,然后根據(jù)套接字(socket)找到相應的會話,然后接收數(shù)據(jù),然后把數(shù)據(jù)發(fā)送給消息處理線程,然后應用層協(xié)議線程阻塞,等待下一個數(shù)據(jù)或者連接請求,下一個如果是連接請求,則轉到步驟一,如果是數(shù)據(jù)請求,則轉到步驟二。
步驟五,消息處理線程收到來自應用層協(xié)議的數(shù)據(jù)請求,對數(shù)據(jù)進行處理,在處理的過程中,TCP和應用層協(xié)議線程可以不斷的接收連接和數(shù)據(jù)請求,并把消息放到消息處理線程的消息隊列中;當執(zhí)行完操作后,消息處理線程檢查消息隊列,如果有消息,則繼續(xù)處理,沒有則阻塞。
下面請參閱圖2至圖5,將以HTTP作為應用層協(xié)議為例來說明本發(fā)明方法。首先定義3個模塊,TCP模塊,HTTP模塊,消息處理模塊,其中HTTP模塊和消息處理模塊各一個線程,TCP模塊包含三個線程,TCP主線程,TCP鏈路管理線程,TCP接收數(shù)據(jù)線程。
其軟件部分的處理步驟如下首先為TCP模塊定義一個數(shù)據(jù)結構鏈路控制塊LinkBlock ,1000意味著可以同時允許一千個用戶并發(fā)的訪問系統(tǒng),該數(shù)字可以根據(jù)實際需要調整。該數(shù)據(jù)結構主要包含以下字段Socket(該鏈路所使用的Socket),dwAppIdx(HTTP的索引),bLinkStatus(鏈路狀態(tài),表示該鏈路是空閑或者LISTENING等待連接或者ESTABLISHED等待接收數(shù)據(jù))。并相應地為HTTP定義一個httpLink 的會話信息數(shù)據(jù)結構。
接著,如圖2所示,為本發(fā)明的TCP主線程流程圖,其包括步驟101,啟動TCP主線程。
步驟102,在線程入口進行while(1)循環(huán)。
步驟103,在線程入口處首先檢查消息隊列,如果沒有消息,則調用sem_wait阻塞本線程;如果有消息,則直接轉到下一步驟104。
步驟104,收到來自HTTP線程的服務器注冊消息,該線程被喚醒,如果不是服務器注冊消息,則繼續(xù)阻塞。
步驟105,取出收到的服務器注冊消息,并根據(jù)服務器注冊消息中攜帶的IP地址等信息,申請一個空閑的LinkBlock,調用socket函數(shù)listen建立偵聽,LinkBlock設置為LISTENING狀態(tài),然后轉到步驟102。
如圖3所示,為本發(fā)明的TCP鏈路管理線程流程圖,其步驟如下步驟201,啟動TCP鏈路管理線程。
步驟202,在線程入口進行while(1)循環(huán)。
步驟203,檢查LinkBlock[i++].status是否等于LISTENING狀態(tài),如果是則轉到步驟204,如果不是則重復步驟203。
步驟204,調用FD_SET函數(shù),對這個socket設定異步方式,并轉到下一步驟205。
步驟205,是否所有的LinkBlock都設定完成,如果是,轉到下一步驟206,如果不是,則轉到203繼續(xù)設定。
步驟206,調用select()進入阻塞狀態(tài)。
步驟207,收到客戶端的連接消息。
步驟208,對每一個LinkBlock[i],用FD_ISSET找到是哪一個socket收到了連接消息。
步驟209,調用accept()接收該連接,并向HTTP線程發(fā)送連接消息。
步驟210,調用sem_post()喚醒HTTP線程,重新轉到步驟202。
如圖4所示,為本發(fā)明的TCP數(shù)據(jù)接收線程流程圖,其步驟如下步驟301,啟動TCP數(shù)據(jù)接收線程。
步驟302,在線程入口進行while(1)循環(huán)。
步驟303,檢查LinkBlock[i++].status是否等于ESTABLISHED狀態(tài),如果是則轉到步驟304,如果不是則重復步驟303。
步驟304,調用FD_SET函數(shù),對這個socket設定異步方式,并轉到下一步驟305。
步驟305,是否所有的LinkBlock都設定完成,如果是,轉到下一步驟306,如果不是,則轉到步驟303繼續(xù)設定。
步驟306,調用select()進入阻塞狀態(tài)。
步驟307,收到客戶端的數(shù)據(jù)。
步驟308,對每一個LinkBlock[i],用FD_ISSET找到是哪一個socket收到了數(shù)據(jù)。
步驟309,調用recv()接收該連接,并向HTTP線程發(fā)送數(shù)據(jù)。
步驟310,調用sem_post()喚醒HTTP線程,重新轉到步驟302。
如圖5所示,為本發(fā)明的應用層協(xié)議線程流程圖,其包括如下步驟步驟401,啟動HTTP線程。
步驟402,在線程入口進行while(1)循環(huán)。
步驟403,檢查線程消息隊列,如果沒有消息則調用sem_wait()阻塞本線程。
步驟404,收到一個消息,線程被喚醒;如果是連接請求,轉到下一步驟405;如果是數(shù)據(jù)請求,則轉到步驟407。
步驟405,收到來自TCP鏈路管理線程的連接請求消息。
步驟406,取出收到的連接請求消息,申請空閑的httpLink,建立會話,轉到步驟402,繼續(xù)等待下一個消息。
步驟407,收到來自TCP數(shù)據(jù)接收線程的數(shù)據(jù)請求消息。
步驟408,取出收到的數(shù)據(jù)請求消息,根據(jù)該數(shù)據(jù)請求消息所攜帶的信息找到相應的httpLink。
步驟409,判斷一次HTTP數(shù)據(jù)是否接收完成,如果完成,執(zhí)行下一步驟410;如果沒有完成,轉到步驟411。
步驟410,向消息處理線程發(fā)送消息,并調用sem_post()喚醒消息處理線程,轉到步驟402。
步驟411,繼續(xù)等待后續(xù)的數(shù)據(jù),轉到步驟402。
如圖6所示,為本發(fā)明的消息處理線程的流程圖,其包含如下步驟步驟501,啟動消息處理線程。
步驟502,在線程入口進行while(1)循環(huán)。
步驟503,檢查線程消息隊列,如果沒有消息則調用sem_wait()阻塞本線程。
步驟504,收到來自HTTP的消息,線程被喚醒。
步驟505,對該消息進行處理,處理完后轉到步驟502。
本方法同樣適用于其它的應用層協(xié)議,如SMTP,IMAP4以及其它基于TCP/IP的各種應用層協(xié)議等。
當然,本發(fā)明還可有其他多種實施例,在不背離本發(fā)明精神及其實質的情況下,熟悉本領域的技術人員當可根據(jù)本發(fā)明作出各種相應的改變和變形,但這些相應的改變和變形都應屬于本發(fā)明所附的權利要求的保護范圍。
權利要求
1.一種多用戶并發(fā)接入裝置,應用于TCP/IP服務器,其特征在于,包括TCP模塊、應用層協(xié)議模塊和消息處理模塊;所述TCP模塊包含有TCP主線程單元,用于建立偵聽;TCP鏈路管理線程單元,用于等待、接收來自客戶端的連接請求,并發(fā)送所述連接請求至應用層協(xié)議模塊;TCP接收數(shù)據(jù)線程單元,用于接收來自客戶端的數(shù)據(jù),并發(fā)送至應用層協(xié)議模塊;所述應用層協(xié)議模塊包含應用層協(xié)議線程單元,用于等待、接收來自TCP模塊的連接請求和/或數(shù)據(jù)請求,并為所述連接請求和/或數(shù)據(jù)請求建立相應的會話,以及用于接收所述TCP模塊發(fā)送的數(shù)據(jù),并發(fā)送該數(shù)據(jù)至所述消息處理模塊進行處理;所述消息處理模塊包含有消息處理線程單元,用于對來自所述應用層協(xié)議模塊的數(shù)據(jù)進行數(shù)據(jù)處理。
2.根據(jù)權利要求1所述的多用戶并發(fā)接入裝置,其特征在于,所述應用層協(xié)議模塊基于HTTP協(xié)議、SMTP協(xié)議、IMAP4協(xié)議以及其它基于TCP/IP的各種應用層協(xié)議。
3.一種利用如權利要求1所述裝置的多用戶并發(fā)接入方法,其特征在于,包含如下步驟步驟一,應用層協(xié)議線程通過TCP主線程建立一個偵聽,等待客戶端的連接請求消息;步驟二,TCP鏈路管理線程等待客戶端的連接請求消息,并在收到客戶端的連接請求消息后,把該連接請求消息發(fā)給應用層協(xié)議線程;TCP數(shù)據(jù)接收線程也等待客戶端的數(shù)據(jù),并在收到數(shù)據(jù)后把數(shù)據(jù)發(fā)送給應用層協(xié)議線程;步驟三,應用層協(xié)議線程收到來自TCP鏈路管理線程的連接請求消息,并為該連接建立一個會話,在該會話中分配套接字和內存,等待接收數(shù)據(jù),然后阻塞該應用層協(xié)議線程,等待下一個連接或者數(shù)據(jù)請求,下一個請求如果是連接請求,則重復步驟三,如果是數(shù)據(jù)請求,則轉到步驟四;步驟四,應用層協(xié)議線程收到來自TCP數(shù)據(jù)接收線程的數(shù)據(jù)請求消息,然后根據(jù)收到的該數(shù)據(jù)請求消息所攜帶的信息找到相應的會話,然后接收數(shù)據(jù),并把數(shù)據(jù)發(fā)送給消息處理線程,然后阻塞該應用層協(xié)議線程,等待下一個數(shù)據(jù)或者連接請求,下一個請求如果是連接請求,則轉到步驟一,如果是數(shù)據(jù)請求,則轉到步驟二;步驟五,消息處理線程收到來自應用層協(xié)議的數(shù)據(jù)請求,對數(shù)據(jù)進行處理,并且在進行數(shù)據(jù)處理的過程中,TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程和應用層協(xié)議線程可以不斷地接收連接和數(shù)據(jù)請求,并把該請求消息放到消息處理線程的消息隊列中;當執(zhí)行完操作后,消息處理線程檢查消息隊列,如果有消息,則繼續(xù)處理,沒有則阻塞該消息處理線程。
4.根據(jù)權利要求3所述的多用戶并發(fā)接入方法,其特征在于,在步驟一之前還包括一步驟為TCP模塊定義一個數(shù)據(jù)結構鏈路控制塊,設置允許并發(fā)接入的用戶數(shù)目,該數(shù)據(jù)結構鏈路控制塊包括有表示該鏈路所使用的套接字、應用層協(xié)議的索引以及鏈路狀態(tài)的字段,并相應地為應用層協(xié)議定義一個會話信息數(shù)據(jù)結構。
5.根據(jù)權利要求4所述的多用戶并發(fā)接入方法,其特征在于,該鏈路的狀態(tài)包括空閑狀態(tài)、等待連接狀態(tài)和等待接收數(shù)據(jù)狀態(tài)。
6.根據(jù)權利要求5所述的多用戶并發(fā)接入方法,其特征在于,在步驟一中,該TCP主線程收到來自應用協(xié)議層線程的服務器注冊消息后,喚醒該TCP主線程,并取出收到的消息,根據(jù)消息中攜帶的信息申請一個空閑的數(shù)據(jù)結構鏈路控制塊,并建立偵聽,將該數(shù)據(jù)結構鏈路控制塊設置成等待連接狀態(tài),等待客戶端的連接請求。
7.根據(jù)權利要求5所述的多用戶并發(fā)接入方法,其特征在于,在步驟二中,當TCP數(shù)據(jù)接收線程檢查到該鏈路狀態(tài)為等待接收數(shù)據(jù)狀態(tài)時,該TCP數(shù)據(jù)接收線程開始通過異步方式接收來自客戶端的數(shù)據(jù)。
8.根據(jù)權利要求3所述的多用戶并發(fā)接入方法,其特征在于,所述TCP主線程、TCP鏈路管理線程、TCP接收數(shù)據(jù)線程、應用層協(xié)議線程和消息處理線程為一條件循環(huán)過程。
9.根據(jù)權利要求3所述的多用戶并發(fā)接入方法,其特征在于,所述應用層協(xié)議為HTTP協(xié)議、SMTP協(xié)議、IMAP4協(xié)議以及其它基于TCP/IP的各種應用層協(xié)議。
全文摘要
本發(fā)明涉及一種多用戶并發(fā)接入裝置及其方法,應用于TCP/IP服務器,該裝置包括TCP模塊,用于建立偵聽,等待和接收來自客戶端的連接請求,并發(fā)送所述連接請求至應用層協(xié)議模塊,以及用于接收來自客戶端的數(shù)據(jù),并發(fā)送至應用層協(xié)議模塊;應用層協(xié)議模塊,用于等待和接收來自TCP模塊的連接請求和/或數(shù)據(jù)請求,并為所述連接請求和/或數(shù)據(jù)請求建立相應的會話,以及用于接收TCP模塊發(fā)送的數(shù)據(jù),并發(fā)送該數(shù)據(jù)至消息處理模塊進行處理;消息處理模塊,用于對來自應用層協(xié)議模塊的數(shù)據(jù)進行數(shù)據(jù)處理。本發(fā)明通過少數(shù)幾個線程即可實現(xiàn)多個客戶端同時訪問服務器,避免了線程切換消耗的CPU和內存資源,提高了處理速度。
文檔編號H04L12/28GK1561043SQ20041004647
公開日2005年1月5日 申請日期2004年6月9日 優(yōu)先權日2004年2月20日
發(fā)明者張亦剛, 井文濤, 田會芹, 鐘建 申請人:中興通訊股份有限公司