一種基于java的網(wǎng)絡(luò)傳輸協(xié)議轉(zhuǎn)換中間件的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,主要應(yīng)用于web服務(wù)器與基于Socket的遠(yuǎn)程控制系統(tǒng)之間的通信。
【背景技術(shù)】
[0002]WEB服務(wù)器一般基于HTTP協(xié)議實(shí)現(xiàn),通過(guò)瀏覽器提供用戶交互界面,能夠克服客戶端軟件可移植性差的缺點(diǎn)。當(dāng)存在通過(guò)瀏覽器頁(yè)面上操作控制遠(yuǎn)程設(shè)備的需求時(shí),往往需要與非HTTP協(xié)議的遠(yuǎn)程控制系統(tǒng)進(jìn)行通信。由于通信協(xié)議不兼容,遠(yuǎn)程控制系統(tǒng)無(wú)法直接與WEB服務(wù)器建立連接,需要通過(guò)中間件實(shí)現(xiàn)控制命令的轉(zhuǎn)發(fā)。
[0003]中間件作為服務(wù)器端,接收WEB服務(wù)器和遠(yuǎn)程控制系統(tǒng)的連接請(qǐng)求,并實(shí)現(xiàn)控制命令與控制響應(yīng)的轉(zhuǎn)發(fā)。高效網(wǎng)絡(luò)模型能夠提高中間件的處理能力。JAVA Selector模型用于實(shí)現(xiàn)事件驅(qū)動(dòng)的非阻塞網(wǎng)絡(luò)通信,底層基于epoll實(shí)現(xiàn),通過(guò)ServerSocketChannel創(chuàng)建ServerSocket,并向Selector注冊(cè)該通道的讀/寫(xiě)事件,注冊(cè)時(shí)可將一個(gè)Object對(duì)象作為附件提交。當(dāng)事件觸發(fā)時(shí),程序可獲得一個(gè)Select1nKey,并從中讀取觸發(fā)事件的通道和之前提交的附件。
[0004]基于阻塞隊(duì)列和線程組實(shí)現(xiàn)的生產(chǎn)者-消費(fèi)者模型,可用于中間件的任務(wù)處理。生產(chǎn)者線程向阻塞隊(duì)列中填充待處理的隊(duì)列項(xiàng),當(dāng)隊(duì)列滿時(shí),線程掛起,直到隊(duì)列有多余空間產(chǎn)生,線程被喚醒,完成隊(duì)列項(xiàng)的插入;消費(fèi)者線程從隊(duì)列中讀取隊(duì)列項(xiàng),若隊(duì)列為空,則線程掛起,直到隊(duì)列中有新的隊(duì)列項(xiàng)插入。阻塞隊(duì)列有效實(shí)現(xiàn)了生產(chǎn)者與消費(fèi)者程序的解親。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種基于JAVA的網(wǎng)絡(luò)傳輸協(xié)議轉(zhuǎn)換中間件。
[0006]本發(fā)明的目的是通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn)的:一種基于JAVA的網(wǎng)絡(luò)傳輸協(xié)議轉(zhuǎn)換中間件,該中間件包括HTTP Server模塊、HTTP命令解析模塊、控制命令構(gòu)建模塊和Socket Server 模塊,其中:
所述HTTP Server模塊基于Selector模型實(shí)現(xiàn),接收web服務(wù)器的控制請(qǐng)求并返回控制響應(yīng);
所述HTTP命令解析模塊包括HTTP命令解析隊(duì)列和HTTP命令解析線程組,根據(jù)HTTPServer模塊接收的控制請(qǐng)求解析出實(shí)現(xiàn)控制所需的參數(shù);
所述控制命令構(gòu)建模塊包括命令構(gòu)建隊(duì)列和命令構(gòu)建線程組,根據(jù)HTTP命令解析模塊解析出的控制參數(shù)構(gòu)建遠(yuǎn)程控制系統(tǒng)能夠識(shí)別的控制命令;
所述Socket Server模塊基于Selector模型實(shí)現(xiàn),包括Socket解析隊(duì)列和Socket解析線程組,向遠(yuǎn)程控制系統(tǒng)轉(zhuǎn)發(fā)控制命令構(gòu)建模塊構(gòu)建的控制命令,接收控制響應(yīng)并轉(zhuǎn)發(fā)給 HTTP Server 模塊; 各模塊工作步驟如下:
(1)創(chuàng)建HTTP命令解析模塊、控制命令構(gòu)建模塊和SocketServer模塊所需的阻塞隊(duì)列和線程組,各類(lèi)阻塞隊(duì)列與線程組構(gòu)成生產(chǎn)者-消費(fèi)者模式,線程組由newCachedThreadPool 線程池創(chuàng)建;
(2)啟動(dòng)HTTPServer模塊和Socket Server模塊,并在各自的Selector上注冊(cè)讀事件;SoCket Server模塊檢測(cè)到讀事件,即遠(yuǎn)程控制系統(tǒng)的連接請(qǐng)求,讀取遠(yuǎn)程控制系統(tǒng)用戶名和參數(shù),進(jìn)行用戶認(rèn)證;認(rèn)證成功后,以用戶名作為key,將觸發(fā)讀事件的套接字描述符存入遠(yuǎn)程控制系統(tǒng)哈希表;HTTP Server模塊檢測(cè)到讀事件,將觸發(fā)事件的套接字描述符插入到HTTP命令解析隊(duì)列;
所述用戶認(rèn)證通過(guò)查詢數(shù)據(jù)庫(kù)中的用戶名和密碼完成;遠(yuǎn)程控制系統(tǒng)哈希表基于ConcurrentHashMap 實(shí)現(xiàn);
(3)HTTP命令解析線程讀取套接字上的數(shù)據(jù)包,并解析出控制所需的參數(shù),構(gòu)建命令參數(shù)數(shù)據(jù)包,將其插入到命令構(gòu)建隊(duì)列;所述命令參數(shù)數(shù)據(jù)包中包括命令參數(shù)和HTTP描述符;
(4)命令構(gòu)建線程從命令構(gòu)建隊(duì)列中讀取命令參數(shù)數(shù)據(jù)包,獲得遠(yuǎn)程控制系統(tǒng)用戶名,并根據(jù)用戶名從遠(yuǎn)程控制系統(tǒng)哈希表中獲得Socket套接字描述符,構(gòu)建控制命令包,將其作為附件注冊(cè)套接字描述符的寫(xiě)事件;所述控制命令包由控制命令字段和HTTP描述符構(gòu)成;
(5)SocketServer模塊檢測(cè)到套接字描述符寫(xiě)事件,將控制命令包中的控制命令字段發(fā)送給遠(yuǎn)程控制系統(tǒng),并以控制命令包中的HTTP描述符為附件,注冊(cè)該套接字描述符的讀事件;
(6)Socket Server模塊檢測(cè)到讀事件,即遠(yuǎn)程控制系統(tǒng)響應(yīng),將觸發(fā)事件的套接字描述符插入到Socket解析隊(duì)列;
(7)Socket解析線程從套接字上讀取數(shù)據(jù)包并進(jìn)行解析,構(gòu)建響應(yīng)數(shù)據(jù)包;從附件中獲取HTTP套接字描述符,以響應(yīng)數(shù)據(jù)包為附件,注冊(cè)該描述符的寫(xiě)事件;
(8)HTTP Server模塊檢測(cè)到寫(xiě)事件,將附件中的響應(yīng)數(shù)據(jù)包發(fā)送給Web服務(wù)器。
[0007]進(jìn)一步地,所述Socket Server模塊在處理讀事件時(shí),根據(jù)Socket解析線程從數(shù)據(jù)包中解析出的遠(yuǎn)程控制系統(tǒng)用戶名,在遠(yuǎn)程控制系統(tǒng)哈希表中查找以該用戶名為key的套接字描述符項(xiàng),若存在則線程進(jìn)行響應(yīng)解析操作,否則進(jìn)行用戶認(rèn)證操作。
[0008]本發(fā)明的有益效果:實(shí)現(xiàn)不同協(xié)議系統(tǒng)(基于HTTP協(xié)議的WEB服務(wù)器與基于Socket的遠(yuǎn)程系統(tǒng))之間的數(shù)據(jù)通訊。
【具體實(shí)施方式】
[0009]本發(fā)明一種基于JAVA的網(wǎng)絡(luò)傳輸協(xié)議轉(zhuǎn)換中間件,包括HTTP Server模塊、HTTP命令解析模塊、控制命令構(gòu)建模塊和Socket Server模塊,其中:
所述HTTP Server模塊基于Selector模型實(shí)現(xiàn),接收web服務(wù)器的控制請(qǐng)求并返回控制響應(yīng);
所述HTTP命令解析模塊包括HTTP命令解析隊(duì)列和HTTP命令解析線程組,根據(jù)HTTPServer模塊接收的控制請(qǐng)求解析出實(shí)現(xiàn)控制所需的參數(shù); 所述控制命令構(gòu)建模塊包括命令構(gòu)建隊(duì)列和命令構(gòu)建線程組,根據(jù)HTTP命令解析模塊解析出的控制參數(shù)構(gòu)建遠(yuǎn)程控制系統(tǒng)能夠識(shí)別的控制命令;
所述Socket Server模塊基于Selector模型實(shí)現(xiàn),包括Socket解析隊(duì)列和Socket解析線程組,向遠(yuǎn)程控制系統(tǒng)轉(zhuǎn)發(fā)控制命令構(gòu)建模塊構(gòu)建的控制命令,接收控制響應(yīng)并轉(zhuǎn)發(fā)給 HTTP Server 模塊;
各模塊工作步驟如下:
(1)創(chuàng)建HTTP命令解析模塊、控制命令構(gòu)建模塊和SocketServer模塊所需的阻塞隊(duì)列和線程組,各類(lèi)阻塞隊(duì)列與線程組構(gòu)成生產(chǎn)者-消費(fèi)者模式,線程組由newCachedThreadPool 線程池創(chuàng)建;
(2)啟動(dòng)HTTPServer模塊和Socket Server模塊,并在各自的Selector上注冊(cè)讀事件;SoCket Server模塊檢測(cè)到讀事件,即遠(yuǎn)程控制系統(tǒng)的連接請(qǐng)求,讀取遠(yuǎn)程控制系統(tǒng)用戶名和參數(shù),進(jìn)行用戶認(rèn)證;認(rèn)證成功后,以用戶名作為key,將觸發(fā)讀事件的套接字描述符存入遠(yuǎn)程控制系統(tǒng)哈希表;HTTP Server模塊檢測(cè)到讀事件,將觸發(fā)事件的套接字描述符插入到HTTP命令解析隊(duì)列;
所述用戶認(rèn)證通過(guò)查詢數(shù)據(jù)庫(kù)中的用戶名和密碼完成;遠(yuǎn)程控制系統(tǒng)哈希表基于ConcurrentHashMap 實(shí)現(xiàn);
(3)HTTP命令解析線程讀取套接字上的數(shù)據(jù)包,并解析出控制所需的參數(shù),構(gòu)建命令參數(shù)數(shù)據(jù)包,將其插入到命令構(gòu)建隊(duì)列;所述命令參數(shù)數(shù)據(jù)包中包括命令參數(shù)和HTTP描述符;
(4)命令構(gòu)建線程從命令構(gòu)建隊(duì)列中讀取命令參數(shù)數(shù)據(jù)包,獲得遠(yuǎn)程控制系統(tǒng)用戶名,并根據(jù)用戶名從遠(yuǎn)程控制系統(tǒng)哈希表中獲得Socket套接字描述符,構(gòu)建控制命令包,將其作為附件注冊(cè)套接字描述符的寫(xiě)事件;所述控制命令包由控制命令字段和HTTP描述符構(gòu)成;
(5)SocketServer模塊檢測(cè)到套接字描述符寫(xiě)事件,將控制命令包中的控制命令字段發(fā)送給遠(yuǎn)程控制系統(tǒng),并以控制命令包中的H