精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美xxxx网站| 在线中文资源天堂| 日韩一级免费| 自拍偷拍亚洲精品| 激情文学亚洲色图| av福利导福航大全在线| 久久久久久电影| 91午夜理伦私人影院| 亚洲视频免费播放| 国产精品99久久久久久动医院| 精品区一区二区| 亚洲精品高清无码视频| 天堂а√在线官网| gogo大胆日本视频一区| 成人h视频在线| 欧美一二三区视频| 在线国产一区| 中日韩美女免费视频网址在线观看| 中文字幕第10页| 超薄肉色丝袜脚交一区二区| 亚洲自拍与偷拍| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品裸体瑜伽视频| 日本成a人片在线观看| 91小视频在线观看| 亚洲一区二区久久久久久| 国产成人精品777777| 欧美日韩久久| 精品国内亚洲在观看18黄| 美国黄色a级片| 久久一级大片| 欧美区视频在线观看| 337p粉嫩大胆噜噜噜鲁| 日本aa在线| 亚洲男人的天堂网| 亚洲午夜精品国产| 国产女人在线观看| 久久综合精品国产一区二区三区 | 97精品在线视频| 欧美日韩亚洲国产另类| 97精品国产一区二区三区| 日韩精品在线视频美女| 亚洲视频天天射| 日韩中文字幕在线一区| 777奇米四色成人影色区| 成人亚洲视频在线观看| 欧美亚洲韩国| 日韩欧美主播在线| av之家在线观看| 大桥未久在线视频| 亚洲大型综合色站| 亚洲色成人www永久在线观看 | 永久免费看片在线观看| japansex久久高清精品| 91麻豆精品久久久久蜜臀| 久热精品在线观看视频| 国产成人精品一区二区三区在线 | 欧美激情在线有限公司| 欧美成人黄色网| 欧美日韩一区自拍 | 国产中文字字幕乱码无限| 久久久久免费av| 欧美成年人视频| 青娱乐91视频| 国内精品美女在线观看| 午夜精品蜜臀一区二区三区免费| 久草精品视频在线观看| 亚洲精选国产| 国产成人av网址| 做爰视频毛片视频| 黄页视频在线91| 99国产盗摄| 日韩欧美亚洲系列| 日本一区二区三区在线观看| 亚洲一区三区在线观看| gogo在线高清视频| 亚洲一区二区视频在线| av观看免费在线| 国产69精品久久| 欧美一区二区三区免费大片 | 日韩中文字幕二区| 草民电影神马电影一区二区| 91精品国产欧美一区二区 | 久久久久久久久99精品| 亚洲v国产v在线观看| 国内精品不卡| 欧美日韩国产精品一区| 性生交免费视频| 欧美不卡在线观看| 日韩黄色高清视频| 国产性猛交xx乱| 欧美视频四区| 国产精品第100页| 成人福利小视频| 久久久久久麻豆| 中文字幕av日韩精品| www欧美xxxx| 欧美在线一二三| 无码人妻一区二区三区精品视频| 神马久久一区二区三区| 久久国产精品影片| 99久久精品国产亚洲| 国产色综合网| 亚洲一区二区三区xxx视频| 污污网站在线免费观看| 中文字幕一区二区三区蜜月| 免费国产黄色网址| 精品美女一区| 日韩理论片久久| 久久久久久久麻豆| 亚洲一级在线| 91亚洲精品丁香在线观看| 极品白浆推特女神在线观看| 一级精品视频在线观看宜春院 | 欧美成年网站| 在线精品91av| 中文字幕亚洲精品一区| 国产精品一区二区不卡| 日本亚洲自拍| 蜜桃av在线播放| 日韩一级欧美一级| 91麻豆制片厂| 久久九九国产| 精品网站在线看| 天天色天天射天天综合网| 精品视频免费看| 色欲av无码一区二区三区| 韩国亚洲精品| 亚洲影视中文字幕| 免费在线观看黄| 欧美日韩在线播放三区四区| 免费看污黄网站在线观看| 亚洲国产美女| 成人自拍偷拍| 日日夜夜天天综合入口| 88在线观看91蜜桃国自产| 国产123在线| 日韩影院免费视频| 欧美亚洲国产免费| 日本三级一区| 亚洲乱码一区二区| 久久国产视频一区| 91视视频在线直接观看在线看网页在线看| 日韩精品第1页| 国产一区二区久久久久| 久久精视频免费在线久久完整在线看 | 欧美三级乱码| 国产激情一区二区三区在线观看| www视频在线免费观看| 欧美一区二区三区白人| 成人在线观看免费完整| 国产乱对白刺激视频不卡| 五月天综合婷婷| 综合伊人久久| 91av网站在线播放| 欧美成人免费| 在线观看区一区二| 国产三级精品三级观看| 极品少妇一区二区三区精品视频 | 制服丝袜一区二区三区| 免费成年人视频在线观看| 国产最新精品精品你懂的| 中国 免费 av| 爱高潮www亚洲精品| 韩剧1988免费观看全集| 亚洲av激情无码专区在线播放| 欧美日韩亚洲国产一区| 一级黄色片网址| 蜜臀av在线播放一区二区三区| 一区二区不卡在线观看| 亚洲午夜精品| 91爱爱小视频k| 98在线视频| 日韩天堂在线观看| 五月婷婷开心网| 日本一区二区成人| 97免费公开视频| 亚洲影音先锋| 亚洲在线视频一区二区| 视频精品国内| 国产91在线播放| 国产高清一区二区三区视频| 日韩网站在线看片你懂的| 天堂中文在线网| 中文字幕一区二区三区视频| 香蕉在线观看视频| 日韩主播视频在线| 国产欧美综合一区| 天天操综合520| 成人免费自拍视频| a级片在线免费观看| 一本久久综合亚洲鲁鲁| jlzzjlzzjlzz亚洲人| 欧美午夜精品久久久久久久| 99久久99久久精品免费| 成人性生交大片| 中文字幕一区二区三区四区在线视频| 综合天堂久久久久久久| 蜜桃传媒视频第一区入口在线看| 成人豆花视频| 欧美性受xxxx白人性爽| 福利视频在线| 亚洲人成在线电影| 亚洲精品中文字幕成人片| 欧美伊人精品成人久久综合97| 特级片在线观看| 欧美国产日韩在线观看| 欧美日韩人妻精品一区在线| 蜜桃精品视频在线| 国产肥臀一区二区福利视频| 综合久久十次| 中文字幕精品—区二区日日骚| 日韩一级电影| 高清日韩一区| 曰本一区二区| 国产精品久久久久久久久借妻| 久久av色综合| 欧美成人激情在线| 91精品国产91久久久久游泳池 | 中国美女乱淫免费看视频| 国产乱码精品一区二区三区av | 成人免费aaa| 中文字幕乱码亚洲无线精品一区 | 免费一级做a爰片久久毛片潮| 成人在线视频首页| 在线免费黄色小视频| 美腿丝袜在线亚洲一区| 日韩欧美xxxx| 久久国产88| 自慰无码一区二区三区| 伊人精品成人久久综合软件| 国产精品igao激情视频| 四虎国产精品免费观看| 亚洲精品国产精品国自产观看 | 91网上在线视频| 久久国产劲爆∧v内射| 国产福利一区二区| 红桃视频一区二区三区免费| 激情图片小说一区| 三级视频中文字幕| 日本不卡视频在线| 中文字幕永久视频| 青青草97国产精品免费观看无弹窗版| 日韩中文字幕免费在线| 视频一区在线播放| 久久九九国产视频| 日本免费新一区视频| 三级a在线观看| 日本美女一区二区三区视频| 天天干天天操天天玩| 毛片av一区二区| 色一情一区二区三区| 狠狠色丁香久久婷婷综合_中 | www久久精品| 我和岳m愉情xxxⅹ视频| 久久精品网站免费观看| 神马久久久久久久久久久| 中文一区二区完整视频在线观看| 久久久久久成人网| 国产精品日韩精品欧美在线 | 午夜久久久影院| 国产特黄大片aaaa毛片| 欧美性20hd另类| а中文在线天堂| 欧美日韩激情一区| 99久久国产免费| 亚洲精品成人久久久| 蜜桃视频在线入口www| 中文在线资源观看视频网站免费不卡| a√资源在线| 欧美成人在线免费视频| 99爱在线视频| 国产精品久久久久久久7电影| 久久久久伊人| 高清av免费一区中文字幕| 久久九九热re6这里有精品| 欧美久久久久久久| 99久久夜色精品国产亚洲1000部| 亚洲小视频在线播放| 国产人成精品一区二区三| 熟女少妇精品一区二区| 国产麻豆视频精品| 中出视频在线观看| 中文字幕亚洲欧美在线不卡| 久久精品视频6| 欧洲精品视频在线观看| 国产成人免费看一级大黄| 精品视频中文字幕| 黄色网页在线免费观看| 97超碰色婷婷| av在线国产精品| 免费在线一区二区| 欧美+亚洲+精品+三区| 欧美a在线视频| 国产在线日韩欧美| 国产精品亚洲无码| 亚洲久本草在线中文字幕| 四虎成人在线观看| 日韩你懂的电影在线观看| 欧美新色视频| 欧美激情亚洲综合一区| **在线精品| 国产精品播放| 91精品一区二区三区综合在线爱 | 亚洲色图国产精品| 日日夜夜天天综合入口| 国产精品久久久久久亚洲影视| 波多野结衣一区二区三区免费视频| 日韩欧美在线电影| 亚洲乱码久久| 国产又粗又猛又爽又黄| 中文av一区特黄| 成人免费毛片男人用品| 日韩女优av电影在线观看| a视频网址在线观看| 91av视频在线| 国产乱人伦丫前精品视频| 中国一区二区三区| 蜜臀av亚洲一区中文字幕| 亚洲国产欧美视频| 午夜视频久久久久久| 国产a级免费视频| 久久精品电影一区二区| 国产精品久久久久久久久久齐齐| 久久精彩视频| 亚洲欧洲视频| 天天躁日日躁狠狠躁av麻豆男男| 亚洲欧美日本韩国| 国产又黄又猛又爽| 亚洲无线码在线一区观看| 美女av在线免费看| 国产精品视频入口| 欧美日韩99| 免费人成视频在线播放| 亚洲免费观看在线视频| 91亚洲国产成人久久精品麻豆 | 中国毛片直接看| 欧美男同性恋视频网站| 午夜精品一区| 国产深夜精品福利| 99久久.com| 在线a免费观看| 亚洲图片你懂的| av老司机久久| 欧美第一黄网免费网站| 日韩视频一二区| 天堂8在线天堂资源bt| 国产成人精品影视| 国产一级中文字幕| 亚洲国产精品网站| 黑森林国产精品av| 久久亚洲午夜电影| 久久精品天堂| 亚洲第一视频区| 欧美美女一区二区在线观看| 日韩av中文| 91精品婷婷国产综合久久蝌蚪| 欧美日韩亚洲三区| 国产亚洲色婷婷久久99精品91| 狠狠色狠色综合曰曰| 黄色美女网站在线观看| 国产精品一区二区久久久| 天天揉久久久久亚洲精品| 人妻体体内射精一区二区| 亚洲成av人片在线观看| 三级在线电影| 国产免费一区二区三区在线能观看| 国产精品久久久久无码av| 国产91在线免费观看| 午夜电影网一区| 九色在线观看| 成人做爽爽免费视频| 亚洲国产精品一区制服丝袜| 欧美图片第一页| 在线播放91灌醉迷j高跟美女| 国产偷倩在线播放| 欧美久久久久久| 国产一区二区三区四区五区入口 | 亚洲国产美女视频| 亚洲第一视频网站| 91在线成人| 久久观看最新视频| 久久夜色精品国产噜噜av| 亚洲在线精品视频| 国内精品一区二区三区| 加勒比久久综合| 91网址在线观看精品| 狠狠躁夜夜躁人人爽超碰91| 色三级在线观看| 国产在线一区二| 精品亚洲成a人在线观看| 国产精品第72页| 日韩亚洲欧美中文高清在线| 成人在线视频你懂的| 一区二区三区入口| 亚洲成人免费av| 欧美人xxx| 欧洲一区二区在线观看| 国产乱子伦一区二区三区国色天香| 91丝袜一区二区三区|