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

在Android上,一個(gè)完整的UDP通信模塊應(yīng)該是怎樣的?

移動(dòng)開發(fā) Android
我們都知道,開發(fā)一個(gè) Android 應(yīng)用程序,目前大多數(shù)還是使用的是 Java 語(yǔ)言。在 Java 語(yǔ)言中怎么去使用 UDP 協(xié)議呢?

TCP與UDP差異對(duì)比分析

在這篇文章中,在可靠性、數(shù)據(jù)發(fā)送、適用場(chǎng)景等多個(gè)方面分析了二者的區(qū)別。而本文的目的是想給大家介紹下在 Android 設(shè)備上,一個(gè)手機(jī)通過(guò)熱點(diǎn)連接另一個(gè)手機(jī)。這種場(chǎng)景下,完整的 UDP 通信模塊應(yīng)該考慮哪些方面,又應(yīng)該如何優(yōu)化,如何避開一些坑呢?

[[206556]]

UDP 在 Java 中的使用

我們都知道,開發(fā)一個(gè) Android 應(yīng)用程序,目前大多數(shù)還是使用的是 Java 語(yǔ)言。在 Java 語(yǔ)言中怎么去使用 UDP 協(xié)議呢?

上篇文章中我們沒說(shuō) Socket,其實(shí) Socket 可以理解為對(duì) TCP、UDP 協(xié)議在程序使用層面的封裝,提供出一些 api 來(lái)供程序員調(diào)用開發(fā),這就是 Socket 最表層的含義。

在 Java 中,與 UDP 相關(guān)的類有 DatagramSocket、DatagramPacket 等,關(guān)于他們的使用,這里不著重介紹。

好了,假設(shè)大家對(duì)他們的使用都已大概了解,可以正式開始本文的內(nèi)容了。

初始化一個(gè) UDPSocket

首先創(chuàng)建一個(gè)叫 UDPSocket 的類。

 

  1. public UDPSocket(Context context) { 
  2.         this.mContext = context; 
  3.         int cpuNumbers = Runtime.getRuntime().availableProcessors(); 
  4.         // 根據(jù)CPU數(shù)目初始化線程池 
  5.         mThreadPool = Executors.newFixedThreadPool(cpuNumbers * POOL_SIZE); 
  6.         // 記錄創(chuàng)建對(duì)象時(shí)的時(shí)間 
  7.         lastReceiveTime = System.currentTimeMillis(); 
  8.     } 

在構(gòu)造方法里,我們進(jìn)行下一些初始化操作,簡(jiǎn)單來(lái)說(shuō)就是創(chuàng)建一個(gè)線程池,記錄一下當(dāng)前時(shí)間毫秒值,至于他們有什么用,再往下看:

 

  1. public void startUDPSocket() { 
  2.         if (client != nullreturn
  3.         try { 
  4.             // 表明這個(gè) Socket 在設(shè)置的端口上監(jiān)聽數(shù)據(jù)。 
  5.             client = new DatagramSocket(CLIENT_PORT); 
  6.             if (receivePacket == null) { 
  7.                 // 創(chuàng)建接受數(shù)據(jù)的 packet 
  8.                 receivePacket = new DatagramPacket(receiveByte, BUFFER_LENGTH); 
  9.             } 
  10.             startSocketThread(); 
  11.         } catch (SocketException e) { 
  12.             e.printStackTrace(); 
  13.         } 
  14.     } 

這里我們首先創(chuàng)建了一個(gè) DatagramSocket 作為“客戶端”,其實(shí) UDP 本身沒有客戶端和服務(wù)端的概念,只有發(fā)送方和接收方的概念,我們把發(fā)送方暫時(shí)當(dāng)成是一個(gè)客戶端吧。

創(chuàng)建 DatagramSocket 對(duì)象時(shí),傳入了一個(gè)端口號(hào),這個(gè)端口號(hào)可以在一個(gè)范圍內(nèi)自己定義,表示這個(gè) DatagramSocket 在此端口上監(jiān)聽數(shù)據(jù)。

然后又創(chuàng)建了一個(gè) DatagramPacket 對(duì)象,作為數(shù)據(jù)的接收包。

***調(diào)用 startSocketThread 啟動(dòng)發(fā)送和接收數(shù)據(jù)的線程。

 

  1. /** 
  2.      * 開啟發(fā)送數(shù)據(jù)的線程 
  3.      */ 
  4.     private void startSocketThread() { 
  5.         clientThread = new Thread(new Runnable() { 
  6.             @Override 
  7.             public void run() { 
  8.                 Log.d(TAG, "clientThread is running..."); 
  9.                 receiveMessage(); 
  10.             } 
  11.         }); 
  12.         isThreadRunning = true
  13.         clientThread.start(); 
  14.         startHeartbeatTimer(); 
  15.     } 

首先 clientThread 線程的目的是調(diào)用 DatagramSocket receive 方法,因?yàn)?receive 方法是阻塞的,不能放在主線程,所以自然開啟一個(gè)子線程了。receiveMessage 就是處理接受到的 UDP 數(shù)據(jù)報(bào),我們先不看接受數(shù)據(jù)的這個(gè)方法,畢竟還沒人發(fā)消息呢,自然就談不上收了。

心跳包保持“長(zhǎng)連接”

來(lái)到本文的***個(gè)重點(diǎn),我們都知道 UDP 本身沒有連接的概念。在 Android 端應(yīng)用 UDP 和 TCP 的場(chǎng)景是一個(gè)手機(jī)連接另一個(gè)手機(jī)的熱點(diǎn),二者處在同一局域網(wǎng)中。在二者并不知道對(duì)方的存在時(shí),怎么才能發(fā)現(xiàn)彼此呢?

通過(guò)心跳包的方式,雙方都每隔一段時(shí)間發(fā)一個(gè) UDP 包,如果對(duì)方接收到了,那就能知道對(duì)方的 ip,建立起通信了。

 

  1. private static final long TIME_OUT = 120 * 1000; 
  2.     private static final long HEARTBEAT_MESSAGE_DURATION = 10 * 1000; 
  3.     /** 
  4.      * 啟動(dòng)心跳,timer 間隔十秒 
  5.      */ 
  6.     private void startHeartbeatTimer() { 
  7.         timer = new HeartbeatTimer(); 
  8.         timer.setOnScheduleListener(new HeartbeatTimer.OnScheduleListener() { 
  9.             @Override 
  10.             public void onSchedule() { 
  11.                 Log.d(TAG, "timer is onSchedule..."); 
  12.                 long duration = System.currentTimeMillis() - lastReceiveTime; 
  13.                 Log.d(TAG, "duration:" + duration); 
  14.                 if (duration > TIME_OUT) {//若超過(guò)兩分鐘都沒收到我的心跳包,則認(rèn)為對(duì)方不在線。 
  15.                     Log.d(TAG, "超時(shí),對(duì)方已經(jīng)下線"); 
  16.                     // 刷新時(shí)間,重新進(jìn)入下一個(gè)心跳周期 
  17.                     lastReceiveTime = System.currentTimeMillis(); 
  18.                 } else if (duration > HEARTBEAT_MESSAGE_DURATION) {//若超過(guò)十秒他沒收到我的心跳包,則重新發(fā)一個(gè)。 
  19.                     String string = "hello,this is a heartbeat message"
  20.                     sendMessage(string); 
  21.                 } 
  22.             } 
  23.         }); 
  24.         timer.startTimer(0, 1000 * 10); 
  25.     } 

這段心跳的目的就是每隔十秒通過(guò) sendMessage 發(fā)送一個(gè)消息,看看對(duì)方能不能收到。若對(duì)方收到消息,則刷新下 lastReceiveTime 的時(shí)間。

這里我每隔十秒向?qū)Ψ桨l(fā)送了一個(gè)字符串。

 

  1. private static final String BROADCAST_IP = "192.168.43.255"
  2.     /** 
  3.      * 發(fā)送心跳包 
  4.      * 
  5.      * @param message 
  6.      */ 
  7.     public void sendMessage(final String message) { 
  8.         mThreadPool.execute(new Runnable() { 
  9.             @Override 
  10.             public void run() { 
  11.                 try { 
  12.                     InetAddress targetAddress = InetAddress.getByName(BROADCAST_IP); 
  13.                     DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), targetAddress, CLIENT_PORT); 
  14.                     client.send(packet); 
  15.                     Log.d(TAG, "數(shù)據(jù)發(fā)送成功"); 
  16.                 } catch (UnknownHostException e) { 
  17.                     e.printStackTrace(); 
  18.                 } catch (IOException e) { 
  19.                     e.printStackTrace(); 
  20.                 } 
  21.             } 
  22.         }); 
  23.     } 

這里就是發(fā)送一個(gè)消息的代碼。最初在填寫 DatagramPacket 的參數(shù)之時(shí),我有一個(gè)疑問(wèn),那個(gè) targetAddress 其實(shí)是自己的 ip 地址。問(wèn)題來(lái)了,我填寫了自己的 ip 地址和對(duì)方的端口,怎么可能找得到對(duì)方呢?你可能有一個(gè)疑惑 "192.168.43.255" 這個(gè)自己的 ip 地址是怎么來(lái)的,為什么要這么定義?

首先 android 手機(jī)開啟熱點(diǎn),可以理解成一個(gè)網(wǎng)關(guān),有一個(gè)默認(rèn)的 ip 地址:"192.168.43.1"

這個(gè) ip 地址不是我瞎編的一個(gè),在 Android 源碼之中,就是這么定義的:

WifiStateMachine

 

  1. ifcg = mNwService.getInterfaceConfig(intf); 
  2.                         if (ifcg != null) { 
  3.                             /* IP/netmask: 192.168.43.1/255.255.255.0 */ 
  4.                             ifcg.setLinkAddress(new LinkAddress( 
  5.                                     NetworkUtils.numericToInetAddress("192.168.43.1"), 24)); 
  6.                             ifcg.setInterfaceUp(); 
  7.                             mNwService.setInterfaceConfig(intf, ifcg); 
  8.                         } 

所以我是知道所謂打開熱點(diǎn)一方的 ip 地址,而 UDP 發(fā)送消息時(shí)還有一個(gè)特性,就是發(fā)出去的消息,處在整個(gè)網(wǎng)關(guān)的設(shè)備是都可以接收到的,所以我自己的 ip 地址就定為了 "192.168.43.255",所以這個(gè) ip 地址和 "192.168.43.1" 在同一網(wǎng)關(guān)中,你發(fā)送的消息,它是可以收到的。

至于怎么判斷兩個(gè) ip 地址是否處在同一網(wǎng)段中:

判斷兩個(gè)IP大小及是否在同一個(gè)網(wǎng)段中

來(lái)做一個(gè)階段總結(jié):

首先我們創(chuàng)建了一個(gè)發(fā)送端 DatagramSocket,啟動(dòng)了一個(gè)心跳程序,每間隔一段時(shí)間發(fā)送一個(gè)心跳包。

因?yàn)槲抑罒狳c(diǎn)方的 ip 地址是默認(rèn)的 "192.168.43.1",并且 UDP 的特性就是發(fā)送的消息同一網(wǎng)段的設(shè)備都可以收到。所以發(fā)送方的 ip 地址定為了與熱點(diǎn)一方處在同一網(wǎng)段的 "192.168.43.255"。

事件與數(shù)據(jù)

事件與數(shù)據(jù)這兩個(gè)模塊與業(yè)務(wù)就緊密相關(guān)了。

先來(lái)說(shuō)數(shù)據(jù),雙方發(fā)送的數(shù)據(jù)格式你們可以隨意定義,當(dāng)然我覺得還是定義成常規(guī)的 Json 格式就好。其中可以包含一些關(guān)鍵的事件字段:比如廣播心跳包、收到心跳包給對(duì)方上線的應(yīng)答包、超時(shí)的下線包、以及各種業(yè)務(wù)相關(guān)的數(shù)據(jù)等等。

當(dāng)然發(fā)送數(shù)據(jù)時(shí)是轉(zhuǎn)換成二進(jìn)制數(shù)組發(fā)送的。發(fā)送中文字符、圖片等都沒有問(wèn)題,但是可能有一些細(xì)節(jié)需要注意,隨時(shí) google 一下就好了。

再來(lái)說(shuō)下事件:

與業(yè)務(wù)無(wú)關(guān)的事件有哪些?

比如:

  • DatagramSocket.send 方法之后就是發(fā)送數(shù)據(jù)成功的事件;
  • DatagramSocket.receive 方法之后是數(shù)據(jù)接收成功的事件;
  • 在心跳包發(fā)送一段時(shí)間,仍沒有接到回信時(shí),是連接超時(shí)的事件;
  • 與業(yè)務(wù)相關(guān)的事件就和我們上文提到的數(shù)據(jù)類型有關(guān)了,設(shè)備上線,心跳包回應(yīng)等等。

事件又如何發(fā)送出去,通知到各個(gè)頁(yè)面呢?用 Listener、或者其他事件總線的三方庫(kù)都沒問(wèn)題,看你自己選擇了。

處理接收的消息

 

  1. /** 
  2.     * 處理接受到的消息 
  3.     */ 
  4.    private void receiveMessage() { 
  5.        while (isThreadRunning) { 
  6.            try { 
  7.                if (client != null) { 
  8.                    client.receive(receivePacket); 
  9.                } 
  10.                lastReceiveTime = System.currentTimeMillis(); 
  11.                Log.d(TAG, "receive packet success..."); 
  12.            } catch (IOException e) { 
  13.                Log.e(TAG, "UDP數(shù)據(jù)包接收失敗!線程停止"); 
  14.                stopUDPSocket(); 
  15.                e.printStackTrace(); 
  16.                return
  17.            } 
  18.            if (receivePacket == null || receivePacket.getLength() == 0) { 
  19.                Log.e(TAG, "無(wú)法接收UDP數(shù)據(jù)或者接收到的UDP數(shù)據(jù)為空"); 
  20.                continue
  21.            } 
  22.            String strReceive = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
  23.            Log.d(TAG, strReceive + " from " + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort()); 
  24.            //解析接收到的 json 信息 
  25.            // 每次接收完UDP數(shù)據(jù)后,重置長(zhǎng)度。否則可能會(huì)導(dǎo)致下次收到數(shù)據(jù)包被截?cái)唷?nbsp;
  26.            if (receivePacket != null) { 
  27.                receivePacket.setLength(BUFFER_LENGTH); 
  28.            } 
  29.        } 
  30.    } 

處理接收消息時(shí),有幾個(gè)值得注意的點(diǎn):

  • receive 方法是阻塞的,沒收到數(shù)據(jù)包時(shí)會(huì)一直阻塞,所以要放到子線程中;
  • 每次接收到消息之后,重新調(diào)用 receivePacket.setLength;
  • 收到消息刷新lastReceiveTime的值,暫停心跳包的發(fā)送;
  • 處理收到的數(shù)據(jù)具體在業(yè)務(wù)上就是剛才我們談的發(fā)送數(shù)據(jù)的問(wèn)題,視業(yè)務(wù)而定。

“用戶”的概念

上文已經(jīng)談過(guò)了 UDP 的特性,假如一個(gè)手機(jī)已經(jīng)開啟了熱點(diǎn),若多個(gè)手機(jī)與他相連接,則多個(gè)手機(jī)發(fā)送的消息它都可以收到。如果發(fā)送方的端口與接收方的端口相同的話,甚至自己發(fā)的消息,自己都可以收到。這就很尷尬了,也就是說(shuō)我們既要剔除自己發(fā)給自己的消息,也得區(qū)分不同手機(jī)發(fā)來(lái)的消息,這個(gè)時(shí)候就理應(yīng)有一個(gè)“用戶”的概念。

創(chuàng)建 User 對(duì)象,有哪些屬性可以看自己的業(yè)務(wù),本文的例子就有 ip、imei、以及 softversion。

 

  1. /** 
  2.     * 創(chuàng)建本地用戶信息 
  3.     */ 
  4.    private void createUser() { 
  5.        if (localUser == null) { 
  6.            localUser = new Users(); 
  7.        } 
  8.        if (remoteUser == null) { 
  9.            remoteUser = new Users(); 
  10.        } 
  11.        localUser.setImei(DeviceUtil.getDeviceId(mContext)); 
  12.        localUser.setSoftVersion(DeviceUtil.getPackageVersionCode(mContext)); 
  13.        if (WifiUtil.getInstance(mContext).isWifiApEnabled()) {// 判斷當(dāng)前是否是開啟熱點(diǎn)方 
  14.            localUser.setIp("192.168.43.1"); 
  15.        } else {// 當(dāng)前是開啟 wifi 方 
  16.            localUser.setIp(WifiUtil.getInstance(mContext).getLocalIPAddress()); 
  17.            remoteUser.setIp(WifiUtil.getInstance(mContext).getServerIPAddress()); 
  18.        } 
  19.    } 
  20.    /** 
  21.     * <p><b>IMEI.</b></p> Returns the unique device ID, for example, the IMEI for GSM and the MEID 
  22.     * or ESN for CDMA phones. Return null if device ID is not available. 
  23.     * <p> 
  24.     * Requires Permission: READ_PHONE_STATE 
  25.     * 
  26.     * @param context 
  27.     * @return 
  28.     */ 
  29.    public synchronized static String getDeviceId(Context context) { 
  30.        if (context == null) { 
  31.            return ""
  32.        } 
  33.        String imei = ""
  34.        try { 
  35.            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
  36.            if (tm == null || TextUtils.isEmpty(tm.getDeviceId())) { 
  37.                // 雙卡雙待需要通過(guò)phone1和phone2獲取imei,默認(rèn)取phone1的imei。 
  38.                tm = (TelephonyManager) context.getSystemService("phone1"); 
  39.            } 
  40.            if (tm != null) { 
  41.                imei = tm.getDeviceId(); 
  42.            } 
  43.        } catch (SecurityException e) { 
  44.            e.printStackTrace(); 
  45.        } 
  46.        return imei; 
  47.    }</p> 

這里就不將所有的代碼展開來(lái)看了。如果有了手機(jī)的 imei 號(hào),那很容易就可以來(lái)做身份的區(qū)分,你既可以區(qū)分不同的發(fā)送方,也可以剔除掉自己發(fā)給自己的消息。當(dāng)然如果需要更多的信息,可以按照自己的業(yè)務(wù)區(qū)分,將這些信息作為發(fā)送的 messge,通過(guò) Socket 發(fā)送。

寫在后面:

到現(xiàn)在開始本文的大部分內(nèi)容都已經(jīng)介紹完成,有的同學(xué)可能會(huì)發(fā)問(wèn),你要用一個(gè)心跳來(lái)維持一個(gè)假的“長(zhǎng)連接”,使用起來(lái)比較麻煩,而且還可能忍受 UDP 造成的丟包的痛苦,為什么不選擇 TCP 呢?問(wèn)得好,其實(shí)這個(gè)版本是當(dāng)時(shí)做的***個(gè)版本,之后就使用 TCP+UDP 的方式來(lái)完成這個(gè)模塊了,下一篇文章再來(lái)看看加上 TCP 的改進(jìn)版吧。

責(zé)任編輯:未麗燕 來(lái)源: MeloDev
相關(guān)推薦

2017-03-21 15:20:11

數(shù)據(jù)團(tuán)隊(duì)模式思路

2015-09-16 09:09:46

設(shè)計(jì)WindowsLinux

2015-12-01 10:54:49

安全產(chǎn)品采購(gòu)供應(yīng)商選擇信息安全官

2017-04-24 13:51:16

設(shè)計(jì)師分析

2020-04-24 10:02:44

組件Vue組件庫(kù)

2011-12-15 18:38:57

2023-07-10 18:30:48

2020-03-19 15:21:57

智慧城市藝術(shù)社會(huì)

2023-03-02 08:37:15

2016-03-07 10:18:26

程序員使命感

2016-03-08 09:41:50

程序員大神成長(zhǎng)

2014-07-28 10:22:05

5G5G網(wǎng)絡(luò)無(wú)線網(wǎng)絡(luò)

2021-01-15 23:28:50

區(qū)塊鏈開發(fā)數(shù)字化

2012-12-27 14:54:48

簡(jiǎn)歷求職者

2021-07-07 10:01:13

編程語(yǔ)言計(jì)算機(jī)斯坦福大學(xué)

2022-12-01 16:56:03

智慧城市安全環(huán)境能源

2017-09-04 16:43:08

Linux云原生環(huán)境開源

2018-08-23 17:38:01

多云混合云云平臺(tái)

2012-05-17 14:04:22

統(tǒng)一通信UC

2023-10-13 08:51:11

IT員工iPod
點(diǎn)贊
收藏

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

成人毛片在线精品国产| 中日韩一级黄色片| 日韩一区二区三区免费| 国产精品私人影院| 91麻豆国产语对白在线观看| 欧美精品一区二区蜜桃| 欧美人妖视频| 欧美私模裸体表演在线观看| 日本女人高潮视频| 五月婷在线视频| 蜜桃av噜噜一区| 欧美猛男性生活免费| jlzzjizz在线播放观看| 日韩五码电影| 亚洲影院久久精品| 欧美日韩一区二区视频在线观看| 亚洲在线免费观看视频| 亚洲黄色成人| 日韩中文字幕在线观看| 狠狠人妻久久久久久综合蜜桃| 97成人超碰| 亚洲大片一区二区三区| 亚洲欧美电影在线观看| 色网站在线免费观看| 久久99精品国产91久久来源| 97视频在线观看免费高清完整版在线观看| 免费看的黄色网| 国产精品超碰| 日韩视频一区二区三区 | 精品久久久久一区二区三区| 国产乱码精品一品二品| 国产精品亚洲欧美导航| 国产又大又黄视频| 伊人激情综合| 欧美成人精品h版在线观看| av电影网站在线观看| 久久亚州av| 欧美变态tickle挠乳网站| 天天视频天天爽| 日韩欧美看国产| 亚洲18色成人| 日韩成人三级视频| 在线观看三级视频| 亚洲婷婷在线视频| 一区二区三区四区不卡| 91在线导航| 国产喂奶挤奶一区二区三区| 蜜桃av噜噜一区二区三| 婷婷五月综合激情| va亚洲va日韩不卡在线观看| 痴汉一区二区三区| www.麻豆av| 国产福利91精品| 97视频资源在线观看| 99久久一区二区| 狠狠网亚洲精品| 国产日韩欧美另类| 国产一区二区三区四区视频| 麻豆传媒一区二区三区| 国产日产欧美精品| 11024精品一区二区三区日韩| 日本不卡视频一二三区| 国产玖玖精品视频| 国产精品久久久久毛片| 韩国理伦片一区二区三区在线播放| 国产狼人综合免费视频| 中文字幕观看视频| 韩国视频一区二区| 懂色av一区二区三区在线播放| 亚洲精品久久久久久久久久久久久久| 国产高清精品久久久久| 国产一区二区精品免费| 欧美在线观看在线观看| 国产欧美一区视频| 亚洲最大色综合成人av| 在线视频国产区| 亚洲成人一区二区在线观看| 日本在线xxx| 欧美日韩电影免费看| 精品视频一区三区九区| 久久6免费视频| 8x国产一区二区三区精品推荐| 亚洲精品v天堂中文字幕| 蜜桃传媒一区二区亚洲av| 九九免费精品视频在线观看| 日韩中文字幕久久| 九九热国产视频| 天堂在线亚洲视频| 91香蕉亚洲精品| 草草视频在线播放| 久久亚洲影视婷婷| 黄色a级在线观看| 国产精品25p| 欧美手机在线视频| 亚洲国产精品第一页| 美女久久99| 久久躁狠狠躁夜夜爽| 精品成人av一区二区在线播放| 日本成人在线电影网| 91在线免费看片| 国产一区精品| 亚洲国产精品尤物yw在线观看| 成年人小视频网站| 综合视频一区| 一区二区三区国产视频| 久久综合色综合| 丝袜美腿亚洲一区| 国产区一区二区三区| 三级外国片在线观看视频| 一区二区在线免费观看| 久久精品香蕉视频| 91精品国产乱码久久久竹菊| 一本色道久久88综合日韩精品| 久久久久无码精品国产| 奇米亚洲午夜久久精品| 久久草.com| 手机在线免费观看av| 色94色欧美sute亚洲13| 国产精品99精品无码视亚| 成人在线视频免费观看| 91成人在线播放| 国产夫妻自拍av| 国产精品久久久久久妇女6080| 99999精品视频| 免费一级欧美片在线观看网站| 亚洲性夜色噜噜噜7777| 日韩美女一级片| 国产精一区二区三区| 五月婷婷一区| 都市激情亚洲综合| 日韩精品久久久久久久玫瑰园| 午夜免费激情视频| 麻豆91精品91久久久的内涵| 欧美一进一出视频| 女人高潮被爽到呻吟在线观看| 日韩欧美在线综合网| 国产在线免费看| 免费欧美在线视频| 秋霞毛片久久久久久久久| 九色porny自拍视频在线播放| 欧美不卡一区二区三区| 欧美做爰啪啪xxxⅹ性| 麻豆成人av在线| 亚洲成人午夜在线| 在线日本欧美| 一本色道久久综合狠狠躁篇怎么玩| 久久久久久久久久久影院| 99re视频精品| 成人中文字幕在线播放| 日韩黄色网络| 日韩美女在线看| 黄色在线免费观看大全| 在线精品国精品国产尤物884a| 国产福利短视频| 欧美亚洲三级| 日韩精品欧美专区| 免费成人高清在线视频| 日韩三级影视基地| 国产精品女同一区二区| 亚洲猫色日本管| 国产在线观看免费播放| 亚洲电影av| 久久精品国产99精品国产亚洲性色| 日韩脚交footjobhd| 亚洲精选在线观看| 做爰无遮挡三级| 国产精品久久久久影院色老大| 国产成年人视频网站| 久久精品影视| 国外成人免费视频| 性欧美18一19sex性欧美| 伊人伊成久久人综合网小说| 亚洲视频在线观看一区二区 | 国产极品国产极品| 粉嫩一区二区三区在线看| 国产婷婷一区二区三区| 国产成人一区二区三区影院| 国产欧美va欧美va香蕉在| 成人直播在线| 亚洲国产精彩中文乱码av| 视频一区二区三区四区五区| 欧美韩日一区二区三区四区| 一级黄色免费毛片| 日韩一区二区久久| 日韩精品欧美专区| 日本精品视频| 日韩免费观看网站| av黄色在线| 日韩精品在线影院| 97成人免费视频| 午夜日韩在线观看| 欧美一区二区三区粗大| 国产成人鲁色资源国产91色综| 国产黄页在线观看| 午夜欧美在线| 欧美日韩另类综合| 亚洲精品国产九九九| 国产精国产精品| 午夜影院免费在线| 亚洲性夜色噜噜噜7777| 亚洲精品福利网站| 精品视频一区二区不卡| 日韩欧美亚洲一区二区三区| 亚洲欧美在线视频观看| 手机在线看片日韩| 国产乱码一区二区三区| 日本www高清视频| 国产精品红桃| 亚洲综合第一| 九九热线有精品视频99| 国产欧美日韩综合一区在线观看| 久久久久久久性潮| 日本一区二区三区在线播放| 羞羞的视频在线观看| 国产亚洲欧美视频| 色一情一乱一乱一区91av| 欧美电影一区二区| 麻豆精品久久久久久久99蜜桃| 一区二区三区成人| 永久免费毛片在线观看| 972aa.com艺术欧美| 91丨porny丨九色| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美 日韩 国产在线观看| 欧美久久一级| 手机福利在线视频| 成人在线亚洲| 日本一区高清在线视频| 日韩美女毛片| 国产一区二区高清不卡| 99久久香蕉| 114国产精品久久免费观看| 男女啪啪999亚洲精品| 国产福利精品av综合导导航| 性欧美18xxxhd| 91成人天堂久久成人| 不卡的av影片| 久久久亚洲精品视频| 中文字幕中文字幕在线十八区 | 欧美极品jizzhd欧美18| 久久综合久久鬼色中文字| 日韩精品视频一区二区| 国产成a人亚洲精品| 污污视频在线免费| 国产米奇在线777精品观看| 中文字幕国产高清| 狠狠网亚洲精品| av在线免费观看不卡| 国产综合色精品一区二区三区| 色播五月激情五月| 精品一区二区三区香蕉蜜桃| 久热精品在线观看视频| 麻豆精品视频在线观看免费 | 丁香婷婷深情五月亚洲| 一区二区三区四区影院| av在线一区二区| 亚洲最大成人网站| 欧美激情在线一区二区| 91久久久久久久久久久久久久 | 老汉色影院首页| 亚洲蜜桃视频| 欧美在线观看黄| 亚洲欧洲午夜| 国产成人亚洲精品无码h在线| 久久精品成人| 国产精品入口免费软件| 免费成人小视频| 亚洲精品乱码久久久久久动漫| 国产一区二区在线免费观看| 国产人妻精品午夜福利免费| 99视频精品在线| x88av在线| 亚洲人123区| 日韩欧美一级视频| 欧美日韩精品一区二区三区四区 | 久久国产精品波多野结衣| 亚洲成人免费观看| 中文字幕在线观看视频免费| 欧美美女喷水视频| 亚洲精品视频91| 亚洲欧美综合v| www视频在线看| 91国语精品自产拍在线观看性色| 肉色欧美久久久久久久免费看| 国产视频999| 国产精品白丝av嫩草影院| 日本午夜精品一区二区三区| 亚洲电影在线一区二区三区| 久草视频这里只有精品| 国产精品视频久久一区| 亚洲美女性囗交| 99久久777色| 国产精品麻豆免费版现看视频| 亚洲国产日韩av| 国产又粗又猛又黄视频| 日韩视频一区二区三区 | 久久精品视频在线免费观看| 色老板免费视频| 色综合久久中文综合久久牛| 99国产精品99| 亚洲图片在区色| 性网站在线观看| 国产精品美女免费视频| 老司机aⅴ在线精品导航| 综合视频在线观看| 久久久亚洲人| 怡红院一区二区| 日韩美女久久久| 国产视频1区2区| 精品国产乱码久久| 毛片免费不卡| 天堂av.com| 国产欧美日韩在线一区二区 | 天天做天天爱天天爽综合网| 毛片在线视频播放| 国产精品99久久久久久久女警| 在线免费看黄视频| 亚洲成人精品一区二区| 亚洲在线视频播放| 国产香蕉一区二区三区在线视频| 国产精品偷拍| 91久久久久久久| 成人av二区| 一本久道综合色婷婷五月| 成人免费高清视频| 欧美成人精品欧美一级| 欧美日本一区二区在线观看| 九九九伊在人线综合| 91国语精品自产拍在线观看性色| 日韩影片在线观看| 亚洲美女自拍偷拍| 久久综合综合久久综合| 天天操天天干天天操天天干| 黑人与娇小精品av专区| 日本加勒比一区| 欧美激情一级二级| 日韩免费高清视频网站| 日本丰满大乳奶| 久久99精品一区二区三区| 亚洲天堂av中文字幕| 欧美在线视频全部完| 国产裸舞福利在线视频合集| 日韩av电影在线网| 蜜臀av免费一区二区三区| 免费高清在线观看免费| 2020国产精品自拍| 久久国产黄色片| 色综合久久一区二区三区| 国产九区一区在线| 精品成人久久| 国产精品无码一区二区三| 亚洲成人av在线电影| 日本精品一二区| 992tv在线成人免费观看| 欧美调教在线| 日日碰狠狠躁久久躁婷婷| 久久久一区二区| 羞羞色院91蜜桃| 少妇高潮久久77777| 成人国产精品入口免费视频| 亚洲欧美日韩不卡一区二区三区| 麻豆国产精品777777在线| 成人高潮免费视频| 日韩美女天天操| 超碰高清在线| 欧美一区二视频在线免费观看| 喷水一区二区三区| 国产稀缺精品盗摄盗拍| 精品三级在线看| 黄视频网站在线观看| 日本一区二区三区免费看| 日韩国产一区二| 婷婷丁香综合网| 日韩精品一区二区三区四区视频| 交100部在线观看| 色综合666| 国产高清亚洲一区| 日本中文字幕在线| 精品国产一区二区三区四区在线观看| 国内不卡的一区二区三区中文字幕 | 中文字幕一区二区三区人妻四季| 久久伊人精品天天| 欧美日日夜夜| 欧美在线aaa| 亚洲男女一区二区三区| 欧美 日韩 国产 成人 在线 91| 国产成人精品av| 欧美激情aⅴ一区二区三区| 久久精品一区二区免费播放| 欧美色电影在线| 丁香花电影在线观看完整版| 日韩av高清在线播放| 国产精品一区二区黑丝 | 欧美人与禽zozo性伦| 免费电影网站在线视频观看福利| 免费观看国产成人| 国产一区二区视频在线| 波多野结衣视频网站| 久久久精品国产亚洲| 日韩精选在线|