精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

走進(jìn)Android WiFi P2P技術(shù),一探設(shè)備間點(diǎn)對點(diǎn)通信實(shí)現(xiàn)細(xì)節(jié)

移動開發(fā) Android
WiFi P2P被廣泛應(yīng)用于移動設(shè)備之間的文件共享、游戲聯(lián)機(jī)、音樂播放等應(yīng)用場景中。相較于藍(lán)牙,WiFi P2P具有更快的搜索速度和傳輸速度,以及更遠(yuǎn)的傳輸距離。而且只需要打開WiFi即可,不需要加入任何網(wǎng)絡(luò)或AP,即可實(shí)現(xiàn)對等點(diǎn)連接通訊。對于需要在用戶之間共享數(shù)據(jù)的應(yīng)用,如多人游戲或照片共享非常有用。

WiFi P2P技術(shù)

WiFi P2P(Peer-to-Peer),也被稱為WiFi Direct,是WiFi聯(lián)盟發(fā)布的一個協(xié)議。允許無線網(wǎng)絡(luò)中的設(shè)備在無需無線路由器的情況下相互連接,通過WiFi直接實(shí)現(xiàn)兩臺設(shè)備之間的無線點(diǎn)對點(diǎn)通信。原理與基于AP(接入點(diǎn))的通信方式類似,支持P2P的設(shè)備可以在同一個小組內(nèi)互傳數(shù)據(jù),實(shí)現(xiàn)同屏功能。

WiFi P2P被廣泛應(yīng)用于移動設(shè)備之間的文件共享、游戲聯(lián)機(jī)、音樂播放等應(yīng)用場景中。相較于藍(lán)牙,WiFi P2P具有更快的搜索速度和傳輸速度,以及更遠(yuǎn)的傳輸距離。而且只需要打開WiFi即可,不需要加入任何網(wǎng)絡(luò)或AP,即可實(shí)現(xiàn)對等點(diǎn)連接通訊。對于需要在用戶之間共享數(shù)據(jù)的應(yīng)用,如多人游戲或照片共享非常有用。

WiFi P2P也存在一些安全性問題,如用戶隱私泄露、惡意軟件和病毒傳播,以及侵權(quán)和違法內(nèi)容的傳播。為了保護(hù)用戶的安全和隱私,一些P2P網(wǎng)絡(luò)提供了匿名化處理功能,使用安全搜索引擎,以及設(shè)置過濾器來阻止違法和侵權(quán)內(nèi)容的共享。

Android WiFi P2P架構(gòu)

在P2P架構(gòu)中,定義了兩種主要角色:P2P Group Owner(簡稱GO)和P2P Client(簡稱GC)。GO的作用類似于Infrastructure BSS中的AP(接入點(diǎn)),而GC的作用類似于Infrastructure BSS中的STA(站點(diǎn))。當(dāng)兩臺設(shè)備通過P2P連接后,會隨機(jī)(也可以手動指定)指派其中一臺設(shè)備為組擁有者(GO),相當(dāng)于一臺服務(wù)器,另一臺設(shè)備為組成員(GC)。其他設(shè)備可以通過與GO設(shè)備連接加入組,但不能直接和GC設(shè)備連接。

圖片圖片

在Android系統(tǒng)中,WiFi P2P功能是在Android 4.0及更高版本系統(tǒng)中加入的。它可以通過WifiP2pManager類進(jìn)行實(shí)現(xiàn),這個類提供了許多方法來掃描可用設(shè)備、建立P2P連接并傳輸數(shù)據(jù)等功能。開發(fā)者可以通過這些方法來實(shí)現(xiàn)設(shè)備之間的文件傳輸?shù)炔僮鳌?/p>

在設(shè)備發(fā)現(xiàn)階段,Android WiFi P2P使用Probe Request和Probe Response幀來交換設(shè)備信息。在2.4GHz的1、6、11頻段上發(fā)送Probe Request幀,這幾個頻段被稱為Social Channels。一旦Listen Channel選擇好后,在整個P2P Discovery階段就不能更改,用于快速發(fā)現(xiàn)周圍的Group。

盡管Android WiFi P2P功能強(qiáng)大,目前在Android系統(tǒng)中只是內(nèi)置了設(shè)備的搜索和鏈接功能,并沒有像藍(lán)牙那樣有許多應(yīng)用。在實(shí)際開發(fā)中,可能需要通過軟件手段解決一些邏輯和權(quán)限問題。

Android應(yīng)用WiFi P2P實(shí)現(xiàn)數(shù)據(jù)傳輸

在Android中,WiFi P2P可以通過WifiP2pManager類進(jìn)行實(shí)現(xiàn)。開發(fā)者可以通過獲取WifiP2pManager實(shí)例,并進(jìn)行廣播接受者的創(chuàng)建和注冊,調(diào)用其他WiFi P2P的API,實(shí)現(xiàn)設(shè)備間的搜索、連接和數(shù)據(jù)傳輸?shù)裙δ?。例如,指定某一臺設(shè)備為服務(wù)器,創(chuàng)建群組并等待客戶端的連接請求,而客戶端則可以主動搜索附近的設(shè)備并加入群組,向服務(wù)器發(fā)起文件傳輸請求。

圖片圖片

添加權(quán)限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
獲取WifiP2pManager和WifiP2pManager.Channel對象
mWifiP2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
mWifiP2pManager?.initialize(this, Looper.getMainLooper()) {
    Log.d(TAG, "Channel斷開連接")
}
服務(wù)端創(chuàng)建群組
//服務(wù)端創(chuàng)建群組
mWifiP2pManager?.createGroup(mChannel, object : WifiP2pManager.ActionListener {
    override fun onSuccess() {
        Log.d(TAG, "創(chuàng)建群組成功")
    }

    override fun onFailure(reason: Int) {
        Log.w(TAG, "創(chuàng)建群組失敗$reason")
    }
})
客戶端搜索對等設(shè)備
//客戶端搜索對等設(shè)備
mWifiP2pManager?.discoverPeers(mChannel, object : WifiP2pManager.ActionListener {
    override fun onSuccess() {
        Log.d(TAG, "搜索成功")
    }

    override fun onFailure(reason: Int) {
        Log.d(TAG, "搜索失敗:$reason")
    }

})
//使用異步方法(推薦通過廣播監(jiān)聽) 獲取設(shè)備列表
mWifiP2pManager?.requestPeers(mChannel) {
    mDeviceList.addAll(it.deviceList)
    if (mDeviceList.isEmpty()) {
        //沒有設(shè)備
        runOnUiThread { Toast.makeText(this, "沒有發(fā)現(xiàn)設(shè)備", Toast.LENGTH_SHORT).show() }
    } else {
        //刷新列表
        runOnUiThread { mDeviceAdapter.notifyDataSetChanged() }
    }
}
連接設(shè)備
val config = WifiP2pConfig().apply {
    this.deviceAddress = wifiP2pDevice.deviceAddress
    this.wps.setup = WpsInfo.PBC
}
mWifiP2pManager?.connect(mChannel, config, object : WifiP2pManager.ActionListener {
    override fun onSuccess() {
        Log.d(TAG, "連接成功")
    }

    override fun onFailure(reason: Int) {
        Log.w(TAG, "連接失敗$reason")
    }

})
服務(wù)端創(chuàng)建Socket進(jìn)行數(shù)據(jù)讀寫
// 將數(shù)據(jù)發(fā)送給客戶端
//需要創(chuàng)建子線程 否則在主線程網(wǎng)絡(luò)操作直接閃退
val serverSocket = ServerSocket(8888)
val socket = serverSocket.accept()
val inputStream = socket.getInputStream()
val outputStream = socket.getOutputStream()
//發(fā)送數(shù)據(jù)
outputStream?.write(data)
//此處為了方便 實(shí)際需要開啟線程讀取 并且要有合適的延遲
while (!mQuitReadData) {
    val reader = inputStream.bufferedReader(StandardCharsets.UTF_8)
    val text = reader.readLine()
    Log.d(TAG, "讀取到的數(shù)據(jù)$text")
}
客戶端創(chuàng)建Socket進(jìn)行數(shù)據(jù)讀寫
//需要創(chuàng)建子線程 否則在主線程網(wǎng)絡(luò)操作直接閃退
val address: InetAddress = info.groupOwnerAddress
val socket = Socket(address, 8888)
val inputStream = socket.getInputStream()
val outputStream = socket.getOutputStream()
//發(fā)送數(shù)據(jù)
outputStream?.write(data)
//此處為了方便 實(shí)際需要開啟線程讀取 并且要有合適的延遲
while (!mQuitReadData) {
    val reader = inputStream.bufferedReader(StandardCharsets.UTF_8)
    val text = reader.readLine()
    Log.d(TAG, "讀取到的數(shù)據(jù)$text")
}
class MainActivity : AppCompatActivity() {

    private val TAG = MainActivity::class.java.simpleName

    private lateinit var mBinding: ActivityMainBinding

    private var mWifiP2pManager: WifiP2pManager? = null
    private var mChannel: WifiP2pManager.Channel? = null

    private var mDeviceList = arrayListOf<WifiP2pDevice>()
    private lateinit var mDeviceAdapter: DeviceAdapter

    private var mQuitReadData = true

    @SuppressLint("NotifyDataSetChanged")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        ViewCompat.setOnApplyWindowInsetsListener(mBinding.main) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)
        registerReceiver(mReceiver, intentFilter)

        mDeviceAdapter = DeviceAdapter(mDeviceList)
        mBinding.rvDeviceList.adapter = mDeviceAdapter
        mDeviceAdapter.mOnItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                val wifiP2pDevice = mDeviceList[position]
                connect(wifiP2pDevice)
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {
            }
        }

        //通用步驟
        mWifiP2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager

        mChannel = mWifiP2pManager?.initialize(this, Looper.getMainLooper()) {
            Log.d(TAG, "Channel斷開連接")
        }

        //服務(wù)端部分
        //服務(wù)端創(chuàng)建群組
        mWifiP2pManager?.createGroup(mChannel, object : WifiP2pManager.ActionListener {
            override fun onSuccess() {
                Log.d(TAG, "創(chuàng)建群組成功")
            }

            override fun onFailure(reason: Int) {
                Log.w(TAG, "創(chuàng)建群組失敗$reason")
            }
        })

        //客戶端部分
        //客戶端搜索對等設(shè)備
        mWifiP2pManager?.discoverPeers(mChannel, object : WifiP2pManager.ActionListener {
            override fun onSuccess() {
                Log.d(TAG, "搜索成功")
            }

            override fun onFailure(reason: Int) {
                Log.d(TAG, "搜索失敗:$reason")
            }

        })

        //使用異步方法(推薦通過廣播監(jiān)聽) 獲取設(shè)備列表
        mWifiP2pManager?.requestPeers(mChannel) {
            mDeviceList.addAll(it.deviceList)
            if (mDeviceList.isEmpty()) {
                //沒有設(shè)備
                runOnUiThread { Toast.makeText(this, "沒有發(fā)現(xiàn)設(shè)備", Toast.LENGTH_SHORT).show() }
            } else {
                //刷新列表
                runOnUiThread { mDeviceAdapter.notifyDataSetChanged() }
            }
        }
    }

    /**
     * 連接設(shè)備
     */
    private fun connect(wifiP2pDevice: WifiP2pDevice) {
        val config = WifiP2pConfig().apply {
            this.deviceAddress = wifiP2pDevice.deviceAddress
            this.wps.setup = WpsInfo.PBC
        }
        mWifiP2pManager?.connect(mChannel, config, object : WifiP2pManager.ActionListener {
            override fun onSuccess() {
                Log.d(TAG, "連接成功")
                mQuitReadData = false
                transferData("Hello".toByteArray())
            }

            override fun onFailure(reason: Int) {
                Log.w(TAG, "連接失敗$reason")
                mQuitReadData = true
            }

        })
    }

    private fun transferData(data: ByteArray) {
        //請求設(shè)備連接信息
        mWifiP2pManager?.requestConnectionInfo(mChannel) { info ->
            if (info.groupFormed && info.isGroupOwner) {
                // 將數(shù)據(jù)發(fā)送給客戶端
                val serverSocket = ServerSocket(8888)
                val socket = serverSocket.accept()
                val inputStream = socket.getInputStream()
                val outputStream = socket.getOutputStream()
                //發(fā)送數(shù)據(jù)
                outputStream?.write(data)
                //此處為了方便 實(shí)際需要開啟線程讀取 并且要有合適的延遲
                while (!mQuitReadData) {
                    val reader = inputStream.bufferedReader(StandardCharsets.UTF_8)
                    val text = reader.readLine()
                    Log.d(TAG, "讀取到的數(shù)據(jù)$text")
                }
            } else {
                //設(shè)備是客戶端
                val address: InetAddress = info.groupOwnerAddress
                val socket = Socket(address, 8888)
                val inputStream = socket.getInputStream()
                val outputStream = socket.getOutputStream()
                //發(fā)送數(shù)據(jù)
                outputStream?.write(data)
                //此處為了方便 實(shí)際需要開啟線程讀取 并且要有合適的延遲
                while (!mQuitReadData) {
                    val reader = inputStream.bufferedReader(StandardCharsets.UTF_8)
                    val text = reader.readLine()
                    Log.d(TAG, "讀取到的數(shù)據(jù)$text")
                }
            }
        }
    }

    private val mReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val action = intent?.action;
            if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                // Check to see if Wi-Fi is enabled and notify appropriate activity
                // 檢查 Wi-Fi P2P 是否已啟用
                val state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1)
                val isEnabled = (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED)
            } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
                // Call WifiP2pManager.requestPeers() to get a list of current peers
                //異步方法
                // mWifiP2pManager?.requestPeers();
            } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                // Respond to new connection or disconnections
                // 鏈接狀態(tài)變化回調(diào)
                // 此廣播 會和 WIFI_P2P_THIS_DEVICE_CHANGED_ACTION 同時回調(diào)
                // 注冊廣播、連接成功、連接失敗 三種時機(jī)都會調(diào)用
                // 應(yīng)用可使用 requestConnectionInfo()、requestNetworkInfo() 或 requestGroupInfo() 來檢索當(dāng)前連接信息。
            } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
                // Respond to this device's wifi state changing
                // 此設(shè)備的WiFi狀態(tài)更改回調(diào)
                // 此廣播 會和 WIFI_P2P_CONNECTION_CHANGED_ACTION 同時回調(diào)
                // 注冊廣播、連接成功、連接失敗 三種時機(jī)都會調(diào)用
                // 應(yīng)用可使用 requestDeviceInfo() 來檢索當(dāng)前連接信息。
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        //移除群組
        mWifiP2pManager?.removeGroup(mChannel, null)
        //取消鏈接
        mWifiP2pManager?.cancelConnect(mChannel, null)
    }
}

Android WiFi P2P使用流程總結(jié):

  1. 「權(quán)限聲明」:

在AndroidManifest.xml中聲明必要的權(quán)限,包括網(wǎng)絡(luò)訪問權(quán)限和文件讀寫權(quán)限。

  1. 「初始化」:

在Android應(yīng)用中,首先需要獲取WifiP2pManager實(shí)例,并通過調(diào)用其initialize方法進(jìn)行初始化。這將注冊應(yīng)用并準(zhǔn)備使用Wi-Fi P2P功能。

初始化完成后,會獲得一個Channel對象,它是后續(xù)操作的關(guān)鍵。

3.「廣播接收與處理」:

在整個過程中,應(yīng)用需要注冊并監(jiān)聽特定的廣播,以處理Wi-Fi P2P狀態(tài)變化、設(shè)備發(fā)現(xiàn)、連接變化等事件。

這些廣播會通知應(yīng)用有關(guān)Wi-Fi P2P操作的狀態(tài)和結(jié)果,以便應(yīng)用可以做出相應(yīng)的響應(yīng)。

4.「設(shè)備發(fā)現(xiàn)」:

使用WifiP2pManager的discoverPeers方法開始搜索附近的Wi-Fi P2P設(shè)備。

設(shè)備會在特定的頻段(如2.4GHz的1、6、11頻段)上發(fā)送Probe Request幀來尋找其他設(shè)備。

搜索到的設(shè)備會作為列表展示在應(yīng)用界面上,用戶可以從中選擇想要連接的設(shè)備。

5.「建立連接」:

選定一個設(shè)備后,作為客戶端或服務(wù)端(Group Owner,GO)發(fā)起連接請求。

通過WifiP2pConfig對象配置連接參數(shù),如目標(biāo)設(shè)備的地址和WPS(Wi-Fi Protected Setup)設(shè)置。

使用WifiP2pManager的connect方法嘗試建立連接。

6.「連接確認(rèn)與數(shù)據(jù)傳輸」:

一旦連接建立成功,設(shè)備之間就可以開始數(shù)據(jù)傳輸了。

可以通過Socket編程在設(shè)備之間建立連接,并傳輸文件或其他數(shù)據(jù)。

根據(jù)應(yīng)用需求,可以創(chuàng)建服務(wù)端套接字監(jiān)聽客戶端的連接請求,也可以作為客戶端主動連接到服務(wù)端。

7.「數(shù)據(jù)傳輸完成與斷開連接」:

數(shù)據(jù)傳輸完成后,應(yīng)用需要適當(dāng)?shù)仃P(guān)閉套接字和斷開Wi-Fi P2P連接。

使用WifiP2pManager的相關(guān)方法來斷開連接,并釋放相關(guān)資源。

責(zé)任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2024-08-06 14:03:35

2012-12-10 09:46:21

P2P云存儲Symform

2009-04-07 10:39:13

2009-05-18 09:11:00

IPTV融合寬帶

2011-11-17 16:58:11

AndroidAdobeAIR

2010-03-22 15:27:40

云計(jì)算

2020-03-05 20:30:15

Syncthing文件同步工具開源

2010-07-13 14:41:14

2022-07-19 16:59:04

流媒體傳輸IPC物聯(lián)網(wǎng)

2023-03-14 12:43:57

2011-12-19 09:46:31

2010-10-29 09:43:50

Wi-Fi DirecWi-Fi聯(lián)

2010-03-10 10:51:30

2017-11-20 17:53:00

阿里開源容器

2018-08-16 07:29:02

2012-09-25 13:47:43

C#網(wǎng)絡(luò)協(xié)議P2P

2015-04-27 11:49:23

2010-06-28 11:15:45

BitTorrent協(xié)

2013-12-12 13:46:40

大數(shù)據(jù)金融P2P大數(shù)據(jù)

2010-07-07 10:31:45

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲欧美色视频| 日本三级片在线观看| 欧美一级做一级爱a做片性| 一区免费观看视频| 国产成人女人毛片视频在线| 日韩精品手机在线| 日韩激情免费| 亚洲福利视频免费观看| 久热精品在线播放| 超碰成人av| 国产精品久久久久久久久免费丝袜| 91免费的视频在线播放| 丰满少妇乱子伦精品看片| 欧美丰满日韩| 精品视频在线观看日韩| 在线视频日韩欧美| 国产高清不卡| 亚洲一区在线电影| 亚洲日本精品国产第一区| 免费av网站观看| 久久精品99国产精品| 55夜色66夜色国产精品视频| 日本黄区免费视频观看| 蜜桃久久久久| 欧美一级二级在线观看| 99视频精品免费| a级片在线免费观看| 最新中文字幕一区二区三区 | 欧美中文字幕在线观看视频| yourporn在线观看中文站| 成人黄色大片在线观看| 国产日韩综合一区二区性色av| 国产精品国产三级国产专区52| 99精品视频在线观看播放| 亚洲色图25p| 99久久免费看精品国产一区| 欧美日韩午夜电影网| 欧美婷婷六月丁香综合色| 六月激情综合网| yellow字幕网在线| 亚洲大型综合色站| 9191国产视频| 91麻豆一二三四在线| 日韩理论片一区二区| 亚洲 日韩 国产第一区| 国产永久免费高清在线观看视频| aaa亚洲精品一二三区| 成人区精品一区二区| 精品人妻少妇嫩草av无码专区| 看电视剧不卡顿的网站| 国产精品旅馆在线| 国产成人a v| 日韩电影在线一区| 国产精品jvid在线观看蜜臀| 黄色一级视频免费看| 老司机免费视频久久| 日本高清不卡的在线| 国产无套丰满白嫩对白| 在线综合亚洲| 国产成人精品久久二区二区| 亚洲不卡在线视频| 美洲天堂一区二卡三卡四卡视频| 国产精品偷伦免费视频观看的| 中文字幕人妻一区二区三区视频 | 欧美亚洲国产bt| 三上悠亚在线一区二区| 国产成人免费av一区二区午夜| 宅男在线国产精品| 国产精品一级无码| 加勒比色综合久久久久久久久 | av无码一区二区三区| 亚洲欧美校园春色| 中文字幕久久亚洲| 欧美性x x x| 国产精品xvideos88| 国内精品400部情侣激情| 国产情侣自拍av| 日韩精品久久理论片| 成人精品久久久| 亚洲精品综合网| 91小视频在线免费看| 日韩视频在线播放| 主播国产精品| 日韩欧美国产网站| 91看片破解版| 福利在线一区| 国产一区二区av| 青青青在线免费观看| 夜夜嗨av一区二区三区网站四季av| 日韩男女性生活视频| 中文字幕在线网站| 国产成人av电影在线观看| 蜜桃欧美视频| 老司机精品影院| 午夜久久久久久久久久一区二区| 精品久久久久久久无码| 日韩在线网址| 亚洲欧美国产日韩天堂区| 欧洲美女女同性互添| 日韩视频三区| 成人免费观看网址| 天堂av电影在线观看| 日韩理论片网站| 欧美 日韩精品| 88久久精品| 色yeye香蕉凹凸一区二区av| 黑鬼狂亚洲人videos| 久久一区二区三区超碰国产精品| 91精品视频专区| 蜜桃视频在线免费| 亚洲在线一区二区三区| 午夜剧场高清版免费观看| 亚洲伊人春色| 久久久久久久av| 国产一区二区小视频| 26uuu国产一区二区三区| av久久久久久| 欧美在线se| 亚洲无线码在线一区观看| 国产精品99无码一区二区| 久久精品国产网站| 欧美日韩一区在线播放 | 图片区亚洲欧美小说区| 国产不卡一区二区在线播放| 成人免费视频国产免费麻豆| 亚洲欧美在线视频| 色综合色综合色综合色综合| 亚洲激情播播| 欧美一区第一页| 日日躁夜夜躁白天躁晚上躁91| 综合久久综合久久| 亚洲欧美自拍另类日韩| 伊人久久大香线蕉av不卡| 97视频在线观看网址| 东京干手机福利视频| 亚洲人成人一区二区在线观看| 日本激情视频在线| 国产欧美一区| 国产精品观看在线亚洲人成网| 四虎精品在永久在线观看 | 亚洲精品自拍网| 成人久久一区| 国产精品三级在线| 91caoporn在线| 精品视频在线免费| 久久久久久久久福利| 日韩av中文在线观看| 日本亚洲自拍| 欧美日韩尤物久久| 日韩中文字幕视频| av免费观看在线| 亚洲午夜免费福利视频| 精品熟女一区二区三区| 999亚洲国产精| 欧美大香线蕉线伊人久久国产精品| 黄色污网站在线观看| 日韩av影院在线观看| 久久99精品波多结衣一区| 91免费看视频| 美女网站免费观看视频| 欧美理论在线播放| 成人福利网站在线观看| 成人免费网站在线观看视频| 日韩欧美国产麻豆| 日本特黄特色aaa大片免费| av电影在线观看一区| 久久久噜噜噜www成人网| 神马电影久久| 成人做爽爽免费视频| 日本高清成人vr专区| 亚洲缚视频在线观看| 成人h动漫精品一区二区下载| 中文字幕精品在线不卡| www.五月天色| 亚洲美女毛片| 一本一道久久a久久综合精品| 国产精品日韩精品在线播放| 欧美精品九九久久| 黄色av网站在线| 91麻豆精品91久久久久久清纯| 麻豆91精品91久久久| 91麻豆精东视频| 超碰在线97免费| 国产精品地址| 日本一区网站| 视频二区欧美毛片免费观看| 91高清视频免费| 欧美成人三区| 日韩h在线观看| 一级aaaa毛片| 欧美日韩中国免费专区在线看| 天堂网av2018| 99视频在线观看一区三区| 在线免费av播放| 99国产一区| 国产又爽又黄ai换脸| 欧美精品国产白浆久久久久| 国产精品高清网站| 国产黄大片在线观看| 波霸ol色综合久久| 免费在线高清av| 精品久久人人做人人爰| 久久精品偷拍视频| 精品久久在线播放| 欧美黑人猛猛猛| 国产欧美精品国产国产专区 | 91久久精品无嫩草影院| 国产成人精品午夜| 免费一二一二在线视频| 免费不卡在线观看av| 国产粉嫩一区二区三区在线观看| 欧美不卡在线视频| 国产又粗又猛又爽又黄91| 日韩欧美国产中文字幕| 欧美成人aaaaⅴ片在线看| 亚洲视频 欧洲视频| 真实乱视频国产免费观看| 成人国产精品免费观看| 天天摸天天舔天天操| 久久亚洲色图| av网站在线观看不卡| 国模吧视频一区| 99精品一级欧美片免费播放| 成人三级视频| 欧美午夜欧美| 婷婷成人影院| 久久精品二区| 久久午夜影院| 国严精品久久久久久亚洲影视| 国产亚洲字幕| 91精品国产高清久久久久久91裸体| 欧美日韩国产网站| 国产97在线播放| 户外露出一区二区三区| 琪琪第一精品导航| 激情都市亚洲| 欧美在线视频观看| 国产资源在线观看入口av| 97久久久久久| 狠狠操一区二区三区| 性欧美视频videos6一9| 国产h片在线观看| 97精品视频在线| 91九色porn在线资源| 91精品国产91久久久久久最新| 99热99re6国产在线播放| 欧美激情精品久久久久久蜜臀 | 色综合天天做天天爱| 免费看日批视频| 日本韩国一区二区三区视频| 日本视频免费观看| 欧洲国内综合视频| 中文字幕男人天堂| 91精品国产丝袜白色高跟鞋| av中文字幕免费| 日韩精品一区国产麻豆| 欧美 日韩 中文字幕| 亚洲国产成人精品女人久久久| 手机看片1024国产| 亚洲精品国精品久久99热| 四虎免费在线观看| 亚洲天堂精品在线| 日本电影全部在线观看网站视频| 久久伊人色综合| 毛片在线导航| 欧美最顶级的aⅴ艳星| 欧洲av一区二区| 91精品国产综合久久久久久久久| 久久天堂久久| 精品国产第一页| 不卡视频在线| 青青草视频在线视频| 免费在线亚洲欧美| 黄色片在线免费| 国产乱码精品一区二区三区av| bl动漫在线观看| 欧美激情一区在线| 免费无码毛片一区二区app| 欧美日韩国产页| 亚洲无码久久久久| 精品sm在线观看| 8888四色奇米在线观看| 欧美日本精品在线| 欧美日韩大片| 96pao国产成视频永久免费| 鲁大师精品99久久久| 性高潮久久久久久久久| 亚洲大胆av| 天天视频天天爽| 菠萝蜜视频在线观看一区| 免费成人深夜天涯网站| 亚洲综合网站在线观看| 成年人视频免费| 日韩精品一区二区三区蜜臀| 黄色片免费在线| 欧美激情亚洲视频| 国产欧美自拍| 精品日本一区二区三区| 国产精品久久久久一区二区三区厕所 | 激情欧美一区二区三区| 日本中文字幕高清| av在线不卡电影| 一级黄色录像视频| 在线观看不卡视频| 香蕉久久国产av一区二区| 久久亚洲精品网站| 成人精品电影在线| 极品尤物一区二区三区| 亚洲高清资源在线观看| 无码内射中文字幕岛国片| 成人高清视频在线观看| 欧美肥妇bbwbbw| 91国偷自产一区二区开放时间 | 欧美日韩在线视频播放| 精品国产伦一区二区三区观看体验| av影片免费在线观看| 国产91色在线| 麻豆精品少妇| 国产免费黄色一级片| 国产精品18久久久久久vr| 在线国产视频一区| 疯狂做受xxxx欧美肥白少妇| а√天堂资源在线| 久久av红桃一区二区小说| 欧美高清xxx| 视频一区二区在线观看| 天堂一区二区在线免费观看| 亚洲黄色免费在线观看| 亚洲图片欧美综合| 蜜桃在线一区二区| 欧美激情亚洲一区| 91久久偷偷做嫩草影院电| 97av中文字幕| 国产一区二区在线观看视频| www.xx日本| 欧美丰满美乳xxx高潮www| 亚洲麻豆精品| 国产日韩精品入口| 91偷拍一区二区三区精品| 另类小说色综合| 中文字幕av一区二区三区高| 午夜一区二区三区四区| 国产一区二区三区在线看| 日韩在线免费| 亚洲一区二区在线看| 久久www免费人成看片高清| www.99热| 欧美精品xxxxbbbb| а√天堂资源地址在线下载| 91精品久久久久久久久| 亚洲九九视频| 亚洲乱妇老熟女爽到高潮的片| 亚洲一区二区三区在线看| 色婷婷av一区二区三| 91福利视频网| 欧美亚洲在线日韩| 国内国产精品天干天干| 亚洲精品乱码久久久久久久久| www.国产麻豆| 欧美一区在线直播| 教室别恋欧美无删减版| 三上悠亚在线一区二区| 亚洲精品视频一区| 日韩一卡二卡在线| 欧美中文在线视频| 久久高清免费| 深夜视频在线观看| 欧美日韩国产精品一区二区三区四区| 少妇性bbb搡bbb爽爽爽欧美| 国产精品久久久久久久久久久不卡 | 精品一区二区三区影院在线午夜| 黄色一级视频免费| 日韩成人av网址| 亚洲精品555| 日韩在线观看a| 久久伊人中文字幕| 97人妻精品一区二区三区动漫| 久久久久久久久国产精品| 自拍自偷一区二区三区| www.com污| 精品日韩美女的视频高清| av播放在线观看| 国产经典一区二区三区| 日韩电影在线一区| 精品人妻在线播放| 夜夜躁日日躁狠狠久久88av| 精品91福利视频| 丰满人妻中伦妇伦精品app| 中文字幕一区二区三中文字幕| 日本xxxxxwwwww| 国产精品嫩草视频| 99国产精品| 精品无码久久久久成人漫画 | 成人h动漫精品一区| 欧美二区乱c少妇| 手机在线理论片| 丰满人妻一区二区三区53号| 国产夜色精品一区二区av| 国产区精品在线| 国产精品第七十二页|