久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

java Nio使用NioSocket客戶端與服務端交互實現方式

瀏覽:149日期:2022-08-10 14:45:20
NioSocket 客戶端與服務端交互實現

java Nio是jdk1.4新增的io方式—?nio(new IO),這種方式在目前來說算不算new,更合適的解釋應該是non-block IO。

non-block是相對于傳統的io方式來講的。傳統的Io方式是阻塞的,我們拿網絡io來舉例,傳統的io模型如下:

java Nio使用NioSocket客戶端與服務端交互實現方式

服務端主線程負責不斷地server.accept(),如果沒有客戶端請求主線程就會阻塞,當客戶端請求時,主線程會通過線程池創建一個新的線程執行。

簡單解釋就是一個線程負責一個客戶端的socket,當客戶端因網絡等原因傳遞速度慢的時候,服務端對應的客戶端的線程就會等待,很浪費資源。

同時線程過少的話會影響服務的吞吐量,而線程過多的話由于上下文切換等原因會導致效率十分低下,傳統的io方式并不適合如今的網絡流量。

Nio的模型如下:

java Nio使用NioSocket客戶端與服務端交互實現方式

nio相比傳統的io模型,最大的特點是優化了線程的使用。

nio通過selector可以使用一個線程去管理多個socket句柄,說是管理也不太合適,nio是采用的事件驅動模型,selector負責的是監控各個連接句柄的狀態,不是去輪詢每個句柄,而是在數據就緒后,將消息通知給selector,而具體的socket句柄管理則是采用多路復用的模型,交由操作系統來完成。

selector充當的是一個消息的監聽者,負責監聽channel在其注冊的事件,這樣就可以通過一個線程完成了大量連接的管理,當注冊的事件發生后,再調用相應線程進行處理。

這樣就不需要為每個連接都使用一個線程去維持長連接,減少了長連接的開銷,同時減少了上下文的切換提高了系統的吞吐量。

java Nio的組成

java Nio主要由三個核心部分組成:

- Buffer - Channel - Selector

所有的io的Nio都是從一個channel開始的,Channel有點類似于流,但是和流不同的是,channel是可以雙向讀寫的。Channel有幾種類型,主要包含文件io操作和網絡io:

- FileChannel (文件io) - DatagramChannel (udp數據報) - SocketChannel (tcp客戶端) - ServerSocketChannel (tcp服務端)

Buffer是一個中間緩存區,數據可以從channel讀取到buffer,也可以從buffer寫到channel中,在java中,傳統方式與io的交互,需要將數據從堆內存讀取到直接內存中,然后交由c語言來調用系統服務完成io的交互。

而使用Buffer可以直接在直接內存中開辟內存區域,減少了io復制的操作,從而提高了io操作的效率。

#基本數據類型的buffer - ByteBuffer - CharBuffer - DoubleBuffer - FloatBuffer - IntBuffer - LongBuffer - ShortBuffer#文件內存映射buffer - MappedByteBuffer#直接內存區buffer - DirectBuffer

Selector允許單個線程處理多個channel,可以將多個channel教給selector管理,并注冊相應的事件,而selector則采用事件驅動的方式,當注冊的事件就緒后,調用相應的相應的線程處理該時間,不用使用線程去維持長連接,減少了線程的開銷。

Selector通過靜態工廠的open方法建立,然后通過channel的register注冊到Channel上。

注冊后通過select方法等待請求,select請求有long類型參數,代表等待時間,如果等待時間內接受到操作請求,則返回可以操作請求的數量,否則超時往下走。

傳入參數為零或者無參方法,則會采用阻塞模式知道有相應請求。

收到請求后調用selectedKeys返回SelectionKey的集合。

SelectionKey保存了處理當前請求的Channel和Selector,并且提供了不同的操作類型。

SelectionKey的操作有四種:

- SelectionKey.OP_CONNECT - SelectionKey.OP_ACCEPT - SelectionKey.OP_READ - SelectionKey.OP_WRITE

下面為一個客戶端與服務端實用NioSocket交互的簡單例子:

//對selectionKey事件的處理/** * description: * * @author wkGui */interface ServerHandlerBs { void handleAccept(SelectionKey selectionKey) throws IOException; String handleRead(SelectionKey selectionKey) throws IOException;}/** * description: * * @author wkGui */public class ServerHandlerImpl implements ServerHandlerBs { private int bufferSize = 1024; private String localCharset = 'UTF-8'; public ServerHandlerImpl() { } public ServerHandlerImpl(int bufferSize) {this(bufferSize, null); } public ServerHandlerImpl(String localCharset) {this(-1, localCharset); } public ServerHandlerImpl(int bufferSize, String localCharset) {this.bufferSize = bufferSize > 0 ? bufferSize : this.bufferSize;this.localCharset = localCharset == null ? this.localCharset : localCharset; } @Override public void handleAccept(SelectionKey selectionKey) throws IOException {//獲取channelSocketChannel socketChannel = ((ServerSocketChannel) selectionKey.channel()).accept();//非阻塞socketChannel.configureBlocking(false);//注冊selectorsocketChannel.register(selectionKey.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));System.out.println('建立請求......'); } @Override public String handleRead(SelectionKey selectionKey) throws IOException {SocketChannel socketChannel = (SocketChannel) selectionKey.channel();ByteBuffer buffer = (ByteBuffer) selectionKey.attachment();String receivedStr = '';if (socketChannel.read(buffer) == -1) { //沒讀到內容關閉 socketChannel.shutdownOutput(); socketChannel.shutdownInput(); socketChannel.close(); System.out.println('連接斷開......');} else { //將channel改為讀取狀態 buffer.flip(); //按照編碼讀取數據 receivedStr = Charset.forName(localCharset).newDecoder().decode(buffer).toString(); buffer.clear(); //返回數據給客戶端 buffer = buffer.put(('received string : ' + receivedStr).getBytes(localCharset)); //讀取模式 buffer.flip(); socketChannel.write(buffer); //注冊selector 繼續讀取數據 socketChannel.register(selectionKey.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));}return receivedStr; }}

//服務端server類/** * description: * * @author wkGui */public class NioSocketServer { private volatile byte flag = 1; public void setFlag(byte flag) {this.flag = flag; } public void start() {//創建serverSocketChannel,監聽8888端口try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) { serverSocketChannel.socket().bind(new InetSocketAddress(8888)); //設置為非阻塞模式 serverSocketChannel.configureBlocking(false); //為serverChannel注冊selector Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println('服務端開始工作:'); //創建消息處理器 ServerHandlerBs handler = new ServerHandlerImpl(1024); while (flag == 1) {selector.select();System.out.println('開始處理請求 : ');//獲取selectionKeys并處理Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); try {//連接請求if (key.isAcceptable()) { handler.handleAccept(key);}//讀請求if (key.isReadable()) { System.out.println(handler.handleRead(key));} } catch (IOException e) {e.printStackTrace(); } //處理完后移除當前使用的key keyIterator.remove();}System.out.println('完成請求處理。'); }} catch (IOException e) { e.printStackTrace();} }}//server端啟動類/** * description: * * @author wkGui */public class ServerMain { public static void main(String[] args) {NioSocketServer server = new NioSocketServer();new Thread(() -> { try {Thread.sleep(10*60*1000); } catch (InterruptedException e) {e.printStackTrace(); }finally {server.setFlag((byte) 0); }}).start();server.start(); }}

//客戶端client類/** * description: * * @author wkGui */public class NioSocketClient { public void start() {try (SocketChannel socketChannel = SocketChannel.open()) { //連接服務端socket SocketAddress socketAddress = new InetSocketAddress('localhost', 8888); socketChannel.connect(socketAddress); int sendCount = 0; ByteBuffer buffer = ByteBuffer.allocate(1024); //這里最好使用selector處理 這里只是為了寫的簡單 while (sendCount < 10) {buffer.clear();//向服務端發送消息buffer.put(('current time : ' + System.currentTimeMillis()).getBytes());//讀取模式buffer.flip();socketChannel.write(buffer);buffer.clear();//從服務端讀取消息int readLenth = socketChannel.read(buffer);//讀取模式buffer.flip();byte[] bytes = new byte[readLenth];buffer.get(bytes);System.out.println(new String(bytes, 'UTF-8'));buffer.clear();sendCount++;try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();} }} catch (IOException e) { e.printStackTrace();} }}//client啟動類/** * description: * * @author wkGui */public class ClientMain { public static void main(String[] args) {new NioSocketClient().start(); }}Java NIO 實現 WebSocket 協議WebSocket協議

WebSocket是一種在單個TCP連接上進行全雙工通信的協議。 WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向數據傳輸。

WebSocket協議相比于Http協議來說,最大的特點就是可以實現服務端主動向客戶端發送消息。在WebSocket出現之前,如果客戶端想實時獲取服務端的消息,就需要使用AJAX輪詢,查詢是否有消息,這樣就很消耗服務器資源和帶寬。但是用WebSocket就可以實現服務端主動向客戶端發送數據,并且只需要占用一個TCP連接,節省了資源和帶寬。

java Nio使用NioSocket客戶端與服務端交互實現方式

WebSocket連接建立過程

為了建立一個WebSocket連接,客戶端瀏覽器首先要向服務器發起一個HTTP請求,這個請求和通常的HTTP請求不同,包含了一些附加的頭信息,其中附加頭信息“Upgrade: WebSocket” 表明這是一個申請協議升級的HTTP請求。服務器端解析這些附加的信息頭,然后生成應答消息返回給客戶端,客戶端和服務端的WebSocket連接就建立了。之后就可以使用WebSocket協議的格式來雙向發送消息。

建立連接時發送的HTTP請求頭:

java Nio使用NioSocket客戶端與服務端交互實現方式

返回的HTTP響應頭:

java Nio使用NioSocket客戶端與服務端交互實現方式

在響應頭中的 Sec-WebSocket-Accept 時通過Sec-WebSocket-Key構造出來的。首先在Sec-WebSocket-Key后接上一個258EAFA5-E914-47DA-95CA-C5AB0DC85B11,然后再進行SHA1摘要得到160位數據在,在使用BASE64進行編碼,最后得到的就是Sec-WebSocket-Accept。

WebSocket數據發送過程

WebSocket數據發送的幀格式如下所示:

java Nio使用NioSocket客戶端與服務端交互實現方式

FIN - 1bit

在數據發送的過程中,可能會分片發送,FIN表示是否為最后一個分片。如果發生了分片,則1表示時最后一個分片;不能再分片的情況下,這個標志總是為1。

RSV1 RSV2 RSV3 - 1bit each

用于擴展,不使用擴展時需要為全0;非零時通信雙方必須協商好擴展。這里我們用不上。

OPCODE - 4bits

用于表示所傳送數據的類型,也就是payload中的數據。

數值 含義 0x0 附加數據幀 0x1 文本數據幀 0x2 二進制數據幀 0x3-0x7 保留 0x8 關閉連接幀 0x9 ping幀 0xA pong幀 0xB-0xF 保留

MASK - 1bit

用于表示payload是否被進行了掩碼運算,1表示使用掩碼,0表示不使用掩碼。從客戶端發送向服務端的數據幀必須使用掩碼。

Payload length 7 bits,7+16 bits or 7+64 bits

用于表示payload的長度,有以下三種情況:

Payload length 表示的大小 payload的長度 0 - 125 Payload length 大小 126 之后的2個字節表示的無符號整數 127 之后的8個字節表示的無符號整數

Masking-key - 0 or 4 bytes

32 bit長的掩碼,如果MASK為1,則幀中就存在這一個字段,在解析payload時,需要進行使用32長掩碼進行異或操作,之后才能得到正確結果。

Java NIO 實現

利用Java NIO 來實現一個聊天室。部分代碼如下。

NIO的常規代碼:

selector.select(1000);Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> it = selectionKeys.iterator();while (it.hasNext()) { SelectionKey key = it.next(); it.remove(); if (key.isAcceptable()) {handleAccept(key); } if (key.isReadable()) {handleRead(key); }}

接受連接:

public void handleAccept(SelectionKey key) { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc; try {sc = ssc.accept();sc.configureBlocking(false);sc.register(selector, SelectionKey.OP_READ);System.out.println(String.format('[server] -- client %s connected.', sc.getRemoteAddress().toString())); } catch (IOException e) {System.out.println(String.format('[server] -- error occur when accept: %s.', e.getMessage()));key.cancel(); }}

讀取通道中的數據:

public void handleRead(SelectionKey key) { SocketChannel sc = (SocketChannel) key.channel(); Client client = (Client) key.attachment(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 如果是第一次連接進來,就需要創建一個客戶端對象,存儲起來 if (client == null) {client = new Client(sc);clients.add(client);key.attach(client);byteBuffer.clear();// 如果連接還沒有建立,就是要HTTP建立連接try { sc.read(byteBuffer); byteBuffer.flip(); String response = WebSocketHandler.getResponse(new String(byteBuffer.array())); byteBuffer.clear(); byteBuffer.put(response.getBytes()); byteBuffer.flip(); while (byteBuffer.hasRemaining()) {sc.write(byteBuffer); }} catch (IOException e) { System.out.println(String.format('[server] -- error occur when read: %s.', e.getMessage()));}String message = '[系統消息] ' + client.toString() + ' 加入了群聊';broadcast(message.getBytes(), client); } byteBuffer.clear(); int read = 0; try {read = sc.read(byteBuffer);if (read > 0) { byteBuffer.flip(); int opcode = byteBuffer.get() & 0x0f; // 8表示客戶端關閉了連接 if (opcode == 8) {System.out.println(String.format('[server] -- client %s connection close.', sc.getRemoteAddress()));clients.remove(client);String message = '[系統消息] ' + client.toString() + ' 退出了群聊';broadcast(message.getBytes(), client);sc.close();key.cancel();return; } // 只考慮了最簡單的payload長度情況。 int len = byteBuffer.get(); len &= 0x7f; byte[] mask = new byte[4]; byteBuffer.get(mask); byte[] payload = new byte[len]; byteBuffer.get(payload); for (int i = 0; i < payload.length; i++) {payload[i] ^= mask[i % 4]; } System.out.println(String .format('[server] -- client: [%s], send: [%s].', client.toString(), new String(payload))); String message = String.format('[%s]: %s', client.toString(), new String(payload)); broadcast(message.getBytes(), client);} else if (read == -1) { System.out.println(String.format('[server] -- client %s connection close.', sc.getRemoteAddress())); clients.remove(client); String message = '[系統消息] ' + client.toString() + ' 退出了群聊'; broadcast(message.getBytes(), client); sc.close(); key.cancel();} } catch (IOException e) {System.out.println(String.format('[server] -- error occur when read: %s.', e.getMessage())); }}

使用HTTP建立WebSocket連接。

public class WebSocketHandler { private static String APPEND_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; static class Header {private Map<String, String> properties = new HashMap<>();public String get(String key) { return properties.get(key);} } private WebSocketHandler() {} private static Header phrase(String request) {Header header = new Header();String[] pros = request.split('rn');for (String pro : pros) { if (pro.contains(':')) {int index = pro.indexOf(':');String key = pro.substring(0, index).trim();String value = pro.substring(index + 1).trim();header.properties.put(key, value); }}return header; } public static String getResponse(String request) {Header header = phrase(request);String acceptKey = header.get('Sec-WebSocket-Key') + APPEND_STRING;MessageDigest sha1;try { sha1 = MessageDigest.getInstance('sha1'); sha1.update(acceptKey.getBytes()); acceptKey = new String(Base64.getEncoder().encode(sha1.digest()));} catch (NoSuchAlgorithmException e) { System.out.println('fail to encode ' + e.getMessage()); return null;}StringBuilder stringBuilder = new StringBuilder();stringBuilder.append('HTTP/1.1 101 Switching Protocolsrn').append('Upgrade: websocketrn') .append('Connection: Upgradern').append('Sec-WebSocket-Accept: ' + acceptKey + 'rn') .append('rn');return stringBuilder.toString(); }}

客戶端對象

/** * @author XinHui Chen * @date 2020/2/8 19:20 */public class Client { private SocketChannel socketChannel = null; private String id = null; public SocketChannel getSocketChannel() {return socketChannel; } public String getId() {return id; } Client(SocketChannel socketChannel) {this.socketChannel = socketChannel;this.id = UUID.randomUUID().toString(); } @Override public String toString() {try { return id + ' ' + socketChannel.getRemoteAddress().toString();} catch (IOException e) { System.out.println(e.getMessage()); return null;} }}結果

使用網頁和控制臺與服務端建立WebSocket連接,發送數據。兩個都能成功顯示。

java Nio使用NioSocket客戶端與服務端交互實現方式

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 亚洲毛片| 免费大片在线观看网站 | 国产精品一区二区三区在线 | 色综合久 | 综合色久 | 91精品久久久久久 | 一级片观看 | 久久精品系列 | 欧美视频精品 | 欧美精品免费在线 | 免费观看黄视频 | 日韩视频精品在线 | 视频一区二区三区免费观看 | 免费一区 | 中文字幕在线一区 | 91精品国产91久久久久久最新 | 高清一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲伊人久久网 | 99精品国产高清一区二区麻豆 | 久久亚洲国产精品 | 综合二区 | 91高清在线 | 在线免费观看色视频 | 99久热在线精品视频观看 | 亚洲精品久久久 | 黄理论视频 | 精品久久久久国产 | 精品一区二区三区久久 | 久久国产精品毛片 | 91精品国产91综合久久蜜臀 | 日韩免费一区 | 亚州精品成人 | 国产99在线播放 | 91影院在线观看 | 黄色片com | 夜夜久久| 国产精品永久免费 | hh99me在线观看 | 亚洲一区二区三区四区五区中文 | 久草电影网 | 国产精品欧美一区二区三区不卡 | 日韩专区在线播放 | 国产97久久 | 中文字字幕一区二区三区四区五区 | 亚洲精品美女久久 | 色视频网站在线观看 | 精品视频一区二区在线观看 | 日本精品一区 | 亚洲毛片在线 | 国产精品久久免费视频在线 | 在线不卡一区 | 日韩免费视频一区二区 | 亚洲精品在线免费播放 | 午夜黄色av | 四虎最新影视 | 日韩一区二区在线免费观看 | 亚洲一区二区三区四区 | 久久大陆 | 黄色大片网 | 亚洲精品在线视频 | 91av导航| 亚洲一区二区三区在线播放 | 欧美国产视频 | 成人精品| 在线视频中文字幕 | 色婷婷综合久久久中文字幕 | 国产精品国产 | 国产成人91| 97热在线观看 | 精品视频一区二区三区 | 久久不卡| 亚洲欧美激情在线 | 成人欧美一区二区三区黑人孕妇 | 欧美成人综合 | 91国内产香蕉 | 日韩在线中文字幕视频 | 成人影院www在线观看 | 99精品国产高清一区二区麻豆 | 国内精品视频 | 欧美性猛交一区二区三区精品 | 超碰一区 | 欧美精品区 | 久久精品国产一区二区三区不卡 | 免看一级一片 | 亚洲色图第八页 | 久久ri资源网 | 亚洲欧美日韩在线一区二区 | 91精品国产自产精品男人的天堂 | 男女黄网站 | 久久综合热 | 综合国产| 国产福利在线观看视频 | 91九色在线 | 国产中文视频 | 国产欧美一区二区精品性色 | 欧美日韩一 | 欧美日韩一区二区三区在线观看 | 国产成人涩涩涩视频在线观看 | 欧美日韩中文字幕在线 | www国产亚洲精品 | 亚洲精品一区久久久久久 | 午夜大片网 | 国产精品久久久久久久久 | 亚洲精品一区二区三区中文字幕 | 91不卡| 成人精品一区二区三区 | 欧美成人一区二免费视频软件 | 伊人青青操 | 日韩和的一区二区 | 国产免费自拍 | 久久久久久久久久久久久久久久久久久 | 欧美国产精品一区 | 欧美色综合 | 欧洲视频一区二区三区 | 性人久久久 | 午夜影院免费视频 | 91精品国产乱码久久久久久久久 | 免费观看日韩一级片 | www在线视频 | 在线免费一级片 | 久久9精品 | 国产精品久久久久久久久久久久冷 | 国产一区二区视频在线观看 | 久久精品日产高清版的功能介绍 | 婷婷亚洲五月 | 久久mm | 日本黄a三级三级三级 | 国产一区二区三区四 | 在线观看你懂的视频 | 毛片免费看 | 成人精品三级av在线看 | 亚洲精品在线播放 | www.天天草 | 国产美女久久久 | 欧美激情精品久久久久久 | 一级片的网址 | 激情小说综合网 | 欧美日韩在线一区二区三区 | 久久久精品网站 | 国产精品1页 | 日韩 国产 在线 | 欧美日韩视频一区二区 | 国产欧美日韩在线观看 | 91黄在线观看 | 操操操av | 久久久久久久久国产 | 欧美一级视频 | 一区二区三区国产免费 | 日韩a视频 | 99精品欧美一区二区三区 | 三级色网站| 一区免费观看 | 欧美日韩成人在线视频 | 狠狠做深爱婷婷综合一区 | 国产一级黄色大片 | 国产精品视频一二 | 久久99国产精品久久99果冻传媒 | 91精品综合久久久久久五月天 | 性视频网站免费 | 日韩av电影在线免费观看 | 久久人妖 | 一级黄色毛片免费 | 国产美女网站 | 亚洲福利一区二区 | 狠狠狠 | 中文字幕在线观看第一页 | 中文字幕 国产精品 | 欧洲视频一区二区三区 | 国产精品久久久久不卡 | 国产精品一区二区av | 日本天天操 | 久久久久女人精品毛片九一韩国 | 在线日韩欧美 | 国产精品久久久精品 | 日韩和的一区二区 | 国产精品ssss在线亚洲 | 美女超碰在线 | 2012中文版免费观看 | 在线观看日韩精品 | 久久99国产精品久久99果冻传媒 | 波多野结衣三区 | k8久久久一区二区三区 | 免费黄色小视频 | 九九综合九九综合 | 久久女人网 | 日韩欧美第一页 | 成人九色 | 国产欧美精品一区二区三区四区 | 一区二区三区四区免费观看 | 在线观看成人小视频 | 欧美精品一区二区三区在线播放 | 午夜视频免费 | 在线视频91 | 国产精品69久久久久水密桃 | 亚洲综合无码一区二区 | 国产精品污www在线观看 | 亚洲一区中文字幕在线 | 午夜视频网 | 伊人色综合网 | 成人男女激情免费视频 | 久久国产精品一区 | 国精品一区| 午夜影院18| 色视频网站在线观看 | 亚洲伊人网站 | 久久黄网| 中文字幕亚洲一区二区三区 | 色玖玖综合 | 久久国产精品视频 | 久久精品高清 | 狠狠操中文字幕 | 国产一区二区三区精品久久久 | 国产在线精品一区 | 久久久久91| 天堂在线www | 国产一区中文字幕 | 中文字幕免费在线 | 在线国产一区 | 欧美日韩视频 | www国产在线观看 | 免费在线观看毛片网站 | 久久久亚洲一区 | 大象一区 | 亚洲第一免费视频网站 | 久久综合久久久 | 欧美猛交ⅹxxx乱大交视频 | 久久9国产偷伦 | 一区二区三区在线播放 | 国产日韩欧美一区 | 91影库| 国产精品国色综合久久 | 亚洲成av人片在线观看 | 精久久久| 99精品视频网 | 国产成人福利在线 | 三级视频在线观看 | 亚洲综合视频 | 欧洲一区二区三区 | 亚洲国产精品一区二区三区 | 91精品国产91久久综合桃花 | www.99热.com| 久久精品一区二区 | 亚洲 欧美 日韩在线 | 亚洲福利av | 美女久久久久 | 黄色片免费观看网站 | 一级片在线免费观看视频 | 五月婷婷在线观看视频 | 色欧美片视频在线观看 | 日韩高清在线一区 | 中文字幕亚洲欧美日韩在线不卡 | 国偷自产av一区二区三区 | 北条麻妃国产九九九精品小说 | 国产一区二区三区在线免费观看 | 国产精品毛片久久久久久久 | 三级视频在线 | 色欧美综合 | 99国产精品久久久久久久成人热 | 综合久久久久久久 | 日本中文字幕一区 | 日本在线观看网站 | 国产高清在线观看 | 国产成人精品在线 | 中文字幕日韩欧美一区二区三区 | 欧美精品第一页 | 夫妻午夜影院 | 一区二区三区视频在线观看 | 国产美女精品 | 中文字幕国产一区 | 一区二区三区在线免费看 | 中文字幕日韩一区二区不卡 | 欧美综合婷婷 | 99精品网站| 国产成人一区二区 | 久草网在线视频 | 精品国产乱码一区二区三区 | 一区视频 | 国产精品久久久久一区二区三区 | 亚洲欧洲一区二区三区 | 国产一区 | 成人高清av| 亚洲福利免费 | 国产精品中文字幕在线观看 | 久久一| 精品视频在线免费 | 日日干天天干 | 一级黄色影视 | 午夜精品久久久久久久星辰影院 | 午夜精品久久久久久久久久久久久 | 亚洲一区二区中文字幕 | 亚洲国产欧美日韩 | 青青草亚洲 | 亚洲一区二区视频在线观看 | 国产一级片 | 美女一区 | 国产日韩一区二区三区 | 91精品一区二区三区久久久久久 | 免费一区二区 | 日韩福利视频 | av久久 | 欧美狠狠操 | 国产乡下妇女做爰视频 | 亚洲精选国产 | 久久久久国产一区二区三区四区 | 亚洲一区中文字幕 | 91一级 | 一级电影在线观看 | 黄色大片成人 | 日韩成人免费 | 宅男lu666噜噜噜在线观看 | 欧美在线观看免费观看视频 | 久免费视频 | 亚洲精品色| 亚洲 精品 综合 精品 自拍 | 婷婷桃色网 | www.亚洲| 吴梦梦到粉丝家实战华中在线观看 | 午夜精品久久久久久久久久久久 | 日韩91精品 | 日韩免费高清视频 | 午夜在线电影 | 91视频.com | 日韩一二三区视频 | 综合网在线 | 操操操影院 | 爱啪导航一精品导航站 | 亚洲精品久久久一区二区三区 | 91高清在线| av网站网址 | v片网站 | 久久99精品国产自在现线 | 亚洲天堂一区二区三区 | 久久国产精品视频 | 欧美日韩在线播放 | 99精品国产一区二区三区 | 亚洲最大免费视频 | 久久伊人久久 | 国产精品2 | 成人国产精品久久久 | 国产精品一区人伦免视频播放 | 成人一区二区电影 | 中文字幕丝袜 | 国产成人免费视频网站视频社区 | 精品中文在线 | 91麻豆精品国产91久久久更新资源速度超快 | 国产精品国产精品国产专区不蜜 | av在线综合网 | 亚洲国产成人精品女人久久久 | 国产成人精品电影 | 亚洲国产精品99久久久久久久久 | av手机电影 | 亚洲日韩欧美一区二区在线 | 日本黄色a视频 | 亚洲一区二区高清视频 | 国产成人精品免高潮在线观看 | 在线影院av | 精品1区| 亚洲91| 韩国毛片在线 | 一区二区三区国产视频 | 国产日本韩国在线 | 高清一区二区三区 | 国产精品国产三级国产aⅴ无密码 | 欧美午夜一区 | 在线观看精品自拍私拍 | 色婷婷av久久久久久久 | 久久成人免费视频 | 午夜艹 | 成人小视频在线观看 | 日韩欧美精品一区二区三区 | 亚洲人人 | 亚洲天堂一区二区 | 黄色一级片视频播放 | 日本理论片好看理论片 | 亚洲乱码国产乱码精品精的特点 | 91久久91久久精品免观看 | 久草 在线 | www中文字幕 | 国产欧美日韩综合精品一区二区 | 一区二区三区在线看 | 日韩在线观看高清 | 亚洲不卡视频 | 婷婷五月色综合 | 国产午夜精品一区二区三区 | 亚洲视频免费观看 | 午夜影晥| 成人日韩| 欧美亚洲国产日韩 | 国产精品国产精品国产专区不卡 | 中文字幕av一区 | 亚洲a视频| 欧美一级欧美三级在线观看 | 特一级毛片 | 国产精品一区av | 亚洲午夜剧场 | 国产高清一级片 | 午夜欧美 | 一区二区在线看 | 国内精品视频一区 | 国产成人av一区二区三区 | 欧美在线视频一区二区 | 高清一区二区三区 | 欧美亚洲视频 | 一二三四区视频在线观看 | 欧美视频在线一区 | 99精品欧美一区二区三区综合在线 | 欧美 日韩 国产 成人 在线 | 国产一区欧美 | 亚洲一区二区高清视频 | 午夜私人影院 | 操操操av| www国产网站 | 日韩成人在线影院 | av资源中文在线 | a免费在线 | 一区二区三区免费 | 九九热在线观看 | 青青久久 | 午夜精品久久久久久久久久久久 | 亚洲一区二区三区免费看 | 在线欧美亚洲 | 日韩av电影在线免费观看 | 亚洲一区二区三区高清 | 国产成人av一区二区 | 色综合网站 | 久热热 | 国产一区二区精品久久岳 | 一级毛片在线播放 | 天天操天天干天天爽 | 日韩午夜电影在线观看 | 免费日本视频 | 在线一区二区三区视频 | 日韩在线视频中文字幕 | 中文字幕一区二区三区乱码图片 | 香蕉av777xxx色综合一区 | 免费一二三区 | 久久亚洲一区二区三区四区 | 欧美成人激情视频 | 精品日韩一区二区 | 国产精品视频一二三 | 91麻豆产精品久久久久久 | 日韩一区二区在线免费 | 成人男女激情免费视频 | 爱免费视频 | 成人影院网站ww555久久精品 | 国产99久久久久久免费看农村 | 亚洲欧美日韩在线 | 精品一区二区三区四区五区 | 国产中文视频 | 亚洲伊人久久综合 | 午夜免费视频 | 九九热精品视频在线观看 | 在线国产一区 | 91在线精品一区二区 | 国产精品视频一区二区三区四 | 久久精品一区 | 午夜精品久久久久久久星辰影院 | 波多野结衣在线网址 | 成人欧美一区二区三区白人 | 国产精品久久久久9999 | 欧美日韩啪啪 | 亚洲久久在线 | 日韩在线二区 | 国产在线播 | 午夜免费电影 | 午夜精品视频 | 欧美午夜精品久久久久久人妖 | jlzzjlzz亚洲日本少妇 | 91视频一区二区 | 精品福利在线视频 | 在线观看毛片网站 | 91视频观看 | 日韩欧美一区二区三区免费观看 | 亚洲国产成人久久一区二区三区 | 婷婷综合 | 久久久99精品免费观看 | a久久免费视频 | 国产3区| 精品欧美乱码久久久久久 | 国产免费一区二区三区 | 美女操网站 | 91天天综合 | 亚洲高清一区二区三区 | 亚洲电影一区二区 | 日日操天天操 | 久久99精品久久久久蜜臀 | 日韩一级视频 | 国产一区二区观看 | 亚洲免费视频网站 | 中国一级毛片免费 | 午夜资源| 四虎com| 久草视| 国产欧美日韩一区 | 欧美成人激情视频 | 在线视频一区二区三区 | 色久在线 | 国产美女一区二区 | 日韩一区二区三区在线 | av中文字幕在线播放 | 久久成人在线视频 | 国产成人综合在线观看 | 激情久久av一区av二区av三区 | 国产精品久久久久一区二区三区 | 欧美性猛交一区二区三区精品 | 操操操夜夜操 | 国产成人精品一区二区三区视频 | 成年人综合网 | 97超碰在线免费 | 美女久久 | 97视频免费在线观看 | 在线中文字幕av | 国产一区二区三区精品久久久 | 国产精品一区二区无线 | 亚洲国产一区二区三区四区 | 日韩一片| 国产精品91久久久久 | 一区二区影院 | 国产精品自拍视频 | 亚洲大片免费观看 | 天天摸天天看 | 仙人掌旅馆在线观看 | 91精产国品一二三区在线观看 | 精品无码久久久久久国产 | 久久精品日产高清版的功能介绍 | 亚洲电影免费 | 国产在线激情视频 | av中文字幕在线播放 | 成人午夜影院 | 一区二区三区精品视频 | 成人精品国产一区二区4080 | 精品国产乱码一区二区三区 | 日韩欧美国产一区二区 | 中文字幕大全 | 欧美一级片在线观看 | 日韩不卡一区二区 | 日韩一区二区不卡 | 国产欧美日韩在线观看 | 九九综合九九 | 国产综合精品 | 亚洲一区二区三区四区五区中文 | www久久久 | 日韩中文字幕免费视频 | 五月天婷婷社区 | 99久久99久久 | 久久伊99综合婷婷久久伊 | 一区二区三区影院 | 久久成人综合 | 日韩在线欧美 | 中文字幕欧美日韩 | 亚洲视频区 | 欧美区国产区 | 欧美国产日韩一区二区 | 狠狠影院 | 蜜臀久久99精品久久久无需会员 | 91午夜精品 | 久久99国产精品久久99大师 | 超碰人操| 国产成人一区二区三区 | 91亚洲福利 | 99精品国产高清在线观看 | 电影91久久久 | 中文字幕视频三区 | 国产2区 | 欧美日韩国产精品久久久久 | 精品久久中文 | 夜夜骑天天射 | 99精品久久| 老司机午夜免费精品视频 | 亚洲网站免费 | 午夜精品久久久久久久星辰影院 | 中文字幕一页二页 | 午夜理伦三级 | 亚洲成av人片一区二区梦乃 | 久久亚洲国产视频 | 网站av | 一区免费看 | 自拍偷拍亚洲视频 | 成人欧美一区二区三区视频xxx | 久久国内精品 | 亚洲精品福利 | a级性生活 | 国产成人99 | 国产色| 久久r免费视频 | 操操操操操操操操操操操操操操 | 成人欧美一区二区三区黑人孕妇 | 欧美日韩视频 | 久久天堂| 欧美在线a | 亚洲一二三 | 亚洲欧洲精品成人久久奇米网 | 日日夜夜一区二区 | 成年免费视频 | 精品久久久久久亚洲精品 | 欧亚视频在线观看 | 国产日韩欧美一区二区在线观看 | a毛片毛片av永久免费 | 黄色一级毛片 | 毛片毛片毛片 | 福利视频网址导航 | 日本一区二区不卡 | 成人欧美一区二区三区色青冈 | 日韩久久一区二区 | 亚洲成人av在线播放 | 国产一区精品视频 | 看真人视频a级毛片 | 久久福利 | 日韩高清在线 | 欧美猛交ⅹxxx乱大交视频 | 国产精品日韩精品 | 日韩国伦理久久一区 | 亚洲一区二区在线电影 | 男女啪啪高清无遮挡 |