一種基于nio的簡易高效的socket通信框架的制作方法
【專利摘要】本發(fā)明公開一種基于nio的簡易高效的socket通信框架,分為TCP連接建立部分和IO讀寫處理部分。客戶端或者服務(wù)端連接建立之后,將建立起的會話session交給IO讀寫處理部分,將客戶端和服務(wù)端的連接建立部分抽象出來,將連接建立和IO讀寫處理分離。使用基于事件的消息通知機制,簡化了用戶編程接口,使得用戶在編寫網(wǎng)絡(luò)程序時無需考慮復(fù)雜的底層實現(xiàn)機制,專注在自己的業(yè)務(wù)邏輯上面;基于可配置的多線程IO讀寫機制,高效的處理IO讀寫事件,提高socket讀寫性能,同時在業(yè)務(wù)壓力降低時能釋放不用的線程資源;考慮各種常見問題處理的session的設(shè)計,有效的處理超時,TCP消息拆包、粘包問題。
【專利說明】—種基于nio的簡易高效的socket通信框架
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)編程【技術(shù)領(lǐng)域】,具體地說,涉及的是一種基于nio的簡易高效的socket通信框架。
【背景技術(shù)】
[0002]網(wǎng)絡(luò)編程是所有具有通信需求的軟件開發(fā)面臨的共同問題,實現(xiàn)高效、穩(wěn)定的通信基礎(chǔ)框架對于提高軟件開發(fā)的質(zhì)量、開發(fā)速度都具有非常重要的意義。Java編程語言提供了 nio的網(wǎng)絡(luò)編程基礎(chǔ)接口,但是用戶使用起來仍然非常不方便,甚至帶來效率方面的瓶頸。
[0003]Java網(wǎng)絡(luò)編程存在著如下普遍性的問題:
[0004]1.傳統(tǒng)的10包是基于阻塞模型的,在處理高并發(fā)訪問請求時,需要并發(fā)多個線程,線程調(diào)度的消耗對程序效率影響極大。
[0005]2.nio改正了傳統(tǒng)模型的缺陷,有讀寫事件時,會有主動通知機制。但是nio提供的編程接口復(fù)雜,用戶不容易掌握,代碼寫起來復(fù)雜,且常常會由于忘記處理各種各樣的異常產(chǎn)生錯誤,不能充分發(fā)揮nio的優(yōu)勢。
[0006]經(jīng)檢索發(fā)現(xiàn),申請?zhí)枮?00710079396.3的中國專利,該發(fā)明公開了 “一種處理異步消息隊列的方法,包括步驟:A.異步socket將接收到的底層數(shù)據(jù)放入接收緩存,判斷異步消息隊列中是否有未讀取的異步讀消息,如果異步消息隊列中沒有未讀取的異步讀消息則向所述異步消息隊列中寫入一異步讀消息,執(zhí)行步驟B,如果異步消息隊列中有未讀取的異步讀消息,則執(zhí)行步驟B;B.上層協(xié)議讀取所述異步讀消息后,從異步socket接收緩存中讀取底層數(shù)據(jù)。本發(fā)明還公開了一種處理異步消息隊列的系統(tǒng)和一種異步socket?!?br>
[0007]該發(fā)明與本發(fā)明的技術(shù)要點比較:
[0008]1.該發(fā)明為了解決底層socket異步消息隊列滿載的情況,側(cè)重于協(xié)議層次的優(yōu)化;本發(fā)明側(cè)重在上層的架構(gòu)層次的優(yōu)化,提供一個易用、高效的socket框架。
[0009]2.該發(fā)明著重解決異常狀態(tài)下異步消息對異步隊列的過量占用情況,通過提高上層協(xié)議的處理速度來解決這個問題,但是上層協(xié)議的實現(xiàn)用戶無法掌控,在上層協(xié)議處理消息慢的情況下,異步socket就變成了同步socket ;本發(fā)明通過在session中設(shè)計消息隊列,在上層協(xié)議中做緩存,提高消息處理速度,可以更好的解決這個問題。
[0010]申請?zhí)枮?00810170990.8的中國專利,該發(fā)明公開了 “一種socket數(shù)據(jù)傳輸處理方法及裝置,該方法為將socket數(shù)據(jù)寫入內(nèi)存隊列中;如果內(nèi)存隊列已滿,則按socket數(shù)據(jù)的優(yōu)先級寫入相應(yīng)優(yōu)先級的緩存文件中;再輪詢讀取緩存文件,實時地將緩存文件中的socket數(shù)據(jù)寫入到內(nèi)存隊列中;然后內(nèi)存隊列將socket數(shù)據(jù)傳輸給讀取socket數(shù)據(jù)的接口?!?br>
[0011]該發(fā)明與本發(fā)明的技術(shù)要點比較:
[0012]1.該發(fā)明解決了接收消息的內(nèi)存隊列滿的情況下,通過寫入緩存文件的方式解決這個問題;本發(fā)明側(cè)重于設(shè)計整個socket網(wǎng)絡(luò)通訊的架構(gòu)。[0013]2.該發(fā)明可以和本發(fā)明的方案一起使用,提高網(wǎng)絡(luò)程序的穩(wěn)定性和可靠性。在本發(fā)明中session中設(shè)計了接收隊列來緩存消息,在消息數(shù)量過多的情況下可以綜合該方案對隊列進行優(yōu)化,通過寫入緩存來防止數(shù)據(jù)丟失。
【發(fā)明內(nèi)容】
[0014]本發(fā)明的目的在于解決現(xiàn)有技術(shù)中的上述不足,提供一種基于nio的簡易高效的socket通信框架,在nio包的基礎(chǔ)上構(gòu)建了一個簡易高效的socket框架,既降低用戶網(wǎng)絡(luò)編程的復(fù)雜度,同時也能保證程序的性能。
[0015]為實現(xiàn)上述的目的,本發(fā)明所述的基于nio的簡易高效的socket通信框架,主要分為兩個部分,TCP連接建立部分和10讀寫處理部分??蛻舳嘶蛘叻?wù)端連接建立之后,將建立起的會話(session)交給10讀寫處理部分。本發(fā)明將客戶端和服務(wù)端的連接建立部分抽象出來,根據(jù)socket連接建立之后進行的都是10操作的共同點,將連接建立和10讀寫處理分離,最大可能的實現(xiàn)了代碼的復(fù)用。
[0016]連接建立部分包含客戶端連接建立和服務(wù)端連接建立。服務(wù)端部分啟動時開啟監(jiān)聽端口,等待客戶端的連接。連接建立后,將建立的socket以及建立時間等信息封裝為session,交給10讀寫處理部分進行讀寫處理。
[0017]10讀寫處理部分主要用來處理10事件,由于高并發(fā)socket時瓶頸在于10讀寫,為了充分利用10資源,本模塊采用多線程。線程數(shù)目可以配置,并且在沒有待處理的session時,線程會自動結(jié)束,釋放系統(tǒng)資源。
[0018]本發(fā)明提供session用來保存從TCP連接建立到連接關(guān)閉之間所用到的和此連接相關(guān)的所有狀態(tài)信息。主要包含以下部分:
[0019]1.和此session關(guān)聯(lián)的客戶端和服務(wù)端連接信息,客戶端地址、服務(wù)端地址等。
[0020]2.連接時間信息,比如連接建立時間,上次讀、寫事件的時間。記錄時間信息主要用來判斷當前session是否處于活動狀態(tài),如果不活動的話生成Idle事件。Idle事件有三類:讀idle、寫idle、讀寫同時idle。
[0021]3.發(fā)送消息隊列,記錄待發(fā)送的所有消息,在10繁忙時可以作為數(shù)據(jù)緩存。
[0022]4.接收消息隊列,存儲接收的所有消息,由于TCP是基于流的協(xié)議設(shè)計,在發(fā)送或者接受消息時存在拆包、粘包的現(xiàn)象,消息隊列可以緩存數(shù)據(jù),等數(shù)據(jù)接收完成時再進行處理。
[0023]5.統(tǒng)計信息,比如讀取、發(fā)送的所有數(shù)據(jù)大小,產(chǎn)生的連續(xù)的idle事件數(shù)目。
[0024]本發(fā)明另外提供基于事件的用戶編程接口,在socket連接建立之后,用戶只需要處理對應(yīng)socket連接的相應(yīng)事件,具體的編程細節(jié)對用戶完全透明,Socket事件以及對應(yīng)的事件說明如下:
[0025]socket建立:TCP協(xié)議經(jīng)過三次握手,建立連接。在此事件中適合做一些初始化工作,設(shè)置一些狀態(tài)的初始值。
[0026]socket關(guān)閉:TCP協(xié)議關(guān)閉連接。此事件適合做一些資源釋放回收工作。
[0027]session不活動:經(jīng)過了設(shè)定的超時時間,無讀寫操作。idle事件分為3類,第一類為讀idle,即在超時時間間隔內(nèi)沒有接收到任何數(shù)據(jù);第二類為寫idle,在超時時間間隔內(nèi)無數(shù)據(jù)發(fā)送;第三類為讀寫idle,即在超時時間間隔內(nèi)既沒有讀事件,也沒有寫事件。[0028]此事件適合做服務(wù)端應(yīng)用,當檢測到客戶端無任何動作時關(guān)閉連接,釋放資源。
[0029]session收到消息:收到對方發(fā)送過來的數(shù)據(jù)流。用戶可以調(diào)用后續(xù)業(yè)務(wù)邏輯,處理接收到的數(shù)據(jù)。
[0030]session消息已經(jīng)發(fā)送:消息已經(jīng)發(fā)送出去。通知用戶要發(fā)送的數(shù)據(jù)已經(jīng)發(fā)送完成。
[0031]異常事件:在執(zhí)行過程中出現(xiàn)的各種異常。此事件通知用戶在整個執(zhí)行過程中捕獲了未識別的異常,用戶可以在此進行異常的識別和處理。
[0032]采用上述技術(shù)方案之后,本發(fā)明具有的有益效果:
[0033]( I)使用基于事件的消息通知機制,簡化了用戶編程接口,使得用戶在編寫網(wǎng)絡(luò)程序時無需考慮復(fù)雜的底層實現(xiàn)機制,專注在自己的業(yè)務(wù)邏輯上面;
[0034](2)基于可配置的多線程IO讀寫機制,高效的處理IO讀寫事件,提高Socket讀寫性能,同時在業(yè)務(wù)壓力降低時能釋放不用的線程資源;
[0035](3)考慮各種常見問題處理的會話(session)的設(shè)計,有效的處理超時,TCP消息拆包、粘包問題。
[0036]本發(fā)明在nio包的基礎(chǔ)上構(gòu)建了一個簡易高效的socket框架,既降低用戶網(wǎng)絡(luò)編程的復(fù)雜度,同時也能保證程序的性能。
【專利附圖】
【附圖說明】
[0037]圖1為本發(fā)明socket整體框架圖。
【具體實施方式】
[0038]以下結(jié)合附圖和實施例對本發(fā)明的技術(shù)方案作進一步的解釋,但是以下的內(nèi)容不用于限定本發(fā)明的保護范圍。
[0039]如圖1所示,一種基于nio的簡易高效的socket通信框架,具體說明如下:
[0040]1、Socket 框架
[0041]整個框架主要分為兩個部分,TCP連接建立部分和10讀寫處理部分??蛻舳嘶蛘叻?wù)端連接建立之后,將建立起的會話(session)交給10讀寫處理部分。本發(fā)明將客戶端和服務(wù)端的連接建立部分抽象出來,根據(jù)socket連接建立之后進行的都是進行10操作的共同點,將連接建立和10讀寫處理分離,最大可能的實現(xiàn)了代碼的復(fù)用。
[0042]>連接建立部分
[0043]連接建立部分包含客戶端連接建立和服務(wù)端連接建立。服務(wù)端部分啟動時開啟監(jiān)聽端口,等待客戶端的連接。連接建立后,將建立的socket以及建立時間等信息封裝為session,交給10讀寫部分進行讀寫處理。
[0044]> 10讀寫處理部分
[0045]10讀寫處理部分主要用來處理10事件,由于高并發(fā)socket時瓶頸在于10讀寫,為了充分利用10資源,本模塊采用多線程,線程數(shù)目可以配置,并且在沒有待處理的session時,線程會自動結(jié)束,釋放系統(tǒng)資源。
[0046]2、用戶接口
[0047]提供基于事件的用戶編程接口,在socket連接建立之后,用戶只需要處理對應(yīng)socket連接的相應(yīng)事件,具體的編程細節(jié)對用戶完全透明,事件列表如下所示:
[0048]表格I用戶編程接口說明
【權(quán)利要求】
1.一種基于nio的簡易高效的socket通信框架,其特征包括TCP連接建立部分和IO讀寫處理部分,將連接建立和IO讀寫分離;其中: 連接建立部分包含客戶端連接建立和服務(wù)端連接建立,服務(wù)端部分啟動時開啟監(jiān)聽端口,等待客戶端的連接;連接建立后,將建立的socket以及建立時間等信息封裝為session,交給IO讀寫處理部分進行讀寫處理; IO讀寫處理部分主要用來處理IO事件,采用多線程,線程數(shù)目可以配置,并且在沒有待處理的session時,線程會自動結(jié)束,釋放系統(tǒng)資源。
2.根據(jù)權(quán)利要求1所述的基于nio的簡易高效的socket通信框架,特征在于:所述連接建立部分,其中session用來保存從TCP連接建立到連接關(guān)閉之間所用到的和此連接相關(guān)的所有狀態(tài)信息,包含以下部分: ①和此session關(guān)聯(lián)的客戶端和服務(wù)端連接信息,客戶端地址、服務(wù)端地址; ②連接時間信息,包括連接建立時間,上次讀、寫事件的時間;記錄時間信息主要用來判斷當前session是否處于活動狀態(tài),如果不活動的話生成Idle事件;idle事件有三類:讀idle、寫idle、讀寫同時idle ; ③發(fā)送消息隊列,記錄待發(fā)送的所有消息,在10繁忙時可以作為數(shù)據(jù)緩存; ④接收消息隊列,存儲接收的所有消息,由于TCP是基于流的協(xié)議設(shè)計,在發(fā)送或者接受消息時存在拆包、粘包的現(xiàn)象,消息隊列可以緩存數(shù)據(jù),等數(shù)據(jù)接收完成時再進行處理; ⑤統(tǒng)計信息,包括讀取、發(fā)送的所有數(shù)據(jù)大小,產(chǎn)生的連續(xù)的idle事件數(shù)目。
3.根據(jù)權(quán)利要求2所述的基于nio的簡易高效的socket通信框架,特征在于:所述session內(nèi)部跟蹤session的生命周期,用戶可以配置超時時間,在超時時,主動觸發(fā)此session過期事件,使得用戶可以在session到期時終結(jié)此session。
4.根據(jù)權(quán)利要求1-3任一項所述的基于nio的簡易高效的socket通信框架,特征在于:所述10讀寫處理部分提供基于事件的用戶編程接口,在socket連接建立之后,用戶只需要處理對應(yīng)socket連接的相應(yīng)事件,具體的編程細節(jié)對用戶完全透明;socket事件以及對應(yīng)的事件說明如下: socket建立:TCP協(xié)議經(jīng)過三次握手,建立連接; socket關(guān)閉:TCP協(xié)議關(guān)閉連接; session不活動:經(jīng)過了設(shè)定的超時時間,無讀寫操作; session收到消息:收到對方發(fā)送過來的數(shù)據(jù)流; session消息已經(jīng)發(fā)送:消息已經(jīng)發(fā)送出去; 異常事件:在執(zhí)行過程中出現(xiàn)的各種異常。
【文檔編號】G06F9/46GK103530172SQ201210228761
【公開日】2014年1月22日 申請日期:2012年7月3日 優(yōu)先權(quán)日:2012年7月3日
【發(fā)明者】孟文超, 趙新陽, 彭樂, 藏磊, 劉曉 申請人:上海寶信軟件股份有限公司