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

Java 從零開始手寫 RPC—如何實現客戶端調用服務端?

開發 后端
寫完了客戶端和服務端,那么如何實現客戶端和服務端的調用呢?下面就讓我們一起來看一下。希望本文對你有所幫助!

[[429717]]

寫完了客戶端和服務端,那么如何實現客戶端和服務端的調用呢?

下面就讓我們一起來看一下。

接口定義

計算方法

  1. package com.github.houbb.rpc.common.service; 
  2.  
  3.  
  4. import com.github.houbb.rpc.common.model.CalculateRequest; 
  5. import com.github.houbb.rpc.common.model.CalculateResponse; 
  6.  
  7.  
  8. /** 
  9.  * <p> 計算服務接口 </p> 
  10.  * 
  11.  * <pre> Created: 2018/8/24 下午4:47  </pre> 
  12.  * <pre> Project: fake  </pre> 
  13.  * 
  14.  * @author houbinbin 
  15.  * @since 0.0.1 
  16.  */ 
  17. public interface Calculator { 
  18.  
  19.  
  20.     /** 
  21.      * 計算加法 
  22.      * @param request 請求入參 
  23.      * @return 返回結果 
  24.      */ 
  25.     CalculateResponse sum(final CalculateRequest request); 
  26.  
  27.  

pojo

對應的參數對象:

  • CalculateRequest
  1. package com.github.houbb.rpc.common.model; 
  2.  
  3.  
  4. import java.io.Serializable
  5.  
  6.  
  7. /** 
  8.  * <p> 請求入參 </p> 
  9.  * 
  10.  * <pre> Created: 2018/8/24 下午5:05  </pre> 
  11.  * <pre> Project: fake  </pre> 
  12.  * 
  13.  * @author houbinbin 
  14.  * @since 0.0.3 
  15.  */ 
  16. public class CalculateRequest implements Serializable { 
  17.  
  18.  
  19.     private static final long serialVersionUID = 6420751004355300996L; 
  20.  
  21.  
  22.     /** 
  23.      * 參數一 
  24.      */ 
  25.     private int one; 
  26.  
  27.  
  28.     /** 
  29.      * 參數二 
  30.      */ 
  31.     private int two; 
  32.  
  33.  
  34.     public CalculateRequest() { 
  35.     } 
  36.  
  37.  
  38.     public CalculateRequest(int one, int two) { 
  39.         this.one = one; 
  40.         this.two = two; 
  41.     } 
  42.  
  43.  
  44.     //getter setter toString 
  45.  
  46.  
  • CalculateResponse
  1. package com.github.houbb.rpc.common.model; 
  2.  
  3.  
  4. import java.io.Serializable
  5.  
  6.  
  7. /** 
  8.  * <p> 請求入參 </p> 
  9.  * 
  10.  * <pre> Created: 2018/8/24 下午5:05  </pre> 
  11.  * <pre> Project: fake  </pre> 
  12.  * 
  13.  * @author houbinbin 
  14.  * @since 0.0.3 
  15.  */ 
  16. public class CalculateResponse implements Serializable { 
  17.  
  18.  
  19.     private static final long serialVersionUID = -1972014736222511341L; 
  20.  
  21.  
  22.     /** 
  23.      * 是否成功 
  24.      */ 
  25.    private boolean success; 
  26.  
  27.  
  28.     /** 
  29.      * 二者的和 
  30.      */ 
  31.    private int sum
  32.  
  33.  
  34.     public CalculateResponse() { 
  35.     } 
  36.  
  37.  
  38.     public CalculateResponse(boolean success, int sum) { 
  39.         this.success = success; 
  40.         this.sum = sum
  41.     } 
  42.  
  43.  
  44.     //getter setter toString 

客戶端

核心部分

RpcClient 需要添加對應的 Handler,調整如下:

  1. Bootstrap bootstrap = new Bootstrap(); 
  2. ChannelFuture channelFuture = bootstrap.group(workerGroup) 
  3.         .channel(NioSocketChannel.class) 
  4.         .option(ChannelOption.SO_KEEPALIVE, true
  5.         .handler(new ChannelInitializer<Channel>(){ 
  6.             @Override 
  7.             protected void initChannel(Channel ch) throws Exception { 
  8.                 ch.pipeline() 
  9.                         .addLast(new LoggingHandler(LogLevel.INFO)) 
  10.                         .addLast(new CalculateRequestEncoder()) 
  11.                         .addLast(new CalculateResponseDecoder()) 
  12.                         .addLast(new RpcClientHandler()); 
  13.             } 
  14.         }) 
  15.         .connect(RpcConstant.ADDRESS, port) 
  16.         .syncUninterruptibly(); 

netty 中的 handler 泳道設計的非常優雅,讓我們的代碼可以非常靈活地進行拓展。

接下來我們看一下對應的實現。

RpcClientHandler

  1. package com.github.houbb.rpc.client.handler; 
  2.  
  3.  
  4. import com.github.houbb.log.integration.core.Log; 
  5. import com.github.houbb.log.integration.core.LogFactory; 
  6. import com.github.houbb.rpc.client.core.RpcClient; 
  7. import com.github.houbb.rpc.common.model.CalculateRequest; 
  8. import com.github.houbb.rpc.common.model.CalculateResponse; 
  9. import io.netty.channel.ChannelHandlerContext; 
  10. import io.netty.channel.SimpleChannelInboundHandler; 
  11.  
  12.  
  13. /** 
  14.  * <p> 客戶端處理類 </p> 
  15.  * 
  16.  * <pre> Created: 2019/10/16 11:30 下午  </pre> 
  17.  * <pre> Project: rpc  </pre> 
  18.  * 
  19.  * @author houbinbin 
  20.  * @since 0.0.2 
  21.  */ 
  22. public class RpcClientHandler extends SimpleChannelInboundHandler { 
  23.  
  24.  
  25.     private static final Log log = LogFactory.getLog(RpcClient.class); 
  26.  
  27.  
  28.     @Override 
  29.     public void channelActive(ChannelHandlerContext ctx) throws Exception { 
  30.         CalculateRequest request = new CalculateRequest(1, 2); 
  31.  
  32.  
  33.         ctx.writeAndFlush(request); 
  34.         log.info("[Client] request is :{}", request); 
  35.     } 
  36.  
  37.  
  38.     @Override 
  39.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  40.         CalculateResponse response = (CalculateResponse)msg; 
  41.         log.info("[Client] response is :{}", response); 
  42.     } 
  43.  
  44.  

這里比較簡單,channelActive 中我們直接發起調用,入參的對象為了簡單,此處固定寫死。

channelRead0 中監聽服務端的相應結果,并做日志輸出。

CalculateRequestEncoder

請求參數是一個對象,netty 是無法直接傳輸的,我們將其轉換為基本對象:

  1. package com.github.houbb.rpc.client.encoder; 
  2.  
  3.  
  4. import com.github.houbb.rpc.common.model.CalculateRequest; 
  5. import io.netty.buffer.ByteBuf; 
  6. import io.netty.channel.ChannelHandlerContext; 
  7. import io.netty.handler.codec.MessageToByteEncoder; 
  8.  
  9.  
  10. /** 
  11.  * @author binbin.hou 
  12.  * @since 0.0.3 
  13.  */ 
  14. public class CalculateRequestEncoder extends MessageToByteEncoder<CalculateRequest> { 
  15.  
  16.  
  17.     @Override 
  18.     protected void encode(ChannelHandlerContext ctx, CalculateRequest msg, ByteBuf out) throws Exception { 
  19.         int one = msg.getOne(); 
  20.         int two = msg.getTwo(); 
  21.  
  22.  
  23.         out.writeInt(one); 
  24.         out.writeInt(two); 
  25.     } 
  26.  
  27.  

CalculateResponseDecoder

針對服務端的響應,也是同理。

我們需要把基本的類型,封裝轉換為我們需要的對象。

  1. package com.github.houbb.rpc.client.decoder; 
  2.  
  3.  
  4. import com.github.houbb.rpc.common.model.CalculateResponse; 
  5. import io.netty.buffer.ByteBuf; 
  6. import io.netty.channel.ChannelHandlerContext; 
  7. import io.netty.handler.codec.ByteToMessageDecoder; 
  8.  
  9.  
  10. import java.util.List; 
  11.  
  12.  
  13. /** 
  14.  * 響應參數解碼 
  15.  * @author binbin.hou 
  16.  * @since 0.0.3 
  17.  */ 
  18. public class CalculateResponseDecoder extends ByteToMessageDecoder { 
  19.  
  20.  
  21.     @Override 
  22.     protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 
  23.         boolean success = in.readBoolean(); 
  24.         int sum = in.readInt(); 
  25.  
  26.  
  27.         CalculateResponse response = new CalculateResponse(success, sum); 
  28.         out.add(response); 
  29.     } 
  30.  
  31.  

服務端

設置處理類

RpcServer 中的處理類要稍微調整一下,其他的保持不變。

  1. ServerBootstrap serverBootstrap = new ServerBootstrap(); 
  2. serverBootstrap.group(workerGroup, bossGroup) 
  3.         .channel(NioServerSocketChannel.class) 
  4.         // 打印日志 
  5.         .handler(new LoggingHandler(LogLevel.INFO)) 
  6.         .childHandler(new ChannelInitializer<Channel>() { 
  7.             @Override 
  8.             protected void initChannel(Channel ch) throws Exception { 
  9.                 ch.pipeline() 
  10.                         .addLast(new CalculateRequestDecoder()) 
  11.                         .addLast(new CalculateResponseEncoder()) 
  12.                         .addLast(new RpcServerHandler()); 
  13.             } 
  14.         }) 
  15.         // 這個參數影響的是還沒有被accept 取出的連接 
  16.         .option(ChannelOption.SO_BACKLOG, 128) 
  17.         // 這個參數只是過一段時間內客戶端沒有響應,服務端會發送一個 ack 包,以判斷客戶端是否還活著。 
  18.         .childOption(ChannelOption.SO_KEEPALIVE, true); 

RpcServerHandler

一開始這里是空實現,我們來添加一下對應的實現。

  1. package com.github.houbb.rpc.server.handler; 
  2.  
  3.  
  4. import com.github.houbb.log.integration.core.Log; 
  5. import com.github.houbb.log.integration.core.LogFactory; 
  6. import com.github.houbb.rpc.common.model.CalculateRequest; 
  7. import com.github.houbb.rpc.common.model.CalculateResponse; 
  8. import com.github.houbb.rpc.common.service.Calculator; 
  9. import com.github.houbb.rpc.server.service.CalculatorService; 
  10. import io.netty.channel.ChannelHandlerContext; 
  11. import io.netty.channel.SimpleChannelInboundHandler; 
  12.  
  13.  
  14. /** 
  15.  * @author binbin.hou 
  16.  * @since 0.0.1 
  17.  */ 
  18. public class RpcServerHandler extends SimpleChannelInboundHandler { 
  19.  
  20.  
  21.     private static final Log log = LogFactory.getLog(RpcServerHandler.class); 
  22.  
  23.  
  24.     @Override 
  25.     public void channelActive(ChannelHandlerContext ctx) throws Exception { 
  26.         final String id = ctx.channel().id().asLongText(); 
  27.         log.info("[Server] channel {} connected " + id); 
  28.     } 
  29.  
  30.  
  31.     @Override 
  32.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  33.         final String id = ctx.channel().id().asLongText(); 
  34.  
  35.  
  36.         CalculateRequest request = (CalculateRequest)msg; 
  37.         log.info("[Server] receive channel {} request: {} from ", id, request); 
  38.  
  39.  
  40.         Calculator calculator = new CalculatorService(); 
  41.         CalculateResponse response = calculator.sum(request); 
  42.  
  43.  
  44.         // 回寫到 client 端 
  45.         ctx.writeAndFlush(response); 
  46.         log.info("[Server] channel {} response {}", id, response); 
  47.     } 
  48.  
  49.  

讀取到客戶端的訪問之后,我們獲取到計算的入參 CalculateRequest,然后調用 sum 方法,獲取到對應的 CalculateResponse,將結果通知客戶端。

CalculateRequestDecoder

這里和客戶端是一一對應的,我們首先把 netty 傳遞的基本類型轉換為 CalculateRequest 對象。

  1. package com.github.houbb.rpc.server.decoder; 
  2.  
  3.  
  4. import com.github.houbb.rpc.common.model.CalculateRequest; 
  5. import io.netty.buffer.ByteBuf; 
  6. import io.netty.channel.ChannelHandlerContext; 
  7. import io.netty.handler.codec.ByteToMessageDecoder; 
  8.  
  9.  
  10. import java.util.List; 
  11.  
  12.  
  13. /** 
  14.  * 請求參數解碼 
  15.  * @author binbin.hou 
  16.  * @since 0.0.3 
  17.  */ 
  18. public class CalculateRequestDecoder extends ByteToMessageDecoder { 
  19.  
  20.  
  21.     @Override 
  22.     protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 
  23.         int one = in.readInt(); 
  24.         int two = in.readInt(); 
  25.  
  26.  
  27.         CalculateRequest request = new CalculateRequest(one, two); 
  28.         out.add(request); 
  29.     } 
  30.  
  31.  

CalculateResponseEncoder

這里和客戶端類似,我們需要把 response 轉換為基本類型進行網絡傳輸。

  1. package com.github.houbb.rpc.server.encoder; 
  2.  
  3.  
  4. import com.github.houbb.rpc.common.model.CalculateResponse; 
  5. import io.netty.buffer.ByteBuf; 
  6. import io.netty.channel.ChannelHandlerContext; 
  7. import io.netty.handler.codec.MessageToByteEncoder; 
  8.  
  9.  
  10. /** 
  11.  * @author binbin.hou 
  12.  * @since 0.0.3 
  13.  */ 
  14. public class CalculateResponseEncoder extends MessageToByteEncoder<CalculateResponse> { 
  15.  
  16.  
  17.     @Override 
  18.     protected void encode(ChannelHandlerContext ctx, CalculateResponse msg, ByteBuf out) throws Exception { 
  19.         boolean success = msg.isSuccess(); 
  20.         int result = msg.getSum(); 
  21.         out.writeBoolean(success); 
  22.         out.writeInt(result); 
  23.     } 
  24.  
  25.  

CalculatorService

服務端對應的實現類。

  1. public class CalculatorService implements Calculator { 
  2.  
  3.  
  4.     @Override 
  5.     public CalculateResponse sum(CalculateRequest request) { 
  6.         int sum = request.getOne()+request.getTwo(); 
  7.  
  8.  
  9.         return new CalculateResponse(truesum); 
  10.     } 
  11.  
  12.  

測試

服務端

啟動服務端:

  1. new RpcServer().start(); 

服務端啟動日志:

  1. [DEBUG] [2021-10-05 11:53:11.795] [main] [c.g.h.l.i.c.LogFactory.setImplementation] - Logging initialized using 'class com.github.houbb.log.integration.adaptors.stdout.StdOutExImpl' adapter. 
  2. [INFO] [2021-10-05 11:53:11.807] [Thread-0] [c.g.h.r.s.c.RpcServer.run] - RPC 服務開始啟動服務端 
  3. 十月 05, 2021 11:53:13 上午 io.netty.handler.logging.LoggingHandler channelRegistered 
  4. 信息: [id: 0xd399474f] REGISTERED 
  5. 十月 05, 2021 11:53:13 上午 io.netty.handler.logging.LoggingHandler bind 
  6. 信息: [id: 0xd399474f] BIND: 0.0.0.0/0.0.0.0:9527 
  7. 十月 05, 2021 11:53:13 上午 io.netty.handler.logging.LoggingHandler channelActive 
  8. 信息: [id: 0xd399474f, L:/0:0:0:0:0:0:0:0:9527] ACTIVE 
  9. [INFO] [2021-10-05 11:53:13.101] [Thread-0] [c.g.h.r.s.c.RpcServer.run] - RPC 服務端啟動完成,監聽【9527】端口 

客戶端

啟動客戶端:

  1. new RpcClient().start(); 

日志如下:

  1. [DEBUG] [2021-10-05 11:54:12.158] [main] [c.g.h.l.i.c.LogFactory.setImplementation] - Logging initialized using 'class com.github.houbb.log.integration.adaptors.stdout.StdOutExImpl' adapter. 
  2. [INFO] [2021-10-05 11:54:12.164] [Thread-0] [c.g.h.r.c.c.RpcClient.run] - RPC 服務開始啟動客戶端 
  3. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelRegistered 
  4. 信息: [id: 0x4d75c580] REGISTERED 
  5. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler connect 
  6. 信息: [id: 0x4d75c580] CONNECT: /127.0.0.1:9527 
  7. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelActive 
  8. 信息: [id: 0x4d75c580, L:/127.0.0.1:54030 - R:/127.0.0.1:9527] ACTIVE 
  9. [INFO] [2021-10-05 11:54:13.403] [Thread-0] [c.g.h.r.c.c.RpcClient.run] - RPC 服務啟動客戶端完成,監聽端口:9527 
  10. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler write 
  11. 信息: [id: 0x4d75c580, L:/127.0.0.1:54030 - R:/127.0.0.1:9527] WRITE: 8B 
  12.          +-------------------------------------------------+ 
  13.          |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f | 
  14. +--------+-------------------------------------------------+----------------+ 
  15. |00000000| 00 00 00 01 00 00 00 02                         |........        | 
  16. +--------+-------------------------------------------------+----------------+ 
  17. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler flush 
  18. 信息: [id: 0x4d75c580, L:/127.0.0.1:54030 - R:/127.0.0.1:9527] FLUSH 
  19. [INFO] [2021-10-05 11:54:13.450] [nioEventLoopGroup-2-1] [c.g.h.r.c.c.RpcClient.channelActive] - [Client] request is :CalculateRequest{one=1, two=2} 
  20. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelRead 
  21. 信息: [id: 0x4d75c580, L:/127.0.0.1:54030 - R:/127.0.0.1:9527] READ: 5B 
  22.          +-------------------------------------------------+ 
  23.          |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f | 
  24. +--------+-------------------------------------------------+----------------+ 
  25. |00000000| 01 00 00 00 03                                  |.....           | 
  26. +--------+-------------------------------------------------+----------------+ 
  27. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelReadComplete 
  28. 信息: [id: 0x4d75c580, L:/127.0.0.1:54030 - R:/127.0.0.1:9527] READ COMPLETE 
  29. [INFO] [2021-10-05 11:54:13.508] [nioEventLoopGroup-2-1] [c.g.h.r.c.c.RpcClient.channelRead0] - [Client] response is :CalculateResponse{success=truesum=3} 

可以看到,輸出了對應的請求參數和響應結果。

當然,此時服務端也有對應的新增日志:

  1. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelRead 
  2. 信息: [id: 0xd399474f, L:/0:0:0:0:0:0:0:0:9527] READ: [id: 0xbc9f5927, L:/127.0.0.1:9527 - R:/127.0.0.1:54030] 
  3. 十月 05, 2021 11:54:13 上午 io.netty.handler.logging.LoggingHandler channelReadComplete 
  4. 信息: [id: 0xd399474f, L:/0:0:0:0:0:0:0:0:9527] READ COMPLETE 
  5. [INFO] [2021-10-05 11:54:13.432] [nioEventLoopGroup-2-1] [c.g.h.r.s.h.RpcServerHandler.channelActive] - [Server] channel {} connected 00e04cfffe360988-00001d34-00000001-2a80d950d8166c0c-bc9f5927 
  6. [INFO] [2021-10-05 11:54:13.495] [nioEventLoopGroup-2-1] [c.g.h.r.s.h.RpcServerHandler.channelRead0] - [Server] receive channel 00e04cfffe360988-00001d34-00000001-2a80d950d8166c0c-bc9f5927 request: CalculateRequest{one=1, two=2} from  
  7. [INFO] [2021-10-05 11:54:13.505] [nioEventLoopGroup-2-1] [c.g.h.r.s.h.RpcServerHandler.channelRead0] - [Server] channel 00e04cfffe360988-00001d34-00000001-2a80d950d8166c0c-bc9f5927 response CalculateResponse{success=truesum=3} 

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-10-14 08:39:17

Java Netty Java 基礎

2021-10-21 08:21:10

Java Reflect Java 基礎

2021-10-27 08:10:15

Java 客戶端 Java 基礎

2021-10-13 08:21:52

Java websocket Java 基礎

2021-10-20 08:05:18

Java 序列化 Java 基礎

2009-08-21 15:54:40

服務端與客戶端

2009-08-21 15:36:41

服務端與客戶端

2021-10-29 08:07:30

Java timeout Java 基礎

2010-03-18 17:47:07

Java 多客戶端通信

2023-11-17 09:13:36

2024-03-06 14:58:52

客戶端微服務架構

2009-08-21 15:59:22

服務端與客戶端通信

2009-08-21 16:14:52

服務端與客戶端通信

2011-09-09 09:44:23

WCF

2023-03-06 08:01:56

MySQLCtrl + C

2010-05-31 10:11:32

瘦客戶端

2014-06-01 11:03:13

VDI零客戶端

2023-04-03 08:13:05

MySQLCtrl + C

2010-11-19 14:22:04

oracle服務端

2013-05-09 09:33:59

點贊
收藏

51CTO技術棧公眾號

欧美激情性爽国产精品17p| 97精品视频在线观看自产线路二| 国产suv一区二区| 亚洲成人自拍| 91国偷自产一区二区开放时间| 91精品啪在线观看国产手机| 劲爆欧美第一页| 欧美第一黄色网| 成人短视频在线看| 免费激情视频网站| 日本美女一区二区三区| 久久影院资源网| 一本加勒比波多野结衣| 久久久精品一区二区毛片免费看| 国产精品福利电影一区二区三区四区| 99在线观看| 欧美一区二区三区久久久| 一二三区不卡| 一区二区三区四区在线观看视频| 日韩精品――色哟哟| 欧美电影h版| 亚洲国产精品一区二区久久恐怖片| 欧洲精品码一区二区三区免费看| 成人av无码一区二区三区| 日本不卡一区二区三区 | 欧美性猛交xxxx乱大交91| 2020国产在线| 一区二区在线观看av| 亚洲欧洲一区二区福利| 邻家有女韩剧在线观看国语| 成人中文字幕电影| 91亚洲精品久久久| 伊人久久成人网| 丝袜美腿亚洲一区| 日韩美女福利视频| 青青操免费在线视频| 欧美阿v一级看视频| 伊人激情综合网| 亚洲第一综合网| 美女精品一区最新中文字幕一区二区三区| 欧美电影免费观看完整版| 久久综合在线观看| 久久麻豆视频| 欧美色网一区二区| 九一精品在线观看| 吞精囗交69激情欧美| 欧美日韩国产专区| www.爱色av.com| 精精国产xxxx视频在线播放| 亚洲一区二区成人在线观看| 小泽玛利亚av在线| av在线播放国产| 亚洲欧洲精品成人久久奇米网| 日韩一区不卡| 97人人在线| 中文字幕一区二区三区视频| 伊人久久大香线蕉av一区| 午夜在线视频播放| 中文字幕在线不卡一区二区三区| 亚洲精品久久久久久一区二区| 国产在线高清| 国产精品黄色在线观看| 在线观看成人av| 国产婷婷视频在线| 亚洲综合色区另类av| 国产精品久久久久7777| 538视频在线| 日韩欧美精品网站| 欧美成人黄色网址| www.久久草.com| 国产精品秘入口| 日韩美女爱爱视频| 国产精品久久久久毛片| 久久av中文字幕片| 国产精品一区二区三区免费视频 | 91亚洲欧美| 中文字幕一区二区三区在线不卡 | 亚洲中字在线| 国产精品免费久久久久影院| 中文字幕在线观看免费| 国产一区二区剧情av在线| 成人自拍视频网站| 全国男人的天堂网| 国产欧美日韩视频在线观看| 影音先锋欧美资源| h片在线观看下载| 色哟哟精品一区| 国产传媒免费观看| 卡通动漫精品一区二区三区| 亚洲视频视频在线| 欧美 日韩 国产 一区二区三区| 黄色欧美成人| 国产精品免费久久久久影院| 朝桐光av在线一区二区三区| 国产亚洲制服色| 少妇久久久久久被弄到高潮| 国产精品伦理| 777a∨成人精品桃花网| chinese麻豆新拍video| heyzo久久| 国内外成人免费激情在线视频网站 | 国产精品v一区二区三区| 91精品国产色综合久久不卡98口| 中文字幕一区二区人妻| youjizz久久| 99精品一区二区三区的区别| 中文在线最新版地址| 91精品国产91久久久久久最新毛片| 在线天堂www在线国语对白| 91久久夜色精品国产按摩| 性欧美xxxx视频在线观看| 国产精品无码在线播放| 国产人伦精品一区二区| 无码 制服 丝袜 国产 另类| 欧美美女被草| 亚洲欧美另类人妖| 日本中文字幕免费观看| 精品一区二区三区免费视频| 热re99久久精品国99热蜜月| 97天天综合网| 日韩欧美亚洲一区二区| 国精产品视频一二二区| 久久一二三四| 99se婷婷在线视频观看| 国产原创精品视频| 欧美嫩在线观看| 成人国产精品久久久网站| 亚洲国产专区校园欧美| av一区二区三区四区电影| 麻豆视频在线播放| 欧美在线视频日韩| 精品人妻少妇嫩草av无码| 亚洲视频福利| 丁香婷婷久久久综合精品国产 | 日韩精品欧美大片| 欧美激情性做爰免费视频| 国产乱色精品成人免费视频| 国产精品沙发午睡系列990531| 亚洲精品无码久久久久久| 精品成人自拍视频| 国内精品久久久久久中文字幕 | 国产丝袜精品视频| 黄色一级片免费看| 不卡电影免费在线播放一区| 国产精品久久久久7777| 98视频精品全部国产| 欧美福利视频网站| 免费成人在线看| 99精品国产九九国产精品| 久9re热视频这里只有精品| 亚洲加勒比久久88色综合| 久草国产在线视频| 成人在线视频首页| 日本丰满少妇xxxx| 欧美a大片欧美片| 69视频在线播放| 免费在线高清av| 在线欧美日韩国产| 男女全黄做爰文章| 国产麻豆精品久久一二三| 黄色三级中文字幕| 麻豆一区二区| 国产精品福利在线观看网址| 成人免费视频| 这里只有精品免费| 久久久久成人网站| 91啪九色porn原创视频在线观看| 国产精品沙发午睡系列| 禁果av一区二区三区| 国产精品自产拍在线观看中文| 精精国产xxxx视频在线| 欧美哺乳videos| av网站中文字幕| 国产精品久久久久久久蜜臀| 欧美污在线观看| 亚洲一区二区三区免费在线观看| 日韩高清dvd| 国产一区精品二区| 韩国福利视频一区| 成人一区二区不卡免费| 91精品国产综合久久精品性色| 懂色av懂色av粉嫩av| 97久久精品人人澡人人爽| 日本www.色| 欧美亚韩一区| 日本免费高清一区二区| 韩国三级成人在线| 欧美洲成人男女午夜视频| 香蕉视频在线播放| 亚洲国产精品va| 最新中文字幕免费| 亚洲高清三级视频| 亚欧精品视频一区二区三区| 国产高清不卡一区二区| 国产精品免费成人| 欧美激情视频一区二区三区在线播放 | 成人自拍av| 久久成人精品一区二区三区| 西西人体44www大胆无码| 欧美日韩日日夜夜| 日韩免费视频一区二区视频在线观看| 国产精品免费久久久久| 丰满岳乱妇一区二区| 免费高清在线一区| 国产精品无码av在线播放| 天天做天天爱天天爽综合网| 精品一区二区三区自拍图片区| 国产一区一区| 国产精品久久久久久久9999| 国产蜜臀在线| 久久久国产视频| 国产在线视频网| 亚洲精品99久久久久| 国产区精品在线| 欧美视频一区二区| 日本a级c片免费看三区| 亚洲无线码一区二区三区| 欧美xxxooo| 中文字幕精品综合| 国产成人精品无码免费看夜聊软件| 国产成人欧美日韩在线电影| 欧美一级特黄aaa| 日本成人在线不卡视频| 男人操女人免费| 在线亚洲观看| 久久99久久99精品| 伊人天天综合| 免费在线黄网站| 亚洲欧美亚洲| 亚洲自拍偷拍一区二区三区| 色呦哟—国产精品| 天堂√在线观看一区二区| 免费看成人吃奶视频在线| 久久精品综合一区| 老牛精品亚洲成av人片| 国产日韩欧美一区二区| 91午夜精品| 国产精品12| 欧美影院精品| 97碰碰视频| 综合激情网...| 国产高清精品一区二区| 超碰在线一区| 国产日韩一区欧美| 欧美亚洲大陆| 欧美最大成人综合网| 欧美日韩亚洲在线观看| 性欧美大战久久久久久久免费观看 | 日韩欧美中文字幕精品| www.爱爱.com| 亚洲第一黄色网| 四虎影院在线播放| 亚洲美女精品久久| 国产高清av在线| 最近2019好看的中文字幕免费| av影片在线看| 久久久精品亚洲| 精品精品导航| 1769国内精品视频在线播放| 亚洲天堂电影| 国产精品99导航| 亚洲精品三区| 国产精品一区而去| 亚洲bt欧美bt精品777| 日韩欧美亚洲v片| 欧美日韩一二三四| 成人在线观看www| 亚洲毛片在线| 久久久精品麻豆| 国产精品原创巨作av| 国产在线不卡av| 国产欧美一区二区精品性色超碰| 国产精品视频在| 亚洲综合色自拍一区| chinese国产精品| 欧美日韩第一区日日骚| 欧洲精品久久一区二区| 亚洲天堂av图片| 色呦呦呦在线观看| 日韩av片免费在线观看| 精品视频在线观看免费观看| 国产视频在线观看一区| 精品视频99| 免费在线看黄色片| 日韩激情av在线| 亚洲 自拍 另类 欧美 丝袜| 91一区二区三区在线播放| 小泽玛利亚一区| 欧美日韩国内自拍| 国产欧美久久久精品免费| 亚洲激情在线视频| 国产一二区在线| 国产97人人超碰caoprom| 年轻的保姆91精品| 日本一区二区在线视频观看| 亚洲字幕久久| 午夜视频你懂的| 99久久夜色精品国产网站| 亚洲区一区二区三| 欧美色xxxx| 午夜老司机福利| 中文字幕亚洲自拍| 一区二区电影免费观看| 亚洲一区二区久久久久久| 国产精品入口久久| 18禁裸男晨勃露j毛免费观看| 美女mm1313爽爽久久久蜜臀| 好男人香蕉影院| 亚洲男人天堂av网| 中文字幕一区二区免费| 亚洲精品综合精品自拍| 久久一卡二卡| 国产一区二区香蕉| 狠狠做深爱婷婷综合一区| 妺妺窝人体色777777| 国产主播一区二区三区| 亚洲无人区码一码二码三码的含义| 亚洲成av人在线观看| 999免费视频| 久久精品国产电影| 丝袜美腿诱惑一区二区三区| 国内一区二区三区在线视频| 中文字幕免费精品| 日韩在线一区视频| 中文字幕+乱码+中文字幕一区| 中文字幕免费在线观看视频| 精品粉嫩aⅴ一区二区三区四区| 国产黄大片在线观看画质优化| 国产精品久久77777| 九九综合九九| 91黄色小网站| 337p粉嫩大胆噜噜噜噜噜91av| 日本一区二区欧美| 亚洲第一视频网| xxxcom在线观看| 丁香婷婷久久久综合精品国产| 欧美日韩国产欧| 苍井空张开腿实干12次| 亚洲综合清纯丝袜自拍| 精品免费久久久| 欧美激情中文字幕在线| 一区二区在线视频观看| 97碰在线视频| www.久久久久久久久| www.中文字幕在线观看| 亚洲男人第一网站| 玛雅亚洲电影| 午夜欧美性电影| 另类欧美日韩国产在线| 性生交大片免费全黄| 欧美一区二区三区在线观看| av中文字幕在线播放| 成人综合av网| 国产精品毛片一区二区三区| 亚洲永久无码7777kkk| 一本在线高清不卡dvd| 成人精品福利| 91精品久久久久久| 欧美精品观看| 欧美无人区码suv| 91久久线看在观草草青青| 在线观看av黄网站永久| 91视频-88av| 在线日韩av| japanese中文字幕| 欧美高清视频不卡网| 久久青青色综合| 久久久久综合一区二区三区| 日韩黄色小视频| 五月天激情丁香| 亚洲国产一区自拍| 成人黄色免费观看| 日本a级片在线观看| 99久久久国产精品| 瑟瑟视频在线免费观看| 欧美高清videos高潮hd| 色吊丝一区二区| 国产精品免费一区二区三区观看 | 日韩美女免费线视频| av一区二区高清| 免费观看黄网站| 欧美日韩免费一区| 免费a级在线播放| 风间由美久久久| 日本不卡一二三区黄网| 久久国产免费观看| 在线播放国产一区中文字幕剧情欧美 | 欧美日本精品一区二区三区| 毛片在线导航| 亚洲精品一区二区三区av| 成人午夜激情影院| 在线播放亚洲精品| 5278欧美一区二区三区| 国产精品成人a在线观看| 中文乱码人妻一区二区三区视频| 欧美日韩一区在线观看| av毛片午夜不卡高**水| 一区二区三区四区| 26uuu精品一区二区| 精品国产乱码久久久久久蜜臀网站|