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

91久久国产综合久久91猫猫| 欧美精品videossex性护士| 男人添女人下部视频免费| 中文字幕在线2019| 欧美日韩免费| 亚洲男人天堂久| 国产一级爱c视频| 男人天堂亚洲二区| 一本一道久久a久久精品蜜桃| 日韩欧美的一区| 欧美成人免费高清视频| 最新国产在线观看| 成人国产精品免费观看动漫| 7m精品福利视频导航| 欧美激情 一区| 国产精品对白| 欧美人成免费网站| 国产91xxx| 大片免费在线观看| 成人av在线资源网站| 国产人妖伪娘一区91| 自拍偷拍欧美亚洲| 国产精品久久久久无码av| 亚洲精品视频中文字幕| 人妻换人妻仑乱| 国产高清不卡| 亚洲一区二区在线观看视频 | 中文字幕免费高| 视频二区在线| 国产老肥熟一区二区三区| 欧美在线视频观看免费网站| 久久黄色小视频| 久久亚洲国产| 日韩高清免费在线| 久久6免费视频| 99久久精品一区二区成人| 高潮白浆女日韩av免费看| 无码人妻精品一区二区蜜桃百度| av在线电影观看| av电影一区二区| 福利视频久久| 最近日韩免费视频| 99tv成人| 亚洲老头同性xxxxx| 亚洲av永久无码精品| 国产麻豆精品| 欧美一区二区在线看| 国产乱子夫妻xx黑人xyx真爽| 国产精品ⅴa有声小说| 99精品桃花视频在线观看| 成人免费观看a| 艳妇乳肉豪妇荡乳av无码福利| 欧美亚洲自偷自偷| 欧美亚洲国产成人精品| 久久中文免费视频| 天天插综合网| 久久亚洲精品一区二区| 亚洲精品午夜视频| 猛男gaygay欧美视频| 欧美成va人片在线观看| 亚洲精品国产久| 精品国产一级| 欧美一个色资源| 波多野结衣三级视频| 成人在线精品| 欧美巨大另类极品videosbest | 亚洲欧美国产一本综合首页| 中文字幕99页| 欧美巨大xxxx| 亚洲欧洲国产一区| 谁有免费的黄色网址| 禁断一区二区三区在线| 在线视频一区二区| 色哟哟一一国产精品| 亚洲一区二区三区| 色综合视频一区中文字幕| 久久久久久国产精品视频| 欧美a级成人淫片免费看| 久久精品在线视频| 一区二区三区影视| 国产伊人精品| 97热精品视频官网| 日韩精品一区二区亚洲av| 日av在线不卡| 久久久久久久一区二区三区| 国产一级淫片久久久片a级| 小小影院久久| 性欧美办公室18xxxxhd| 免费视频91蜜桃| 中文字幕一区二区av| 欧美大码xxxx| 国产午夜精品无码| 亚洲在线网站| 成人日韩av在线| 亚洲伦理在线观看| 国产日韩欧美在线一区| japanese在线播放| 韩国日本一区| 婷婷综合另类小说色区| 性欧美大战久久久久久久| 成人黄色毛片| 亚洲精品91美女久久久久久久| 艳妇乳肉亭妇荡乳av| 成人激情视频| 97视频网站入口| 一个人看的www日本高清视频| 大桥未久av一区二区三区中文| 日本午夜一区二区三区| 1stkiss在线漫画| 色综合久久99| 娇妻高潮浓精白浆xxⅹ| 日韩88av| 2019av中文字幕| 国产精品国产一区二区三区四区 | 久久www人成免费看片中文| 色视频成人在线观看免| www.51色.com| 欧美色婷婷久久99精品红桃| 久久久久久久久国产精品| 中日韩av在线| 久久精品免视看| 成人一区二区免费视频| 六九午夜精品视频| 亚洲欧美一区二区精品久久久| 欧美一级特黄高清视频| 国产视频欧美| αv一区二区三区| av男人的天堂在线| 色丁香久综合在线久综合在线观看| 欧美图片自拍偷拍| 成人同人动漫免费观看| 91精品国产高清| 国产麻豆一精品一男同| 国产欧美日韩另类视频免费观看| 国产制服91一区二区三区制服| 69堂免费精品视频在线播放| 亚洲精品福利在线观看| 91在线播放观看| 精品一区二区国语对白| 日韩电影免费观看在| 欧美gay视频| 亚洲精品视频久久| 日韩视频在线观看一区| 91在线精品一区二区三区| 中文字幕一区二区三区在线乱码| 电影久久久久久| 亚洲视频日韩精品| 69xxxx国产| 久久麻豆一区二区| 毛片在线播放视频| 国内精品免费| 欧美成人免费小视频| 国产又黄又粗又硬| 国产精品理论在线观看| www.日日操| 精品视频免费| 奇米成人av国产一区二区三区| 天堂v视频永久在线播放| 粉嫩老牛aⅴ一区二区三区| 国产精品无码专区| 一本色道久久综合| 欧美精品一区二区三区在线四季| 91禁在线看| 亚洲精品一区在线观看香蕉| 国产一级在线观看视频| 成人精品免费看| 亚洲熟妇无码另类久久久| 欧美高清视频看片在线观看 | 一本色道久久99精品综合| 韩国理伦片久久电影网| 综合av色偷偷网| 国产精品久久久久久久久久久久久久久久久久 | 热色播在线视频| 亚洲天堂2020| 中文字幕有码视频| 亚洲精品欧美专区| 蜜臀av粉嫩av懂色av| 亚洲综合激情| 欧美不卡福利| 亚洲我射av| 久久久久女教师免费一区| 国产福利免费视频| 午夜电影网一区| 人妻精品久久久久中文字幕| 免费看欧美美女黄的网站| 99中文字幕在线观看| 激情小说亚洲色图| 青青精品视频播放| 成人免费看片| 亚洲男人天堂九九视频| 国产又粗又黄又爽| 精品福利一区二区| 国产中年熟女高潮大集合| 精品综合免费视频观看| 国产精品国产亚洲精品看不卡| 国产一区二区三区四区五区传媒| 国产精品男女猛烈高潮激情| 羞羞视频在线免费国产| 日韩精品视频在线观看免费| 91国内精品视频| 亚洲一区二区三区中文字幕 | 中文字幕在线不卡| 国产成人av免费观看| 国产精品久久| 一个色的综合| 日韩极品少妇| 91亚洲人电影| 成人不卡视频| 91高清免费视频| 色呦呦网站在线观看| 国产亚洲欧美日韩一区二区| 国产成a人亚洲精v品无码| 在线视频综合导航| 亚洲国产精品免费在线观看| 国产色一区二区| 玖玖爱在线精品视频| 国产一区二区精品久久91| 国产三级三级三级看三级| 伊人久久亚洲美女图片| 在线视频不卡一区二区| 西瓜成人精品人成网站| 国产精品免费看一区二区三区| 巨胸喷奶水www久久久| 91精品国产乱码久久久久久蜜臀 | 亚洲国产中文在线二区三区免| 国产精品久久久久999| 无码小电影在线观看网站免费| 久久五月天色综合| 欧美成人性生活视频| 国产一区二区三区高清在线观看| 天天爱天天干天天操| 欧美日韩小视频| 国产精品自拍第一页| 亚洲一区二区四区蜜桃| 免费日韩在线视频| 国产三级三级三级精品8ⅰ区| 亚洲av成人精品一区二区三区| 国产91精品久久久久久久网曝门| 欧美国产日韩另类 | 伊人成人免费视频| 蜜芽一区二区三区| 欧美自拍小视频| 日韩电影一区二区三区四区| 欧美国产亚洲一区| 国产亚洲精品v| 免费观看国产精品视频| 99成人免费视频| 北条麻妃在线视频观看| 一区免费在线| 丁香婷婷综合激情| 亚洲大黄网站| 777久久久精品一区二区三区| 国产亚洲在线观看| 无罩大乳的熟妇正在播放| 99riav1国产精品视频| 免费无码国产v片在线观看| 亚洲区一区二| 久久精品国产精品亚洲色婷婷| 国产亚洲高清视频| 欧美伦理片在线看| 琪琪一区二区三区| 国产精品免费成人| 日本不卡中文字幕| 一级黄色大片儿| 精品一区二区影视| the porn av| 美女mm1313爽爽久久久蜜臀| 蜜桃免费在线视频| 国产一区中文字幕| 香蕉视频污视频| 久久精品人人做| 国产日产精品一区二区三区的介绍| 国产精品久久夜| 69av.com| 精品欧美aⅴ在线网站| 无码人妻av免费一区二区三区| 欧美日韩成人激情| 肥臀熟女一区二区三区| 亚洲欧美在线免费观看| 国产69精品久久app免费版| 色偷偷av亚洲男人的天堂| 草草影院在线观看| 美日韩精品免费视频| 久久男人av资源站| 国产剧情日韩欧美| 99综合99| 欧美一二三区| 欧美高清一区| 国产欧美在线一区| 精品一区二区在线看| 亚洲精品在线视频免费观看| 中文一区二区在线观看| 欧美日韩国产精品一区二区三区| 亚洲综合久久久久| 69亚洲精品久久久蜜桃小说| 欧美一区二区三区日韩| 三级av在线播放| 欧美成人精品一区| 最新日韩一区| av噜噜色噜噜久久| 青青一区二区三区| 日韩一级片免费视频| 免费在线一区观看| www.免费av| 亚洲精品日韩综合观看成人91| 日韩高清精品免费观看| 欧美日韩高清在线| 日韩亚洲视频在线观看| 上原亚衣av一区二区三区| 老司机深夜福利在线观看| 成人网中文字幕| 精品国产一区二区三区| 国产毛片久久久久久国产毛片| 日韩精品免费专区| 人妻体内射精一区二区三区| 亚洲视频在线观看一区| 精品无码一区二区三区的天堂| 亚洲第一区在线观看| 黄网站免费在线播放| 欧美在线亚洲在线| 国产精品毛片视频| 亚洲精品天堂成人片av在线播放| 欧美aaa在线| 中文字幕一区二区人妻在线不卡 | 伊人久久综合97精品| 免费在线小视频| 18成人在线| 特黄特色欧美大片| 日韩成人午夜影院| 国产主播一区二区三区| 88久久精品无码一区二区毛片| 亚洲成在人线在线播放| www.国产黄色| 欧美精品一二区| www.成人| 日韩精品一区二区三区电影| 韩国女主播成人在线| 亚洲不卡的av| 欧美日本在线播放| 欧美成人xxx| 日韩美女在线播放| 西野翔中文久久精品国产| 欧美性大战久久久久xxx | 国产亚洲一区二区三区在线播放| 中文字幕一区二区三区乱码图片| 香蕉视频999| 亚洲特黄一级片| 国产区精品在线| 欧美xxxx14xxxxx性爽| 日韩精品免费视频一区二区三区| 先锋影音欧美| 久久97超碰国产精品超碰| 免费黄色国产视频| 欧美精品 日韩| av官网在线播放| 成人av男人的天堂| 99热这里只有精品8| 亚洲午夜福利在线观看| 亚洲午夜成aⅴ人片| 在线观看xxx| 国产91精品青草社区| 免费欧美视频| 无码无遮挡又大又爽又黄的视频| 国产亚洲短视频| 一区二区精品视频在线观看| 美日韩在线视频| 欧美一性一交| 日本成人黄色网| 最新国产精品久久精品| 午夜免费福利视频| 欧美一区三区三区高中清蜜桃| 黑丝美女一区二区| 香蕉视频xxx| 亚洲1区2区3区视频| 天堂а√在线8种子蜜桃视频| 国产精品久久久久久久久久久新郎| 久久精品影视| 久久久无码人妻精品无码| 狠狠干狠狠久久| 91caoporm在线视频| 成人亚洲欧美一区二区三区| 91精品观看| 中文字幕日韩三级片| 欧美日韩在线免费视频| 视频在线这里都是精品| 茄子视频成人在线观看| 国产一区二区三区在线看麻豆| 圆产精品久久久久久久久久久| 一本一道久久a久久精品逆3p| 日韩大尺度黄色| 欧美黄色免费网址| 国产亚洲一区二区三区四区| 中文字幕网址在线| 久色乳综合思思在线视频| 一区二区亚洲视频| 午夜视频在线瓜伦| 亚洲一区二区精品视频| 成人国产在线看| 看黄网站在线观看| 国语自产精品视频在免费|