一種基于AIO的socket傳輸系統的制作方法
【技術領域】
[0001]本發明涉及Java應用遠程調用技術領域,尤其涉及一種基于A1的socket傳輸系統。
【背景技術】
[0002]Java發布ΑΙ0(異步輸入/輸出)之后,因為A1提供的強大性能,所以成為socket編程(套接字編程)的首選。但由于A1的應用程序編程接口 API相對復雜,并且在多線程編程情況下,需要考慮的應用場景比較復雜。現有的RPC(Remote ProcedureCall Protocol一一遠程過程調用協議)調用基本都是在Tcp協議上進行,需要服務端提供socket監聽。而大多數RPC框架仍然是基于原始的線程式socket服務器實現,難以在單機上提供數以萬計的連接能力。所以推出一個基于A1的socket傳輸系統,旨在為用戶提供強大的底層通訊功能,而讓用戶只關注業務,無需面對任何socket編程。并且盡可能的做到輕量化,對外只暴露一個業務接口和一個攔截器接口,使用戶不再需要關心底層數據傳輸。只需要專注在業務上即可。
【發明內容】
[0003]本發明要解決的技術問題,在于提供一種基于A1的socket傳輸系統,本發明充分利用了 A1的系統讀寫能力,可以在單臺機器上,通過線程池管理數以萬計的連接。實現了底層TCP協議和上層的完全解耦,使得API接口更簡單,客戶端無需提供任何東西進行操作。
[0004]本發明是這樣實現的:一種基于A1的socket傳輸系統,所述系統包括數據傳輸模塊、數據攔截器模塊以及消息處理模塊,所述數據傳輸模塊接收客戶端連接請求,在收到連接請求后,系統新建一個Server ChannelInfo通道,該通道對象持有了當前連接過來的socket通道,并且會獲取在服務器啟動的時候設置的參數,將參數設置到ServerChannelInfo通道之中,將通道Server ChannelInfo中消息數據發送給數據攔截器模塊;所述數據攔截器模塊在消息數據到達消息處理模塊中的消息處理器和離開消息處理器時進行消息的攔截和過濾;所述消息處理模塊通過消息處理器處理消息,負責消息數據的分發,系統中線程池資源的準備。
[0005]進一步地,所述數據傳輸模塊包括socket連接響應器、通道讀取響應器以及消息寫出響應器;所述socket連接響應器負責接收客戶端的socket連接請求,所述通道讀取響應器負責從Server ChannelInfo通道中讀取消息數據,所述消息寫出響應器,負責將消息數據從通道發送。
[0006]進一步地,所述消息處理模塊包括消息動作類單元、消息請求處理接口單元以及消息處理器;所述消息動作類單元用于給線程池提供消息動作類,并提供調用,負責消息的入口攔截、請求處理、出口攔截以及通道寫出操作;所述消息請求處理接口單元,為用戶提供消息請求處理接口,使得用戶能完成感興趣的消息的處理,所述消息處理器,負責消息的分發,線程池資源的準備以及消息的處理。
[0007]進一步地,所述Server ChannelInfo通道讀取使用的是A1中的異步讀取方式,由實現ComplteHandler接口的通道讀取響應類ChannelReadHandler來負責;該接口能對消息數據進行分析,以確定是否符合格式的報文文本;并且確定需要讀取的大小,將需要讀取的數據進行讀取;在讀取的過程中發生讀取緩存大小不足時,此時會自動擴容;以及發生粘包,此時類會將粘包中的數據,讀取完整的業務數據的部分,并且將這部分數據組裝成抽象消息Message投遞到消息處理器,剩余的數據則繼續讀取直到完整后重復讀取流程;在數據讀取完畢并且也投遞完畢后,通道讀取響應器會繼續在Server Channel Info通道上監聽直到通道關閉或者發生異常為止。
[0008]進一步地,消息寫出采用的是A1中的異步寫出,由實現了 Complet1nHandler接口的消息寫出響應類MessageWriteHandler來負責;通過將抽象消息Message中組裝好的WriteBuffer寫出到通道中;一旦所有的數據都寫出完成,貝Ij會將當前的抽象消息Message內的資源進行釋放,并且嘗試獲取下一個代寫的消息,繼續進行寫出。
[0009]進一步地,所述數據攔截器模塊的信息注冊是在服務器一開始啟動的時候,通過掃描,發現實現了數據攔截器模塊接口的類,將所有這樣的類集合在一起,并且進行排序;收到消息時進行入口攔截,而消息發出時在對應的位置進行出口攔截;當消息從通道讀取監聽器獲取并組裝完畢后就進入消息處理器中等待分配線程資源進行處理,一旦獲取到資源就開始執行。
[0010]進一步地,數據攔截器模塊處理的規則是一層處理完了交給下一層,入口和出口的位置是相反的;即如果入口的時候是第一個處理,則出口的時候是最后一個處理;數據攔截器模塊能返回信息停止后續的攔截處理,直接進入消息處理器,或者能直接中斷整個流程,將消息放棄并且關閉通道。
[0011]進一步地,消息處理模塊主要由用戶實現接口 MessageHandler來注冊對某一類型感興趣的消息;其中消息動作類單元作為線程資源執行的載體,執行消息上的入口攔截,消息處理,出口攔截,以及消息的嘗試寫出;
[0012]而抽象消息Message作為消息的載體,承載了消息當前所在的通道,消息中的業務數據,以及寫出所需的緩存buffer。
[0013]本發明具有如下優點:本發明系統包括數據傳輸模塊、數據攔截器模塊以及消息處理模塊,所述數據傳輸模塊接收客戶端連接請求,在收到連接請求后,系統會新建一個Server ChannelInfo通道,將通道Server ChannelInfo中消息數據發送給數據攔截器模塊;數據攔截器模塊在消息數據到達消息處理模塊中的消息處理器和離開消息處理器時進行消息的攔截和過濾;所述消息處理模塊通過消息處理器處理消息,負責消息數據的分發,系統中線程池資源的準備。本發明充分利用了 A1的系統讀寫能力,可以在單臺機器上,通過線程池管理數以萬計的連接。實現了底層TCP協議和上層的完全解耦,使得API接口更簡單,客戶端無需提供任何東西進行操作。
【附圖說明】
[0014]圖1為本發明系統的框架原理圖。
[0015]圖2為本發明數據攔截器模塊對消息進入和寫出的處理流程圖。
[0016]圖3為本發明系統處理消息的一實施例的原理框圖。
[0017]圖4為本發明系統處理消息的流程示意圖。
【具體實施方式】
[0018]請參閱圖1至圖4所示,本發明的一種基于A1的socket傳輸系統,所述系統包括數據傳輸模塊、數據攔截器模塊以及消息處理模塊,所述數據傳輸模塊接收客戶端連接請求,在收到連接請求后,系統新建一個Server ChannelInfo通道,該通道對象持有了當前連接過來的socket通道,并且會獲取在服務器啟動的時候設置的參數,將參數設置到ServerChannelInfo通道之中,將通道Server ChannelInfo中消息數據發送給數據攔截器模塊;所述數據攔截器模塊在消息數據到達消息處理模塊中的消息處理器和離開消息處理器時進行消息的攔截和過濾;所述消息處理模塊通過消息處理器處理消息,負責消息數據的分發,系統中線程池資源的準備。其中,傳輸系統的底層(即數據傳輸模塊)是為A1的讀寫接口,采用響應器的模式,即為異步操作模式,通過多線程的方式,最大程度釋放系統性能。其中數據傳輸模塊、數據攔截器模塊以及消息處理模塊中與使用者相關的只有數據攔截器模塊和消息處理模塊。用戶通過實現一個消息處理的接口,來處理用戶感興趣的信息;通過實現攔截接口,實現對消息的攔截,從而方便進行橫向編程。而系統中的類以及用戶繼承接口的類,都通過注解,被1C(控制反轉Invers1n of Control,英文縮寫為1C是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。)容器識別以及管理。
[0019]在數據傳輸模塊、數據攔截器模塊以及消息處理模塊中,貫穿始終的是ServerChannelInfo通道和抽象消息Message。前者代表著通道對象,只要socket通道不關閉,就會持續存在。后者表示單次業務數據的消息對象,會經歷從數據傳輸模塊傳遞到消息處理模塊再到數據傳輸模塊寫出,然后被銷毀。
[0020]其中,所述數據傳輸模塊包括socket連接響應器、通道讀取響應器以及消息寫出響應器;所述socket連接響應器負責接收客戶端的socket連接請求,所述通道讀取響應器負責從Server ChannelInfo通道中讀取消息數據,所述消息寫出響應器,負責將消息數據從通道發送。
[0021]所述消息處理模塊包括消息動作類單元、消息請求處理接口單元以及消息處理器;所述消息動作類單元用于給線程池提供消息動作類,并提供調用,負責消息的入口攔截、請求處理、出口攔截以及通道寫出操作;所述消息請求處理接口單元,為用戶提供消息請求處理接口,使得用戶能完成感興趣的消息的處理,所述消息處理器,負責消息的分發,線程池資源的準備以及消息的處理。
[0022]另外,所述Server ChannelInfo通道讀取使用的是A1中的異步讀取方式,由實現ComplteHandler接口的通道讀取響應類ChannelReadHandler來負責;該接口能對消息數據進行分析,以確定是否符合格式的報文文本;并且確定需要讀取的大小,將需要讀取的數據進行讀取;在讀取的過程中發生讀取緩存大小不足時,此時會自動擴容;以及發生粘包,此時類會將粘包中的數據,讀取完整的業務數據的部分,并且將這部分數據組裝成抽象消息Message投遞到消息處理器,剩余的數據則繼續讀取直到完整后重復讀取流程;在數據讀取完畢并且也投遞完畢后,通道讀取響應器會繼續在Server Channel Info通道上監聽直到通道關閉或者發生異常為止。
[002