<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rex Mao

    分享java技術(shù)與生活

    JAVA文件傳輸程序

    這個(gè)是我做的另一個(gè)畢業(yè)設(shè)計(jì),使用的最基本的socket通信實(shí)現(xiàn)文件傳輸,使用該程序可同時(shí)給多個(gè)人發(fā)送不同的文件并支持?jǐn)帱c(diǎn)續(xù)傳。
    由于只為畢業(yè)設(shè)計(jì)而寫(xiě)的,只實(shí)現(xiàn)了功能,沒(méi)有在速度上優(yōu)化,發(fā)上來(lái)只為給要做類似程序的朋友做個(gè)參考。以下是畢業(yè)論文中的節(jié)選。

    源代碼已經(jīng)上傳了。

    3章      設(shè)計(jì)文檔

    31       任務(wù)概述

           本項(xiàng)任務(wù)要開(kāi)發(fā)一款P2P文件傳輸軟件,該軟件可以在局域網(wǎng)和互連上使用,具有文件傳輸,斷點(diǎn)續(xù)傳,多線程連接等功能。

    311      開(kāi)發(fā)背景

           隨著網(wǎng)絡(luò)的普及,在網(wǎng)絡(luò)中交換信息,特別是文件成為使用網(wǎng)絡(luò)時(shí)經(jīng)常性工作,現(xiàn)有的文件傳輸工具如QQMSN等,主要功能是作為即時(shí)通訊工具使用,而且在局域網(wǎng)中使用時(shí)仍需連接到互連網(wǎng)。本文開(kāi)發(fā)的軟件基于P2P結(jié)構(gòu)實(shí)現(xiàn)文件傳輸,不依靠服務(wù)器維護(hù)用戶資料,所以,只要兩臺(tái)機(jī)器可以連通,就可以進(jìn)行文件傳輸。

    312       定義

           P2P:即peer-to-peer,可以理解為點(diǎn)對(duì)點(diǎn),或?qū)Φ葌鬏數(shù)囊馑肌?/span>

    313       開(kāi)發(fā)工具

           開(kāi)發(fā)采用JAVA語(yǔ)言,開(kāi)發(fā)工具為jbuilder 2005

    32       文件傳輸業(yè)務(wù)流程

    321       通訊順序關(guān)系

           在文件傳輸時(shí),傳輸過(guò)程可以簡(jiǎn)單的分為4步,如圖

    1、              由文件發(fā)送者發(fā)起文件傳輸,他首先發(fā)送文件名,文件大小,驗(yàn)證消息等信息給文件接收者。

    2、              文件接收者收到文件信息和發(fā)送者信息,決定是否接收,如不接收,則發(fā)送拒絕接收消息給文件發(fā)送者,文件傳輸結(jié)束。如同意接收,發(fā)送同意接收消息和文件傳輸起始字節(jié)(用于斷點(diǎn)續(xù)傳)給發(fā)送者。

    3、              發(fā)送者開(kāi)始發(fā)送文件數(shù)據(jù)包,直到最后一個(gè)文件數(shù)據(jù)包,發(fā)送者在最后一個(gè)文件數(shù)據(jù)包上加上標(biāo)記。

    4、              接收者識(shí)別最后一個(gè)文件數(shù)據(jù)包,文件傳輸成功。


    322       文件發(fā)送端的詳細(xì)業(yè)務(wù)流程


     

    圖中顯示了發(fā)送文件時(shí)的詳細(xì)業(yè)務(wù)流程。

    1、首先,要選擇要發(fā)送的文件,可以選擇一個(gè)文件或同一個(gè)文件夾下的多個(gè)文件發(fā)送,當(dāng)選擇多個(gè)文件時(shí),軟件將為每個(gè)文件建立一個(gè)傳輸線程。選擇文件后,發(fā)送者要填寫(xiě)目標(biāo)IP和端口,由于是基于P2P的文件傳輸,不存在服務(wù)器維護(hù)好友列表,所以需要知道目標(biāo)IP才能傳輸文件,用戶也可以填寫(xiě)驗(yàn)證消息用于描述自己的身份和文件的介紹。

    2、發(fā)送者收到確認(rèn)包,判斷是否接收文件,如果不接收,則傳輸結(jié)束,如果接收,則打開(kāi)要發(fā)送的文件,設(shè)置起始傳輸字節(jié)。

    3、發(fā)送者讀取一個(gè)文件片段,加入是否是最后一個(gè)文件片段的標(biāo)志,打包發(fā)給接收者。

    4、發(fā)送完最后一個(gè)文件片段時(shí),文件傳輸結(jié)束。

    323       文件接收者詳細(xì)業(yè)務(wù)流程


     

    1、 從一打開(kāi)軟件開(kāi)始,監(jiān)聽(tīng)線程就會(huì)啟動(dòng),這時(shí)用戶就扮演者文件接收者的角色,當(dāng)有文件發(fā)送者發(fā)來(lái)請(qǐng)求時(shí),監(jiān)聽(tīng)線程建立與發(fā)送者的連接,并創(chuàng)建傳輸線程,接收者得到發(fā)送者傳來(lái)的文件信息和驗(yàn)證消息,用戶還能得到發(fā)送者的IP地址,用戶根據(jù)這些信息決定是否接收文件,并發(fā)送確認(rèn)包給發(fā)送者,確認(rèn)包里包含了是否接收的標(biāo)志,和開(kāi)始傳輸?shù)钠鹗甲止?jié)。

    2、 接收者開(kāi)始接收數(shù)據(jù)包,解包,寫(xiě)入文件中,直到最后一個(gè)文件片段,關(guān)閉文件,文件傳輸結(jié)束。

    33       軟件的傳輸協(xié)議設(shè)計(jì)

           為了更好的控制文件傳輸?shù)牧鞒蹋_(kāi)發(fā)設(shè)計(jì)了文件傳輸協(xié)議,該協(xié)議屬于應(yīng)用層協(xié)議,為了不使傳輸過(guò)程過(guò)于復(fù)雜,協(xié)議盡量簡(jiǎn)單設(shè)計(jì)。主要的內(nèi)容是傳輸包的格式。

    331       傳輸包的格式


     

    其中傳輸包的類型有3種:

    PACKAGE_TYPE_FILENAME = 0x01

    文件名包,該包用于文件發(fā)送者向接收者發(fā)送文件信息和驗(yàn)證消息

    PACKAGE_TYPE_CONTEXT = 0x02

    文件內(nèi)容包,該包用于傳輸文件內(nèi)容

    PACKAGE_TYPE_CONFIRMRECEIVE = 0x03

    文件傳輸確認(rèn)包,該包用于文件接收者向發(fā)送者確認(rèn)文件的接收

    332       文件名包格式


     

    333      文件傳輸包格式

     

    其中MORE_DATA用于確認(rèn)是否是文件片段的最后一個(gè)包,以結(jié)束文件的傳輸。0表示沒(méi)有數(shù)據(jù),1表示還有數(shù)據(jù)。

    3. 34      文件接受確認(rèn)包格式


     

    其中CONFIRM_FLAG表示是否確認(rèn)文件接收,1表示接收,0表示不接收,當(dāng)接收時(shí),OFF表示文件傳輸?shù)钠鹗甲止?jié),用來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳。

    3.4       文件傳輸?shù)臓顟B(tài)機(jī)

    文件傳輸線程的地層其實(shí)就是一個(gè)狀態(tài)轉(zhuǎn)換機(jī),線程具有幾個(gè)狀態(tài),線程從文件名傳輸狀態(tài)開(kāi)始,根據(jù)文件傳輸?shù)牟煌闆r,在各個(gè)狀態(tài)間轉(zhuǎn)換,直到傳輸成功或傳輸失敗。

    FILE_TRANS_STATUS_FILENAME = 0x01

    文件名稱傳輸狀態(tài),文件傳輸剛建立連接時(shí),傳輸狀態(tài)處于文件名傳輸狀態(tài)

    FILE_TRANS_STATUS_CONTEXT = 0x02

    文件內(nèi)容傳輸轉(zhuǎn)臺(tái),在傳輸文件內(nèi)容時(shí),傳輸狀態(tài)屬于該狀態(tài)

    FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03

    等待確認(rèn)狀態(tài),文件發(fā)送者,發(fā)送完文件信息和驗(yàn)證消息后,處于該狀態(tài),文件接收者接收到文件信息和驗(yàn)證消息后處于該狀態(tài)

    FILE_TRANS_STATUS_SUCCESS = 0x04

    文件傳輸成功狀態(tài),表示文件已成功傳輸完畢

    FILE_TRANS_STATUS_FAIL = 0x05

    文件傳輸失敗狀態(tài),表示文件傳輸已經(jīng)失敗,失敗原因可能是對(duì)方取消了文件傳輸或網(wǎng)絡(luò)錯(cuò)誤




     

    3.5        結(jié)構(gòu)設(shè)計(jì)

    軟件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五個(gè)類構(gòu)成圖 表示了這幾個(gè)類之間的關(guān)系。


     

    類功能介紹

    MainFrame

    MainFrame類是軟件的主界面類,負(fù)責(zé)與用戶的交互。

    TransFileManager

    TransFileManager類是文件傳輸?shù)目刂祁悾?fù)責(zé)管理文件的傳輸,它維護(hù)一個(gè)傳輸線程(SocketThread)的列表,每個(gè)線程都表示一個(gè)正在傳輸?shù)娜蝿?wù)。TransFileManager類定時(shí)的掃描各個(gè)線程的狀態(tài),根據(jù)不同狀態(tài)做出不同處理,如計(jì)算傳輸速度,顯示傳輸進(jìn)度等。

    SocketThread

    SocketThread類是文件傳輸線程類,它負(fù)責(zé)底層的具體傳輸工作,包括打包與解包,并且轉(zhuǎn)換自己的狀態(tài),完成文件的傳輸。

    Server

    Server類是為TransFileManager類使用的,它負(fù)責(zé)本地端口的監(jiān)聽(tīng),一旦有用戶連接,TransFileManager就創(chuàng)建一個(gè)傳輸線程,放入線程列表。而它繼續(xù)監(jiān)聽(tīng)端口。

    TransFilePanel

    TransFilePanel是一個(gè)面板,它用有按鈕、進(jìn)度條,標(biāo)簽等用來(lái)顯示文件的傳輸狀態(tài)。

    3.6        類設(shè)計(jì)

    361       MainFrame

    該類是視圖類,是軟件的主界面。

     

    成員變量:

    contentPane

    contentPaneJPanel類的對(duì)象,是主界面的面板。

    jbtnSend

    jbtnSendJButton類對(duì)象,點(diǎn)擊它將打開(kāi)文件傳輸對(duì)話框。

    jbtnSetting

    jbtnSettingJButton類對(duì)象,點(diǎn)擊它將打開(kāi)設(shè)置對(duì)話框。

    jlblIP

    jlblIPJLable類對(duì)象,它顯示本機(jī)的IP地址,方便文件的傳輸。

    jtpTransFile

    jtpTransFileJTabbedPane類對(duì)象,是選項(xiàng)卡控件,用于顯示多個(gè)文件同時(shí)傳輸。

    tfm

    tfmTransFileManager類對(duì)象,負(fù)責(zé)控制文件的傳輸。

    成員方法:

    jbtnSend_anctionPerformed()

    該方法為jbtnSend按鈕的點(diǎn)擊事件

    jbtnSetting_actionPerformed()

    該方法為jbtnSetting按鈕的點(diǎn)擊事件

    This_windowClosed()

    該方法為窗口關(guān)閉事件

    界面截圖:


     

    362       TransFileManager

    該類負(fù)責(zé)傳輸過(guò)程中對(duì)各個(gè)傳輸線程的檢測(cè)與控制。


     

    成員變量:

    jtp

    jtp是選項(xiàng)卡控件對(duì)象,是MainFrame類中jtpTransFile對(duì)象的一個(gè)引用。

    panelist

    paneListArrayList類對(duì)象,它是一個(gè)鏈表結(jié)構(gòu),存儲(chǔ)使用的選項(xiàng)卡。

    running

    running是一個(gè)boolean型的對(duì)象,用來(lái)表示線程是否在執(zhí)行。

    s

    sServer類的對(duì)象,用來(lái)堅(jiān)聽(tīng)本地端口,等待用戶的連接。

    threadList

    threadListArrayList類對(duì)象,它是一個(gè)鏈表結(jié)構(gòu),存儲(chǔ)使用的傳輸線程。

    maxThreadNum

    maxTreadNum是整型變量,表示最大允許的線程數(shù)。

    port

    port是整型變量,表示使用的端口號(hào)。

    成員方法:

    close()

    該方法用于關(guān)閉文件傳輸?shù)目刂啤?/span>

    sendFile()

    該方法用于建立一個(gè)文件發(fā)送,要求輸入?yún)?shù)為,目標(biāo)IP,端口號(hào),要發(fā)送的文件和驗(yàn)證消息。

    3.6.3           SocketThread

    SocketThread類是文件傳輸?shù)牡讓又С诸悾峁┪募鬏數(shù)姆?wù)。


     

    成員變量:

    sendBuf

    sendBuf是一個(gè)字節(jié)型數(shù)據(jù),它是文件發(fā)送和接收時(shí)的緩沖區(qū)。

    dis

    disDataInputStream型對(duì)象,它是由Socket對(duì)象得到的輸入流。

    dos

    dosDataOutputStream型對(duì)象,它是由Socket對(duì)象得到的輸出流。

    fDis

    fDisDataInputStream型對(duì)象,它是要發(fā)送的文件的輸入流。

    raf

    rafRandomAccessFile型對(duì)象,該對(duì)象允許設(shè)置輸出流的位置,以支持?jǐn)帱c(diǎn)續(xù)傳。

    running

    running是一個(gè)boolean型對(duì)象,用來(lái)表示線程是否在執(zhí)行。

    serverName

    serverName是字符串型對(duì)象,表示服務(wù)器的地址,該對(duì)象只有在線程作為發(fā)送者時(shí)使用。

    errorMessage

    errorMessage是字符串型對(duì)象,表示出錯(cuò)的信息。

    fileName

    fileName是字符串型對(duì)象,表示文件名。

    fileSender

    fileSender是一個(gè)boolean型對(duì)象,表示是文件發(fā)送者還是文件接收者。

    IP

    IP是字符串型對(duì)象,用來(lái)存放目的機(jī)的IP地址。

    message

    message是字符串型對(duì)象,用來(lái)表示驗(yàn)證信息。

    port

    port是整型變量,表示連接的端口號(hào)。

    transFileLength

    transFileLength是長(zhǎng)整型變量,表示已經(jīng)傳輸?shù)奈募L(zhǎng)度,TransFileManager可以用它來(lái)計(jì)算傳輸進(jìn)度和傳輸速度

    成員方法:

    cancelTrans()

    該方法用于取消傳輸

    confirmReceiveFile()

    該方法用于確認(rèn)傳輸文件

    參數(shù)flag用來(lái)表示是否同意傳輸

    參數(shù)fileName用來(lái)表示保存的文件

    參數(shù)off用來(lái)表示起始傳輸字節(jié)

    getFileTransMessage()

    該方法用于得到文件傳輸?shù)幕拘畔ⅰH纾何募l(fā)送的目標(biāo),端口號(hào)等。

    getStatus()

    該方法返回一個(gè)整型變量,表示當(dāng)前線程的傳輸狀態(tài)。

    run()

    線程的執(zhí)行方法,該方法中循環(huán)執(zhí)行發(fā)送或接收方法,完成文件的發(fā)送或接收。

    setError()

    該方法通過(guò)一個(gè)字符串型的參數(shù)設(shè)置錯(cuò)誤信息。

    stopThread()

    該方法用于停止線程的執(zhí)行。

    doPackage()

    打包方法,該方法中,根據(jù)線程所處的不同狀態(tài),對(duì)數(shù)據(jù)加入不同的包頭和其他信息,進(jìn)行打包。

    readFromFile()

    該方法從要發(fā)送的文件中讀取一個(gè)整型數(shù)。

    readFromSocket()

    該方法從Socket輸入流讀取一個(gè)整型數(shù),它有一個(gè)重載版本讀取一個(gè)字節(jié)數(shù)組的數(shù)據(jù)。

    receiveFile()

    該方法為接收文件的方法,是線程循環(huán)中,文件接收者執(zhí)行的方法。

    sendFile()

    該方法為發(fā)送文件方法,是線程循環(huán)中,文件發(fā)送者執(zhí)行的方法。

    writeToFile()

    該方法寫(xiě)一個(gè)字節(jié)數(shù)據(jù)的數(shù)據(jù)到保存的文件中。

    writeToSocket()

    該方法寫(xiě)數(shù)據(jù)到Socket輸出流中,它有三個(gè)重載版本,分別是寫(xiě)入整型數(shù),寫(xiě)入長(zhǎng)整型數(shù)和寫(xiě)入字節(jié)數(shù)組數(shù)據(jù)。

    3.6.3            TransFilePanel

    這個(gè)類屬于視圖類,它作為主界面上的一個(gè)對(duì)象使用,含有進(jìn)度條,按鈕,標(biāo)簽的對(duì)象,用于顯示文件傳輸狀態(tài),每一個(gè)傳輸線程都擁有自己的TransFilePanel類對(duì)象。


     

    成員變量:

    fileName

    fileName是一個(gè)字符串,表示傳輸文件的文件名。

    fileSender

    fileSenderboolean型對(duì)象,表示是文件發(fā)送者還是接收者。

    isCanneled

    isCanneledboolean型對(duì)象,傳輸過(guò)程中,用戶點(diǎn)了取消按鈕后,該標(biāo)志位置trueTransFileManager會(huì)循環(huán)檢測(cè)isCanneled標(biāo)志,當(dāng)發(fā)現(xiàn)其為true后,它會(huì)關(guān)閉對(duì)應(yīng)的傳輸線程,而對(duì)方會(huì)檢測(cè)到傳輸錯(cuò)誤,文件傳輸就停止了。

    isClosed

    isClosedboolean型對(duì)象,它表示當(dāng)傳輸過(guò)程已經(jīng)停止時(shí),用戶點(diǎn)擊了關(guān)閉按鈕,TransFileManager檢測(cè)到isClosedtrue時(shí),會(huì)在列表中去掉對(duì)應(yīng)的傳輸線程和TransFilePanel

    isConfirm

    isConfirmboolean型對(duì)象,它表示文件接收者是否確認(rèn)了文件接收后(包括同意和拒絕),TransFileManager檢測(cè)到isConfirmtrue時(shí),會(huì)將確認(rèn)狀態(tài)發(fā)給文件發(fā)送者。

    jbtnCannel

    jbtnCannel是取消按鈕。

    jbtnOK

    jbtnOK是確定按鈕。

    jpgbFileTrans

    jpgbFileTrans是文件傳輸?shù)倪M(jìn)度條。

    jtaFileTransStatus

    jtaFileTransStatus是一個(gè)文本框,用來(lái)顯示文件傳輸?shù)臓顟B(tài)。

    transFileLength

    transFileLength是一個(gè)長(zhǎng)整型變量,用來(lái)表示已經(jīng)傳輸?shù)奈募L(zhǎng)度。

    status

    status是一個(gè)整行變量,表示文件傳輸?shù)臓顟B(tài),所表示的狀態(tài)與SocketThread中的對(duì)應(yīng)。

    界面截圖


     

    3.7              算法介紹

    371 TransFileManager的循環(huán)監(jiān)聽(tīng)

    TransFileManger類繼承了Thread類,實(shí)現(xiàn)多線程,避免循環(huán)監(jiān)聽(tīng)時(shí)產(chǎn)生阻塞。

    以下是在每次循環(huán)中做的工作

    1、 得到傳輸線程(SocketThread)的數(shù)量和傳輸狀態(tài)顯示面板(TransFilePanel)的數(shù)量。

    2、 從傳輸線程列表中依次取出一個(gè)傳輸線程。

    3、 判斷當(dāng)前取出的線程是否有對(duì)應(yīng)的傳輸狀態(tài)顯示面板,如果有執(zhí)行5,如果沒(méi)有執(zhí)行4

    4、 增加傳輸狀態(tài)顯示面板,并且在主界面上增加選項(xiàng)卡。

    5、 判斷傳輸線程的狀態(tài),根據(jù)不同的狀態(tài)做不同的處理。

    6、 如果列表中的線程取完,執(zhí)行1,沒(méi)有取完執(zhí)行2

    程序流程圖:



     

    372 斷點(diǎn)續(xù)傳

    軟件支持?jǐn)帱c(diǎn)續(xù)傳的功能,該功能主要算法如下:

    1、 當(dāng)文件傳輸中途停止時(shí),文件接收者程序?yàn)榻邮盏奈募?chuàng)建一個(gè)以該文件名+.tmp為文件名的臨時(shí)文件,臨時(shí)文件與該文件保存在同一個(gè)路徑下。臨時(shí)文件中保存文件以傳輸?shù)淖止?jié)數(shù)和文件的大小。

    2、 當(dāng)文件接收者接收該文件時(shí),如果有對(duì)應(yīng)的臨時(shí)文件,程序會(huì)檢測(cè)到該文件的臨時(shí)文件,讀取以傳輸?shù)淖止?jié)數(shù)和文件大小,并且比較傳輸?shù)淖止?jié)數(shù)與未完成傳輸?shù)奈募笮∈欠裣嗟龋募笮『桶l(fā)送來(lái)的文件大小是否相等,如果都相等,執(zhí)行3,否則執(zhí)行4

    3、 將文件的輸出流設(shè)置到應(yīng)該繼續(xù)傳輸?shù)奈恢茫⑵鹗紓鬏斪止?jié)數(shù)發(fā)給發(fā)送者,執(zhí)行5

    4、 如果有未完成的傳輸文件,將其刪除,執(zhí)行5

    5、 進(jìn)行文件傳輸。

    程序流程圖:




     

    3.7.3            本地端口的多連接監(jiān)聽(tīng)

    Server類對(duì)象負(fù)責(zé)本地端口的監(jiān)聽(tīng),可以支持多了連接,具體數(shù)量由用戶設(shè)置。

    1、  用用戶設(shè)置的端口創(chuàng)建監(jiān)聽(tīng),等待連接。

    2、  當(dāng)有用戶連接上后,用該連接創(chuàng)建一個(gè)SocketThread傳輸線程,加入到線程列表。

    3、  如果停止監(jiān)聽(tīng)則退出,否則執(zhí)行1

    程序流程圖:

    posted on 2007-11-03 11:19 Rex Mao 閱讀(13599) 評(píng)論(5)  編輯  收藏 所屬分類: 技術(shù)

    評(píng)論

    # re: JAVA文件傳輸程序 2010-04-05 16:33 輕帆向南

    太感謝了~~目前正在做相關(guān)的一個(gè)項(xiàng)目,我想下載下來(lái)學(xué)習(xí)一下
    可是源代碼找不到啊,能提供一份嗎?
    謝謝哈~郵箱dong1028@gmail.com  回復(fù)  更多評(píng)論   

    # re: JAVA文件傳輸程序 2012-06-04 17:14 編程狂男

    非常感謝,我目前正在做類似的項(xiàng)目,想學(xué)習(xí)一下,能提供一份源代碼嗎?謝謝!郵箱kaiwen0930@gmail.com!  回復(fù)  更多評(píng)論   

    # re: JAVA文件傳輸程序 2012-12-04 20:17 欠世

    最近在做socket上的文件傳送,不知道該怎么判斷一個(gè)文件的結(jié)束,希望樓主可以個(gè)我發(fā)份源代碼,學(xué)習(xí)一下。謝謝了!  回復(fù)  更多評(píng)論   

    # re: JAVA文件傳輸程序 2012-12-04 20:18 欠世

    最近在做socket上的文件傳送,不知道該怎么判斷一個(gè)文件的結(jié)束,希望樓主可以個(gè)我發(fā)份源代碼,學(xué)習(xí)一下。謝謝了!忘了留郵箱了 puxuanling@163.com  回復(fù)  更多評(píng)論   

    # re: JAVA文件傳輸程序 2013-08-16 14:40 wenwen

    求代碼學(xué)習(xí),827970893@qq.com  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 成人永久免费福利视频网站| baoyu777永久免费视频| 77777午夜亚洲| 亚洲乱码一二三四区乱码| 亚洲国色天香视频| 77777亚洲午夜久久多喷| 狠狠色伊人亚洲综合网站色| 亚洲无吗在线视频| 亚洲第一综合天堂另类专| 亚洲av无码成人影院一区| 粉色视频在线观看www免费| 一级成人毛片免费观看| 大妹子影视剧在线观看全集免费 | 亚洲一级特黄大片无码毛片 | 91福利免费视频| 永久看日本大片免费35分钟| 久草视频免费在线观看| 成人无遮挡毛片免费看| 国产成人免费ā片在线观看| 亚洲Av无码乱码在线观看性色| 亚洲精品国产精品乱码不卞| 国产亚洲色婷婷久久99精品| 91亚洲自偷手机在线观看| 亚洲中文字幕久在线| 亚洲av片在线观看| jizz免费观看视频| 最好看的中文字幕2019免费| 国产麻豆视频免费观看| 国产网站在线免费观看| 久久精品国产亚洲一区二区三区| 亚洲国产精品成人精品无码区 | 亚洲AV午夜福利精品一区二区| 亚洲综合无码一区二区| 一本色道久久综合亚洲精品蜜桃冫| 亚洲成a人无码亚洲成av无码| 一级毛片在线完整免费观看| 久久久久成人精品免费播放动漫| 国产成人免费高清激情视频| 免费中文字幕在线| 亚洲国产精品久久| 亚洲AV无码男人的天堂 |