国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JXTA Platform JAVA參考實(shí)現(xiàn)源代碼分析系列文章(2)

瀏覽:39日期:2024-06-30 16:28:20
內(nèi)容: 1 引言管道的概念源于Unix,是不同線程之間直接傳輸數(shù)據(jù)的基本手段。JDK中java.io包中就有管道類(lèi),同時(shí),管道在JXTA中是最基本的概念,是對(duì)等點(diǎn)之間的數(shù)據(jù)傳輸?shù)闹饕绞健?duì)等管道協(xié)議(PBP)明確規(guī)范了對(duì)等管道的綁定,解析,響應(yīng)。本文依次剖析集中式(JDK)和對(duì)等環(huán)境下(JXTA)管道的實(shí)現(xiàn)方式,對(duì)比分析其異同,然后嘗試在JXTA中建立一個(gè)虛擬的全雙工的管道。本文的目標(biāo)是通過(guò)對(duì)不同環(huán)境下管道的實(shí)現(xiàn)方式對(duì)比分析,來(lái)理解為什么JXTA采用管道作為基本的數(shù)據(jù)傳輸手段。2 管道的形象化描述一個(gè)生活中的情景:現(xiàn)在有兩個(gè)地區(qū)A,B。A是石油生產(chǎn)區(qū),B是石油消費(fèi)區(qū),現(xiàn)在B地區(qū)需要消費(fèi)A地區(qū)的石油,當(dāng)然可以通過(guò)海運(yùn),空運(yùn)獲得,然而最通常的方式是架設(shè)輸油管道。如圖所示: IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/1.gif[/IMG] 內(nèi)容: 引言 管道的形象化描述 集中式環(huán)境下管道的實(shí)現(xiàn) JXTA對(duì)等管道的實(shí)現(xiàn) 案例描述 案例分析 如何去構(gòu)建一個(gè)全雙工的對(duì)等管道 總結(jié) 參考資料 關(guān)于作者 Java 專(zhuān)區(qū)中還有: 教學(xué) 工具與產(chǎn)品 代碼與組件 所有文章 實(shí)用技巧 Project JXTA 中對(duì)等管道的構(gòu)建 潘大為 (ppalas@sina.com)華中科技大學(xué)計(jì)算機(jī)學(xué)院2000級(jí)碩士研究生2002 年 7 月1 引言管道的概念源于Unix,是不同線程之間直接傳輸數(shù)據(jù)的基本手段。JDK中java.io包中就有管道類(lèi),同時(shí),管道在JXTA中是最基本的概念,是對(duì)等點(diǎn)之間的數(shù)據(jù)傳輸?shù)闹饕绞健?duì)等管道協(xié)議(PBP)明確規(guī)范了對(duì)等管道的綁定,解析,響應(yīng)。本文依次剖析集中式(JDK)和對(duì)等環(huán)境下(JXTA)管道的實(shí)現(xiàn)方式,對(duì)比分析其異同,然后嘗試在JXTA中建立一個(gè)虛擬的全雙工的管道。本文的目標(biāo)是通過(guò)對(duì)不同環(huán)境下管道的實(shí)現(xiàn)方式對(duì)比分析,來(lái)理解為什么JXTA采用管道作為基本的數(shù)據(jù)傳輸手段。2 管道的形象化描述一個(gè)生活中的情景:現(xiàn)在有兩個(gè)地區(qū)A,B。A是石油生產(chǎn)區(qū),B是石油消費(fèi)區(qū),現(xiàn)在B地區(qū)需要消費(fèi)A地區(qū)的石油,當(dāng)然可以通過(guò)海運(yùn),空運(yùn)獲得,然而最通常的方式是架設(shè)輸油管道。如圖所示:java中流的概念和管道的概念都可以通過(guò)此案例闡述,A與B之間連接的就是管道,負(fù)責(zé)將A的石油向B輸出。A向管道輸出數(shù)據(jù)(output),B從管道輸入數(shù)據(jù)(input),可以這樣理解,管道是A的輸出對(duì)象,是B的數(shù)據(jù)源。這里就產(chǎn)生了三個(gè)類(lèi):輸出流A,輸入流B,管道。輸入流B負(fù)責(zé)如何獲取數(shù)據(jù)(read 操作),輸出流A負(fù)責(zé)如何消費(fèi)數(shù)據(jù)(write操作),管道負(fù)責(zé)連接它們(connect 操作)。其實(shí),在實(shí)現(xiàn)時(shí),管道類(lèi)分解為管道口,管道出口,由入口出口負(fù)責(zé)連接。在復(fù)雜的網(wǎng)絡(luò)環(huán)境中,這種連接方式可以有專(zhuān)門(mén)的網(wǎng)絡(luò)協(xié)議負(fù)責(zé)(例如,JXTA中的PBP,全稱(chēng)Pipe Bind Protocol)。由以上描述,我們可以清楚知道最原始的管道就是單向的,文章后面介紹的雙向管道,是用兩個(gè)單向管道虛擬的,而非真實(shí)的連接方式。不難發(fā)現(xiàn)管道最關(guān)鍵的問(wèn)題是如何協(xié)調(diào)輸出(A)與輸入(B)。這在不同的網(wǎng)絡(luò)環(huán)境會(huì)遇到不同的問(wèn)題,最簡(jiǎn)單的是同一JVM下的不同過(guò)程(線程或任務(wù))之間用同步方式傳遞數(shù)據(jù)。而對(duì)等環(huán)境下,如何去發(fā)現(xiàn)對(duì)方就是一個(gè)很現(xiàn)實(shí)的問(wèn)題,這僅僅只是問(wèn)題的其中之一,下面的章節(jié)會(huì)依次分析。3 集中式環(huán)境下管道的實(shí)現(xiàn)問(wèn)題的描述:A與B是在同一JVM中,A,B有一方能夠發(fā)現(xiàn)另一方的存在,A將數(shù)據(jù)發(fā)往B方,A發(fā)送數(shù)據(jù)與B接收數(shù)據(jù)是相互獨(dú)立的。現(xiàn)在回到問(wèn)題的最初:為什么要使用管道?A只管發(fā)送,B只管接受,那么數(shù)據(jù)在哪兒呢?經(jīng)過(guò)下面的分析,就會(huì)明白管道把管理數(shù)據(jù)緩沖區(qū)的重任交給了他自己,A,B均是圍繞這個(gè)緩沖區(qū)來(lái)啟停線程的,顯然這才是問(wèn)題的本質(zhì)。JDK中,類(lèi)PipeInputStream(即前面所述的B)與PipeOutputStream(即前面所述的的A)可以很好的解決這一問(wèn)題。首先給出類(lèi)圖如下。 IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/2.gif[/IMG]下面是將類(lèi)PipeOutputStream的connect方法代碼簡(jiǎn)化后給予注釋。public synchronized void connect(PipedInputStream snk) throws IOException { sink = snk; //將PipeInputStream的實(shí)例作為PipeOutputStream的一個(gè)屬性,以便調(diào)用 snk.in = -1;//緩沖區(qū)的輸入位置, urn:jxta:uuid-59616261646162614A787461503250335003093E73074218AE3ABBE08EF3CBE303JxtaUnicastPipeExample 如果您需要對(duì)JXTA管道有實(shí)例化的概念,請(qǐng)參考Sing Li的使p2p能進(jìn)行交互操作:Jxta命令shell ,這篇文章有部分內(nèi)容專(zhuān)門(mén)介紹了如何在通過(guò)shell使用管道。本文主要是從編程的視角去看管道是如何實(shí)現(xiàn)的。4.1 客戶(hù)視角Project JXTA : Java Programmer's Guide Chapter7有個(gè)例子闡述如何去在對(duì)等點(diǎn)之間發(fā)送信息,讀者可以到www.jxta.org下載源碼。現(xiàn)在從客戶(hù)視角簡(jiǎn)要的分析它的傳送原理,要深入的了解可以看下一節(jié)的系統(tǒng)視角分析。該例中,有兩個(gè)對(duì)等點(diǎn),并且構(gòu)建了兩個(gè)不同的類(lèi):一個(gè)負(fù)責(zé)接收(Pipelistener),一個(gè)負(fù)責(zé)發(fā)送(PipeExample)。具體的接收次序可以參考時(shí)序圖: IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/3.gif[/IMG]類(lèi)Pipelistener實(shí)現(xiàn)了接口PipeMsgListener,類(lèi)PipeExample實(shí)現(xiàn)了接口OutputPipeListener。由時(shí)序圖(這是兩個(gè)JVM中的類(lèi),所以時(shí)序符號(hào)是獨(dú)立標(biāo)示的)可以清晰的獲知,各個(gè)對(duì)等點(diǎn)的前1,2步是相互獨(dú)立的。各自的第3步,采用回調(diào)的方式建立輸入和輸出管道。一旦對(duì)等系統(tǒng)探測(cè)到對(duì)方的存在,就分別觸發(fā)各自的事件發(fā)送或接收消息。顯然JXTA中管道是異步的。調(diào)試該例程時(shí),注意先建立輸入管道,然后建立輸出管道。因?yàn)椋敵龉艿涝谝欢ǖ臅r(shí)間和次數(shù)內(nèi)探測(cè)不到輸入管道的存在,就會(huì)主動(dòng)放棄。否則,容易讓網(wǎng)絡(luò)系統(tǒng)在這些無(wú)休止的探測(cè)中癱瘓。4.2 系統(tǒng)視角從上面的例程中,可以了解對(duì)等管道的創(chuàng)建方法,以及數(shù)據(jù)流程,但是不能明確對(duì)等系統(tǒng)是如何去實(shí)現(xiàn)的。JXTA中管道的實(shí)現(xiàn)比在JDK中實(shí)現(xiàn)要復(fù)雜得多,具體的技術(shù)標(biāo)準(zhǔn)可以參考對(duì)等管道綁定協(xié)議(PBP),此協(xié)議規(guī)范了JXTA中管道的概念,但并沒(méi)有涉及到如何去實(shí)現(xiàn),這同樣是所有JXTA協(xié)議的特征。它們的目標(biāo)是闡述what it is,而把how to do it留給開(kāi)發(fā)者,這樣有利于增強(qiáng)系統(tǒng)的開(kāi)放性。其中Java參考實(shí)現(xiàn),就是該協(xié)議實(shí)現(xiàn)的一個(gè)案例,以下將具體分析。首先看管道實(shí)現(xiàn)的類(lèi)圖(以單播為例): IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/4.gif[/IMG]關(guān)鍵的類(lèi): InputPipeImpl :輸入管道的實(shí)現(xiàn)類(lèi) NonBlockingOutputPipe :輸出管道的實(shí)現(xiàn)類(lèi) PipeServiceImpl :管道服務(wù)的實(shí)現(xiàn)類(lèi),負(fù)責(zé)創(chuàng)建輸入輸出管道 PipeResolver :提供管道綁定的解析服務(wù) 通過(guò)客戶(hù)視角的分析,可以得知系統(tǒng)外部是通過(guò)PipeServiceImpl來(lái)獲取輸入輸出管道。那么消息是如何在對(duì)等系統(tǒng)中通過(guò)管道過(guò)濾和傳遞的? 從程序?qū)崿F(xiàn)的角度,涉及到太多的技術(shù)細(xì)節(jié),JXTA的參考實(shí)現(xiàn)中有著龐雜的監(jiān)聽(tīng)系統(tǒng)。本文嘗試用一個(gè)案例從兩個(gè)層次去解析這個(gè)問(wèn)題,兩個(gè)層次分別是消息的具體形式,服務(wù)和端點(diǎn)協(xié)議的具體分發(fā)策略。很顯然,這里我們把注意力放在了管道的架構(gòu)路徑上,而把如何去架構(gòu)放在了一邊,我想它們是有先后關(guān)系的,并且距離并不遙遠(yuǎn)。5 案例描述現(xiàn)在假設(shè)有兩個(gè)對(duì)等點(diǎn)alas 和sisal ,在一個(gè)局域網(wǎng)內(nèi),按照客戶(hù)視角那一節(jié)的例程sisal先建立輸入管道,alas建立輸出管道。由于同一網(wǎng)內(nèi)可以用廣播的方式發(fā)送查詢(xún)信息,可以不設(shè)rendevous,并且路由是兩點(diǎn)間的,消息傳遞過(guò)程得到了一定的簡(jiǎn)化。6 案例分析以上案例中,從輸入輸出管道的建立到完成對(duì)接并傳輸數(shù)據(jù)總共有5個(gè)步驟:sisal建立輸入管道 alasl建立輸出管道,需要查找輸入管道,通過(guò)廣播向網(wǎng)絡(luò)發(fā)出管道查詢(xún)消息 sisal獲得alas的管道查詢(xún)消息,通過(guò)單播向sisal發(fā)出響應(yīng)表示 alas獲得sisal的響應(yīng),通過(guò)單播向alas發(fā)出數(shù)據(jù) sisal獲得數(shù)據(jù) 6.1 輸入管道的建立sisal通過(guò)管道服務(wù)(pipeserviceImpl)創(chuàng)建輸入管道InputPipeImpl,并將自己注冊(cè)端點(diǎn)服務(wù)和管道解析服務(wù)中。6.2 輸出管道的建立alas通過(guò)管道服務(wù),分析管道廣告,把自己注冊(cè)于管道服務(wù)和管道解析服務(wù)。然后轉(zhuǎn)交管道解析服務(wù),查詢(xún)是否存在本地或緩存中,不存在則通過(guò)集中服務(wù)向網(wǎng)絡(luò)發(fā)送廣播。rendevous首先將廣播消息給端點(diǎn)服務(wù),由端點(diǎn)服務(wù)決定用哪一個(gè)網(wǎng)絡(luò)協(xié)議,本案例中,端點(diǎn)服務(wù)采用TCP協(xié)議發(fā)送廣播。廣播消息的內(nèi)容如下(消息是名稱(chēng),類(lèi)型,內(nèi)容構(gòu)成的三元組,類(lèi)型可以是xml也可以是二進(jìn)制,以下列出的均用xml格式,所以省略了type)name=RendezVousPropagatecontent=<?xml version='1.0'?> jxta:RendezVousPropagateMessage> 7urn:jxta:uuid-DEADBEEFDEAFBABAFEEDBABE0000000205jxta-NetGroupOResurn:jxta:uuid-59616261646162614A78746150325033BFED264F86E14966B71A855134C813A5031023521770614 name=RendezVousPropagateurn:jxta:jxta-NetGroupcontent=<?xml version='1.0'?> jxta:RendezVousPropagateMessage> 7urn:jxta:uuid-DEADBEEFDEAFBABAFEEDBABE0000000205jxta-NetGroupORes urn:jxta:uuid-59616261646162614A78746150325033BFED264F86E14966B71A855134C813A5031023521770614 name=jxta-NetGroupORescontent=<?xml version='1.0'?> jxta:ResolverQuery> JxtaPipeResolver 0 urn:jxta:uuid-59616261646162614A78746150325033BFED264F86E14966B71A855134C813A503<?xml version='1.0'?> jxta:PipeResolver> Query urn:jxta:uuid-59616261646162614A757874614D504725184FBC4E5D498AA0919F662E40028B04 JxtaUnicast 6.3 響應(yīng)查詢(xún)信息sisal的網(wǎng)絡(luò)端口監(jiān)聽(tīng)到alas的廣播消息,將消息轉(zhuǎn)發(fā)給端點(diǎn)服務(wù)處理。端點(diǎn)服務(wù)查詢(xún)了消息的內(nèi)容,又轉(zhuǎn)發(fā)給集中服務(wù),集中服務(wù)又將查詢(xún)的內(nèi)容轉(zhuǎn)交解析服務(wù)處理,然后解析服務(wù)轉(zhuǎn)交給管道解析服務(wù),此時(shí)發(fā)現(xiàn)本地注冊(cè)的廣告就是所要查詢(xún)的廣告,因此返回響應(yīng)消息給了解析服務(wù),然后有端點(diǎn)服務(wù)負(fù)責(zé)發(fā)送回應(yīng)消息。響應(yīng)的內(nèi)容: <?xml version='1.0'?> jxta:PipeResolver> Answerurn:jxta:uuid-59616261646162614A757874614D504725184FBC4E5D498AA0919F662E40028B04JxtaUnicasturn:jxta:uuid-59616261646162614A7874615032503386E8880590814538A64682785564B9A603對(duì)等點(diǎn)廣告,內(nèi)容較多,所以省略了 6.4 接收響應(yīng)消息,發(fā)送數(shù)據(jù)alas的網(wǎng)絡(luò)端口收到sisal發(fā)送的響應(yīng)消息,轉(zhuǎn)交端點(diǎn)服務(wù),對(duì)路由信息處理以后轉(zhuǎn)交解析服務(wù),然后到管道解析服務(wù),發(fā)現(xiàn)注冊(cè)表中含有客戶(hù)端的事件(listener)。則觸發(fā)該事件發(fā)送數(shù)據(jù)。6.5 獲得數(shù)據(jù)sisal的網(wǎng)絡(luò)端口收到alas發(fā)送的數(shù)據(jù),轉(zhuǎn)交端點(diǎn)服務(wù),對(duì)路由信息處理以后,發(fā)現(xiàn)注冊(cè)表中含有客戶(hù)端的監(jiān)聽(tīng)事件,則觸發(fā)該事件分析數(shù)據(jù)。從下面的消息內(nèi)容可以發(fā)現(xiàn)所得到的數(shù)據(jù)就是:Hello from peer alas獲得的消息如下name= jxta:EndpointSourceAddresscontent = tcp://192.168.0.58:9703/name= jxta:EndpointDestinationAddresscontent = tcp://192.168.0.58:9701/EndpointRouter/jxta-WorldGroupname = Jxta:EndpointRoutercontent = <?xml version='1.0'?> jxta:EndpointRouterMessage> jxta://uuid-59616261646162614A78746150325033A85AC96048BF4C5A98438038268F5E7003 jxta://uuid-59616261646162614A7874615032503386E8880590814538A64682785564B9A603/PipeService/urn:jxta:uuid-59616261646162614A757874614D504725184FBC4E5D498AA0919F662E40028B04 jxta://uuid-59616261646162614A78746150325033A85AC96048BF4C5A98438038268F5E7003 1 name = PipeListenerMsgcontent = Hello from peer alas6.6 小結(jié)從消息的傳遞與處理可以看出JXTA系統(tǒng)中,各個(gè)服務(wù)之間有著清晰的職責(zé)劃分。這樣的體系結(jié)構(gòu)非常有利于提供給客戶(hù)透明的管道。相對(duì)于用戶(hù)而言,在JXTA使用管道和在集中式的環(huán)境下(Jdk)下的區(qū)別僅僅在于增加了管道的廣告來(lái)標(biāo)示管道,而不需將輸入管道和輸出管道放在一起成對(duì)使用。從上面的案例中,還會(huì)發(fā)現(xiàn)如果用的是同一個(gè)管道廣告,可以有多個(gè)發(fā)送者一個(gè)接收者。這相比成對(duì)使用輸入輸出用途更廣。當(dāng)然,JXTA還支持多對(duì)多的廣播管道,不過(guò)實(shí)現(xiàn)方式與單播不太一致,并且正在完善中。7 如何去構(gòu)建一個(gè)全雙工的對(duì)等管道上述的例程中,A是信息的發(fā)送者,B是信息的接收者,信息單向傳輸。能否A,B既是發(fā)送者又是接受者呢?解決辦法很簡(jiǎn)單,再建立一條從B到A的管道,然后將這兩條管道綁定在一起。JXTA的工具包net.jxta.impl.util含有BidirectionalPipeService類(lèi)實(shí)現(xiàn)了這一目標(biāo)。類(lèi)圖如下: IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/5.gif[/IMG]類(lèi)圖下面的三個(gè)類(lèi)和一個(gè)接口均是內(nèi)部類(lèi)。Pipe是一個(gè)封裝完好的雙向管道,建立管道的過(guò)程如下時(shí)序圖:(這一時(shí)序圖的視角是客戶(hù)對(duì)象A,B是如何外部連接的) IMG http://www-900.cn.ibm.com/developerWorks/cn/java/l-jxta2/6.gif[/IMG]以上時(shí)序圖中,A的accept()和B的connect()是一個(gè)異步操作,他們互相連通以后返回Pipe類(lèi)的對(duì)象pipe。Pipe的inputPipe和outputPipe負(fù)責(zé)從對(duì)方獲取信息和向?qū)Ψ桨l(fā)送信息。它們互不干擾,當(dāng)然同步性也沒(méi)有控制,很像實(shí)際生活中的IP電話。A的accept()和B的connect(),完成了A與B的兩次通信過(guò)程,建立了兩個(gè)獨(dú)立的管道其過(guò)程如下:(首先外部已建立了從B到A的臨時(shí)管道)A監(jiān)聽(tīng)B的信息 B創(chuàng)建輸入管道的廣告,以此產(chǎn)生輸入管道inputPipe,然后按消息name=inputPipeAdv將廣告發(fā)送出去 A收到B的消息,以inputPipeAdv的內(nèi)容作為管道廣告,創(chuàng)建輸出管道outputPipe。然后創(chuàng)建輸入管道的廣告,以此產(chǎn)生輸入管道inputPipe,然后按消息name=inputPipeAdvAck將廣告發(fā)送出去 B收到A的消息,以inputPipeAdvAck的內(nèi)容作為管道廣告,創(chuàng)建輸出管道outputPipe。 A,B均返回 new Pipe(inputPipe,outputPipe) 8 總結(jié)漫長(zhǎng)的論述過(guò)程,完成了一個(gè)目標(biāo),弄明對(duì)等點(diǎn)A與B是如何通過(guò)管道通訊的。對(duì)于JXTA程序開(kāi)發(fā)人員一個(gè)很重要的原則,就是明白自己的程序所在的協(xié)議層次,維護(hù)好JXTA協(xié)議的清晰的層次結(jié)構(gòu)對(duì)于整個(gè)系統(tǒng)的可擴(kuò)展和和可維護(hù)性均是至關(guān)重要的。管道在JXTA內(nèi)部的構(gòu)建過(guò)程,可以讓我們感覺(jué)到JXTA協(xié)議的職責(zé)在Java參考實(shí)現(xiàn)中有著明確的劃分。在復(fù)雜的對(duì)等環(huán)境中,對(duì)等點(diǎn)之間的有價(jià)值的通信是非常重要的,而如何通信又是一個(gè)很復(fù)雜的問(wèn)題。管道服務(wù)提供了這種便捷的通信的抽象,留給服務(wù)的享受者只有三個(gè)概念:管道廣告,入口,出口。所以,我想這就是JXTA采用管道作為基本的數(shù)據(jù)傳輸手段的一個(gè)很重要的思想方式。參考文獻(xiàn)官方的 Jxta 社區(qū)位于 Jxta.org。您可在這里找到最新的規(guī)范、文檔、源代碼和二進(jìn)制文件 在 developerWorks Java 技術(shù)專(zhuān)區(qū)查找更多 Java 參考資料。 Early Adopter JXTA 作者 Sing Li 關(guān)于作者:潘大為,華中科技大學(xué)計(jì)算機(jī)學(xué)院2000級(jí)碩士研究生,研究方向網(wǎng)絡(luò)對(duì)等計(jì)算,網(wǎng)絡(luò)信息系統(tǒng)。 Email: ppalas@sina.com Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产一级免费视频 | 亚洲国产高清在线精品一区 | 国产精品国产三级国产专区5o | 伊人天堂在线 | 欧美综合在线观看 | 最新在线精品国自拍视频 | 久草在线免费资源站 | 亚洲第一页视频 | 国产精品国产三级国产a | 三级com| 萝控精品福利视频一区 | 亚洲 欧美 国产 日韩 制服 bt | 久久精品视频在线观看榴莲视频 | 久久免费视频在线 | 网站三级| 国产色手机在线观看播放 | 成人免费观看视频久爱网 | 久久精品免视看国产明星 | 纯欧美一级毛片免费 | 在线视频 国产交换 | 亚洲一区二区三区四区五区六区 | 99精品国产成人一区二区 | 亚洲国产成人久久三区 | 91色老99久久九九爱精品 | 欧美在线不卡 | 日本一级视频 | 亚洲日韩中文字幕天堂不卡 | 成人国产精品高清在线观看 | 亚欧人成精品免费观看 | 成人网在线视频 | 精品国产中文一级毛片在线看 | 欧美成人看片黄a免费 | 综合亚洲一区二区三区 | 日韩中文字幕免费观看 | 美国一级毛片免费 | 国产亚洲精品久久久久久久久激情 | 日日碰碰 | 色偷偷亚洲偷自拍 | aa毛片免费全部播放完整 | 久久精品国产免费高清 | 国产做国产爱免费视频 |