亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

遠(yuǎn)程控制順暢無阻礙-java來實現(xiàn)

2024-07-21 02:04:31
字體:
供稿:網(wǎng)友
 

我平時比較喜歡從網(wǎng)上聽歌,有些鏈接下載速度太慢了。如果用httpurlconnection類的方法打開連接,然后用inputstream類獲得輸入流,再用bufferedinputstream構(gòu)造出帶緩沖區(qū)的輸入流,如果網(wǎng)速太慢的話,無論緩沖區(qū)設(shè)置多大,聽起來都是斷斷續(xù)續(xù)的,達(dá)不到真正緩沖的目的。于是嘗試編寫代碼實現(xiàn)用緩沖方式讀取遠(yuǎn)程文件,以下貼出的代碼是我寫的mp3解碼器的一部分。我是不怎么贊同使用多線程下載的,加之有的鏈接下載速度本身就比較快,所以在下載速度足夠的情況下,就讓下載線程退出,直到只剩下一個下載線程。當(dāng)然,多線程中令人頭痛的死鎖問題、httpurlconnection的超時阻塞問題都會使代碼看起來異常復(fù)雜。

 

簡要介紹一下實現(xiàn)多線程環(huán)形緩沖的方法。將緩沖區(qū)buf[]分為16塊,每塊32k,下載線程負(fù)責(zé)向緩沖區(qū)寫數(shù)據(jù),每次寫一塊;讀線程(buffrandacceurl類)每次讀小于32k的任意字節(jié)。同步描述:寫/寫互斥等待空閑塊;寫/寫并發(fā)填寫buf[];讀/寫并發(fā)使用buf[]。

 

經(jīng)過我很長一段時間使用,我認(rèn)為比較滿意地實現(xiàn)了我的目標(biāo),同其它mp3播放器對比,我的這種方法能夠比較流暢、穩(wěn)定地下載并播放。我把實現(xiàn)多線程下載緩沖的方法寫出來,不足之處懇請批評指正。

 

一、httpreader類功能:http協(xié)議從指定url讀取數(shù)據(jù)

 

/** *//*** author by http://www.bt285.cn http://www.5a520.cn*/package instream;     import java.io.ioexception;   import java.io.inputstream;   import java.net.httpurlconnection;   import java.net.url;     public final class httpreader {       public static final int max_retry = 10;       private static long content_length;       private url url;       private httpurlconnection httpconnection;       private inputstream in_stream;       private long cur_pos;           //用于決定seek方法中是否執(zhí)行文件定位       private int connect_timeout;       private int read_timeout;              public httpreader(url u) {           this(u, 5000, 5000);       }              public httpreader(url u, int connect_timeout, int read_timeout) {           this.connect_timeout = connect_timeout;           this.read_timeout = read_timeout;           url = u;           if (content_length == 0) {               int retry = 0;               while (retry < httpreader.max_retry)                   try {                       this.seek(0);                       content_length = httpconnection.getcontentlength();                       break;                   } catch (exception e) {                       retry++;                   }           }       }              public static long getcontentlength() {           return content_length;       }              public int read(byte[] b, int off, int len) throws ioexception {           int r = in_stream.read(b, off, len);           cur_pos += r;           return r;       }              public int getdata(byte[] b, int off, int len) throws ioexception {           int r, rema = len;           while (rema > 0) {               if ((r = in_stream.read(b, off, rema)) == -1) {                   return -1;               }               rema -= r;               off += r;               cur_pos += r;           }           return len;       }              public void close() {           if (httpconnection != null) {               httpconnection.disconnect();               httpconnection = null;           }           if (in_stream != null) {               try {                   in_stream.close();               } catch (ioexception e) {}               in_stream = null;           }           url = null;       }              /**//*       * 拋出異常通知再試       * 響應(yīng)碼503可能是由某種暫時的原因引起的,例如同一ip頻繁的連接請求可能遭服務(wù)器拒絕       */      public void seek(long start_pos) throws ioexception {           if (start_pos == cur_pos && in_stream != null)               return;           if (httpconnection != null) {               httpconnection.disconnect();               httpconnection = null;           }           if (in_stream != null) {               in_stream.close();               in_stream = null;           }           httpconnection = (httpurlconnection) url.openconnection();           httpconnection.setconnecttimeout(connect_timeout);           httpconnection.setreadtimeout(read_timeout);           string sproperty = "bytes=" + start_pos + "-";           httpconnection.setrequestproperty("range", sproperty);           //httpconnection.setrequestproperty("connection", "keep-alive");           int responsecode = httpconnection.getresponsecode();           if (responsecode < 200 || responsecode >= 300) {               try {                   thread.sleep(500);               } catch (interruptedexception e) {                   e.printstacktrace();               }               throw new ioexception("http responsecode="+responsecode);           }             in_stream = httpconnection.getinputstream();           cur_pos = start_pos;       }     }

 

二、iwritercallback接口功能:實現(xiàn)讀/寫通信。

 

package instream;     public interface iwritercallback {       public boolean trywriting(writer w) throws interruptedexception;       public void updatebuffer(int i, int len);       public void updatewritercount();       public void terminatewriters();   }

|||

 

三、writer類:下載線程,負(fù)責(zé)向buf[]寫數(shù)據(jù)。

 

/** *//*** http://www.bt285.cn http://www.5a520.cn */package instream;   import java.io.ioexception;   import java.net.url;     public final class writer implements runnable {       private static boolean isalive = true;       private byte[] buf;       private iwritercallback icb;       protected int index;            //buf[]內(nèi)"塊"索引號       protected long start_pos;       //index對應(yīng)的文件位置(相對于文件首的偏移量)       protected int await_count;      //用于判斷:下載速度足夠就退出一個"寫"線程       private httpreader hr;              public writer(iwritercallback call_back, url u, byte[] b, int i) {           hr = new httpreader(u);           if(httpreader.getcontentlength() == 0)  //實例化httpreader對象都不成功               return;           icb = call_back;           buf = b;           thread t = new thread(this,"dt_"+i);           t.setpriority(thread.norm_priority + 1);           t.start();       }              public void run() {           int write_bytes=0, write_pos=0, rema = 0, retry = 0;           boolean cont = true;           while (cont) {               try {                   // 1.等待空閑塊                   if(retry == 0) {                       if (icb.trywriting(this) == false)                           break;                       write_bytes = 0;                       rema = buffrandacceurl.unit_length;                       write_pos = index << buffrandacceurl.unit_length_bits;                   }                                      // 2.定位                   hr.seek(start_pos);                     // 3.下載"一塊"                   int w;                   while (rema > 0 && isalive) {                       w = (rema < 2048) ? rema : 2048; //每次讀幾k合適?                       if ((w = hr.read(buf, write_pos, w)) == -1) {                           cont = false;                           break;                       }                       rema -= w;                       write_pos += w;                       start_pos += w;                       write_bytes += w;                   }                                      //4.通知"讀"線程                   retry = 0;                   icb.updatebuffer(index, write_bytes);               } catch (interruptedexception e) {                   isalive = false;                   icb.terminatewriters();                   break;               } catch (ioexception e) {                   if(++retry == httpreader.max_retry) {                       isalive = false;                       icb.terminatewriters();                       break;                   }               }           }           icb.updatewritercount();           try {               hr.close();           } catch (exception e) {}           hr = null;           buf = null;           icb = null;       }     }

 

四、irandomaccess接口:

 

隨機(jī)讀取文件接口,buffrandacceurl類和buffrandaccefile類實現(xiàn)接口方法。buffrandaccefile類實現(xiàn)讀取本地磁盤文件,這兒就不給出其源碼了。

 

package instream;     public interface irandomaccess {       public int read() throws exception;       public int read(byte b[]) throws exception;       public int read(byte b[], int off, int len) throws exception;       public int dump(int src_off, byte b[], int dst_off, int len) throws exception;       public void seek(long pos) throws exception;       public long length();       public long getfilepointer();       public void close();   }

 

五、buffrandacceurl類功能:創(chuàng)建下載線程;read方法從buf[]讀數(shù)據(jù)。

 

關(guān)鍵是如何簡單有效防止死鎖?以下只是我的一次嘗試,請指正。

 

/** *//*** http://www.5a520.cn  http://www.bt285.cn*/ package instream;     import java.net.url;   import java.net.urldecoder;   import decode.header;   import tag.mp3tag;   import tag.tagthread;     public final class buffrandacceurl implements irandomaccess, iwritercallback {       public static final int unit_length_bits = 15;                  //32k       public static final int unit_length = 1 << unit_length_bits;       public static final int buf_length = unit_length << 4;            //16塊       public static final int unit_count = buf_length >> unit_length_bits;       public static final int buf_length_mask = (buf_length - 1);       private static final int max_writer = 8;       private static long file_pointer;       private static int read_pos;       private static int fill_bytes;       private static byte[] buf;      //同時也作讀寫同步鎖:buf.wait()/buf.notify()       private static int[] buf_bytes;       private static int buf_index;       private static int alloc_pos;       private static url url = null;       private static boolean isalive = true;       private static int writer_count;       private static int await_count;       private long file_length;       private long frame_bytes;              public buffrandacceurl(string surl) throws exception {           this(surl,max_writer);       }              public buffrandacceurl(string surl, int download_threads) throws exception {           buf = new byte[buf_length];           buf_bytes = new int[unit_count];           url = new url(surl);                      //創(chuàng)建線程以異步方式解析id3           new tagthread(url);                      //打印當(dāng)前文件名           try {               string s = urldecoder.decode(surl, "gbk");               system.out.println("start>> " + s.substring(s.lastindexof("/") + 1));               s = null;           } catch (exception e) {               system.out.println("start>> " + surl);           }                      //創(chuàng)建"寫"線程           for(int i = 0; i < download_threads; i++)               new writer(this, url, buf, i+1);           frame_bytes = file_length = httpreader.getcontentlength();           if(file_length == 0) {               header.strlasterr = "連接url出錯,重試 " + httpreader.max_retry + " 次后放棄。";               throw new exception("retry " + httpreader.max_retry);           }           writer_count = download_threads;                      //緩沖           try_cache();                      //跳過id3 v2           mp3tag mp3tag = new mp3tag();           int v2_size = mp3tag.checkid3v2(buf,0);           if (v2_size > 0) {               frame_bytes -= v2_size;               //seek(v2_size):               fill_bytes -= v2_size;               file_pointer = v2_size;               read_pos = v2_size;               read_pos &= buf_length_mask;               int units = v2_size >> unit_length_bits;               for(int i = 0; i < units; i++) {                   buf_bytes[i] = 0;                   this.notifywriter();               }               buf_bytes[units] -= v2_size;               this.notifywriter();           }           mp3tag = null;       }              private void try_cache() throws interruptedexception {           int cache_size = buf_length;           if(cache_size > (int)file_length - alloc_pos)               cache_size = (int)file_length - alloc_pos;           cache_size -= unit_length;                      //等待填寫當(dāng)前正在讀的那"一塊"緩沖區(qū)           /**//*if(fill_bytes >= cache_size && writer_count > 0) {              synchronized (buf) {                  buf.wait();              }              return;          }*/                     //等待填滿緩沖區(qū)           while (fill_bytes < cache_size) {               if (writer_count == 0 || isalive == false)                   return;               if(buf_length > (int)file_length - alloc_pos)                   cache_size = (int)file_length - alloc_pos - unit_length;               system.out.printf("/r[緩沖%1$6.2f%%] ",(float)fill_bytes / cache_size * 100);               synchronized (buf) {                   buf.wait();               }           }           system.out.printf("/r");       }              private int try_reading(int i, int len) throws exception {           int n = (i == unit_count - 1) ? 0 : (i + 1);           int r = (buf_bytes[i] == 0) ? 0 : (buf_bytes[i] + buf_bytes[n]);           while (r < len) {               if (writer_count == 0 || isalive == false)                   return r;               try_cache();               r = (buf_bytes[i] == 0) ? 0 : (buf_bytes[i] + buf_bytes[n]);           }                      return len;       }              /**//*       * 各個"寫"線程互斥等待空閑塊       */      public synchronized boolean trywriting(writer w) throws interruptedexception {           await_count++;           while (buf_bytes[buf_index] != 0 && isalive) {               this.wait();           }                      //下載速度足夠就結(jié)束一個"寫"線程           if(writer_count > 1 && w.await_count >= await_count &&                   w.await_count >= writer_count)               return false;                      if(alloc_pos >= file_length)               return false;           w.await_count = await_count;           await_count--;           w.start_pos = alloc_pos;           w.index = buf_index;           alloc_pos += unit_length;           buf_index = (buf_index == unit_count - 1) ? 0 : buf_index + 1;           return isalive;       }              public void updatebuffer(int i, int len) {           synchronized (buf) {               buf_bytes[i] = len;               fill_bytes += len;               buf.notify();           }       }              public void updatewritercount() {           synchronized (buf) {               writer_count--;               buf.notify();           }       }              public synchronized void notifywriter() {           this.notifyall();       }              public void terminatewriters() {           synchronized (buf) {               if (isalive) {                   isalive = false;                   header.strlasterr = "讀取文件超時。重試 " + httpreader.max_retry                           + " 次后放棄,請您稍后再試。";               }               buf.notify();           }                      notifywriter();            }              public int read() throws exception {           int iret = -1;           int i = read_pos >> unit_length_bits;           // 1."等待"有1字節(jié)可讀           while (buf_bytes[i] < 1) {               try_cache();               if (writer_count == 0)                   return -1;           }           if(isalive == false)               return -1;             // 2.讀取           iret = buf[read_pos] & 0xff;           fill_bytes--;           file_pointer++;           read_pos++;           read_pos &= buf_length_mask;           if (--buf_bytes[i] == 0)               notifywriter();     // 3.通知             return iret;       }              public int read(byte b[]) throws exception {           return read(b, 0, b.length);       }         public int read(byte[] b, int off, int len) throws exception {           if(len > unit_length)               len = unit_length;           int i = read_pos >> unit_length_bits;                      // 1."等待"有足夠內(nèi)容可讀           if(try_reading(i, len) < len || isalive == false)               return -1;             // 2.讀取           int tail_len = buf_length - read_pos; // write_pos != buf_length           if (tail_len < len) {               system.arraycopy(buf, read_pos, b, off, tail_len);               system.arraycopy(buf, 0, b, off + tail_len, len - tail_len);           } else              system.arraycopy(buf, read_pos, b, off, len);             fill_bytes -= len;           file_pointer += len;           read_pos += len;           read_pos &= buf_length_mask;           buf_bytes[i] -= len;           if (buf_bytes[i] < 0) {               int ni = read_pos >> unit_length_bits;               buf_bytes[ni] += buf_bytes[i];               buf_bytes[i] = 0;               notifywriter();           } else if (buf_bytes[i] == 0)               notifywriter();                      return len;       }              /**//*       * 從src_off位置復(fù)制,不移動文件"指針"       */      public int dump(int src_off, byte b[], int dst_off, int len) throws exception {           int rpos = read_pos + src_off;           if(try_reading(rpos >> unit_length_bits, len) < len || isalive == false)               return -1;           int tail_len = buf_length - rpos;           if (tail_len < len) {               system.arraycopy(buf, rpos, b, dst_off, tail_len);               system.arraycopy(buf, 0, b, dst_off + tail_len, len - tail_len);           } else              system.arraycopy(buf, rpos, b, dst_off, len);           // 不發(fā)信號             return len;       }              public long length() {           return file_length;       }              public long getfilepointer() {           return file_pointer;       }         public void close() {           //       }              //       public void seek(long pos) throws exception {           //       }          }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产999精品久久久久久| 天天舔天天干天天操| 亚洲视频在线观看一区二区| 久久久91精品国产一区不卡| 欧美在线一级片| 狠狠综合久久av一区二区老牛| 极品白浆推特女神在线观看| 欧美极品videos大乳护士| 国模极品一区二区三区| 疯狂做受xxxx高潮欧美日本| 国产成人精品一区二区在线| 亚洲欧洲国产精品一区| 99re6在线精品视频免费播放| 日韩av二区| 狠狠躁夜夜躁人人爽超碰91| 欧美成人一二区| 亚洲综合日韩| 激情视频在线观看一区二区三区| 久久精品道一区二区三区| 精品资源在线看| 精品无码久久久久久久久| 99精品人妻少妇一区二区| 91精品国产黑色瑜伽裤| 色婷婷av国产精品| 人妻中文字幕一区| 97国产精品久久| 欧美性猛交一区二区三区精品| 超清av在线| 国产一区二区三区久久| 99热在线免费播放| 日韩av无码中文字幕| 欧美成人久久电影香蕉| 日本在线人成| 电影一区二区三区久久免费观看| 踪合国产第二页| 欧美性淫爽ww久久久久无| 女同互添互慰av毛片观看| 看免费黄色录像| 日韩一区二区在线| 欧美一卡2卡3卡4卡| 东京热一区二区三区四区| 激情五月综合| 日本在线视频观看| 777琪琪电影午夜理伦片| 醉酒壮男gay强迫野外xx| 国产精品久久久久久久| 亚洲三级观看| 免费成年人视频在线观看| 亚洲xxx拳头交| 男人的天堂在线播放| 欧美色图在线播放| 国产成人在线看| 日本黄色大片在线观看| 欧美成人中文字幕在线| 18成年在线观看| 丝袜+亚洲+另类+欧美+变态| 91精品欧美综合在线观看最新| 不卡的日韩av| 丁香五月网久久综合| 奇米精品一区二区三区四区| 亚洲精品国久久99热| 久久伊人中文字幕| 91九色在线免费视频| 日本三级韩国三级欧美三级| 国产精品1024| 日韩中文字幕一区二区三区| 欧美精品激情在线观看| 久久精品国产欧美亚洲人人爽| 亚洲视频每日更新| 成人性生交大片免费观看网站| 成人福利一区二区| 成人国产一区二区三区精品| 丰满的少妇愉情hd高清果冻传媒| 中文字幕久久熟女蜜桃| 国产中文在线| 一本色道久久综合精品婷婷| 亚洲欧美另类久久久精品2019| 天天看天天干| 理论片在线不卡免费观看| 人人妻人人做人人爽| 亚洲欧美日韩视频一区| 无遮挡又色又刺激的女人视频| 欧美日韩一区二区在线观看| 视频一区在线播放| 免费成人在线观看| 91精品动漫在线观看| 正在播放精油久久| 欧美高清一级大片| 国产日韩精品一区二区三区在线| 精品在线不卡| 男女羞羞视频教学| 日韩在线激情视频| 国产精品一区二区三| 在线播放亚洲激情| 欧美色窝79yyyycom| 日韩av在线高清| 国产成人久久久久| 印度午夜性春猛xxx交| 色久视频在线播放| 亚洲女同女同女同女同女同69| 免费在线国产视频| 久久久久久综合| 熟女熟妇伦久久影院毛片一区二区| 在线尤物九色自拍| 一级肉体全黄裸片| 色哟哟精品视频| 在线免费av网| 五月婷婷丁香色| 1024手机在线视频| 精品噜噜噜噜久久久久久久久试看| 黄色网址三级| 中文字幕欧美人妻精品一区| 欧美国产视频在线观看| 国产精品伦一区二区三区视频| aaaaaaa大片免费看| 永久免费看片视频教学| 午夜精品久久久久久久蜜桃app| 丁香社区五月天| 欧美高清一区| 不卡视频在线观看| 欧美欧美欧美欧美| 欧美5-7sexvideos处| 少妇精品高潮欲妇又嫩中文字幕| 欧美精品18videos性欧美| 在线成人亚洲| hs视频在线观看| 日本aⅴ大伊香蕉精品视频| 北京富婆泄欲对白| 国产欧美一区二区三区米奇| 欧美第一页草草影院浮力| 好吊色欧美一区二区三区四区| 日日骚av一区二区| 日本全棵写真视频在线观看| 久久夜夜操妹子| 91sa在线看| 美女福利精品视频| 成人au免费视频影院| 亚洲视频精品在线| 久久国产小视频| 欧美在线性视频| 日韩成人影音| 欧美黑人xxxⅹ高潮交| 国产精品一在线观看| 一区二区中文字幕在线观看| 久久午夜无码鲁丝片| 亚洲美腿欧美激情另类| 精品免费囯产一区二区三区| 欧美视频免费看欧美视频| 成人在线观看黄色| 青草影视电视剧免费播放在线观看| 国产精品国产自产拍高清av水多| 欧美成人乱码一二三四区免费| 欧美日本一区二区在线观看| 亚洲五月激情网| 青青青草网站免费视频在线观看| 伊人手机在线视频| 午夜在线播放| 欧洲精品一区二区| 日韩免费观看一区二区| 天天干夜夜干| 国产一区在线看| 亚洲视频在线观看三级| 青娱乐一区二区| 夜夜嗨av一区二区三区| 少妇献身老头系列| 国产一区二区三区小说| 99在线免费视频| 国产日韩在线精品av| 另类专区欧美蜜桃臀第一页| 欧美精品一二三四区| 四虎成人免费| 国产精品999.| 国产精品宾馆在线精品酒店| 91视频8mav| 欧美人体大胆444www| 国产午夜精品久久久久免费视| 在线成人av| 天天好比中文综合网| 欧美日本在线视频中文字字幕| 三叶草欧洲码在线| 天天操夜夜操夜夜操| 狠狠操天天操夜夜操| 国产午夜亚洲精品一级在线| 九九精品在线观看视频| 海角社区69精品视频| 国产一级片播放| 四虎在线精品| 91国内产香蕉| 成人p站proumb入口| 亚洲国产日韩一区| 国产视频在线一区二区| 亚洲国产欧美一区二区三区同亚洲| 国产精品亚洲视频在线观看| 亚洲福利在线观看视频| 久久综合久久美利坚合众国| 午夜精品久久久久久久星辰影院| 伊人久久大香线蕉精品组织观看| 免费看的黄网站| 伊人春色之综合网| 国产精品久久久久久久午夜| 日韩av一区二区三区在线观看| 亚洲精品国产精品乱码| 日韩精品网站| 国产69精品久久久久久久久久| 69堂视频在线观看国产| 强制捆绑调教一区二区| 日韩视频免费在线观看| 美女性感视频久久久| 97视频在线观看播放| 国产日韩1区| 97视频免费在线观看| 日韩视频在线观看免费视频| 丰满人妻老熟妇伦人精品| 伊人久久大香线蕉av一区二区| 黄色录像免费观看| 日韩欧美电影一二三| 国产精品久线观看视频| 九九热在线免费| av免费在线一区| 成人在线观看黄| 51午夜精品视频| 色播一区二区| 韩国成人漫画| 国产在线视频一区| 超碰超碰超碰超碰超碰| 一区二区三区 欧美| 99re在线播放| 成人欧美日韩| 瑟瑟视频在线看| 韩国中文字幕hd久久精品| 黄色一级视频片| a美女胸又www黄视频久久| 婷婷综合激情网| 成人免费av片| 99精品网站| 国产亚洲精品久久久久久移动网络| 亚洲高清久久久久久| 国产欧美日韩另类一区| 一本色道久久综合| 亚洲精品护士| 草草影院在线观看| 麻豆成人久久精品二区三区小说| 中文字幕先锋av影音资源网| 在线观看一区| 欧美丰满片xxx777| 高清国产在线观看| 91嫩草国产线观看亚洲一区二区| 国产浮力第一页| 一级毛片免费看| 色资源网在线观看| 韩国精品福利一区二区三区| 黄网在线播放| 亚洲国产精品久久一线不卡| 午夜免费在线| 全程偷拍露脸中年夫妇| 精品久久久久人成| 免费观看成人性生生活片| 导航艳情国产电影| 欧美xxxxx视频| 天天操天天干天天干| 亚洲狼人国产精品| 久久免费视频2| 九色精品免费永久在线| 国产麻豆精品95视频| 日韩电影免费网址| 欧美一级日韩一级| 精品国产精品| 欧美日韩久久精品| 韩国v欧美v亚洲v日本v| 国产精品剧情在线亚洲| 第一次破处视频| 夜色资源站国产www在线视频| 日韩欧美在线视频播放| 国产乱对白刺激视频不卡| 老色鬼久久亚洲一区二区| 欧美电影免费播放| 欧美一级免费视频| 成人片在线播放| 精品国产欧美日韩不卡在线观看| 中文字幕一区二区5566日韩| 91精品导航| 国产精品欧美三级在线观看| 欧美三级在线免费观看| 另类专区欧美蜜桃臀第一页| 日韩和一区二区| 毛片毛片女人毛片毛片| 老司机精品视频一区二区三区| 国产一区二区三区小说| 欧美性高跟鞋xxxxhd| 国产中文字幕精品| 在线中文字幕不卡| 人人精品久久| av中文在线资源库| 国产精品国产三级国产aⅴ中文| 国产乱淫a∨片免费视频| 国产69精品久久久久9999小说| 国产精品久久久久久久久果冻传媒| 欧产日产国产精品98| 1区2区在线观看| 欧美尿孔扩张虐视频| 精品久久久久久久久久久下田| 男女av免费观看| 超碰在线超碰在线| 亚洲精品在线视频播放| 久久亚洲a v| 制服丝袜日韩| 国产精品1024久久| 欲香欲色天天天综合和网| 欧美在线亚洲综合一区| 婷婷丁香久久| 欧美少妇一区二区| 波多野结衣视频一区| 久久精品动漫| 国产精品xvideos88| 91偷拍一区二区三区精品| 先锋欧美三级| caoporn-草棚在线视频最| 污网站在线观看视频| 亚洲av无码一区二区三区人| 国产女同性恋一区二区| 国产国语老龄妇女a片| 亚洲一区二区三区xxx视频| 真人做人试看60分钟免费| 亚洲一区二区三区xxx视频| 潘金莲一级淫片aaaaa| 国产精品麻豆久久| 九九热在线免费观看| 国产福利视频导航|