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

Springboot+Netty+Websocket實現消息推送實例

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

[[380697]]

 前言

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

Netty框架的優勢

1.API使用簡單,開發門檻低;

2.功能強大,預置了多種編解碼功能,支持多種主流協議;

3.定制能力強,可以通過ChannelHandler對通信框架進行靈活地擴展;

4.性能高,通過與其他業界主流的NIO框架對比,Netty的綜合性能最優;

5.成熟、穩定,Netty修復了已經發現的所有JDK NIO BUG,業務開發人員不需要再為NIO的BUG而煩惱

提示:以下是本篇文章正文內容,下面案例可供參考

一、引入netty依賴

  1. <dependency> 
  2.    <groupId>io.netty</groupId> 
  3.    <artifactId>netty-all</artifactId> 
  4.    <version>4.1.48.Final</version> 
  5. </dependency> 

二、使用步驟

1.引入基礎配置類

  1. package com.test.netty; 
  2.  
  3. public enum Cmd { 
  4.  START("000""連接成功"), 
  5.  WMESSAGE("001""消息提醒"), 
  6.  ; 
  7.  private String cmd; 
  8.  private String desc
  9.  
  10.  Cmd(String cmd, String desc) { 
  11.   this.cmd = cmd; 
  12.   this.desc = desc
  13.  } 
  14.  
  15.  public String getCmd() { 
  16.   return cmd; 
  17.  } 
  18.  
  19.  public String getDesc() { 
  20.   return desc
  21.  } 

2.netty服務啟動監聽器

  1. package com.test.netty; 
  2.  
  3. import io.netty.bootstrap.ServerBootstrap; 
  4. import io.netty.channel.ChannelFuture; 
  5. import io.netty.channel.ChannelOption; 
  6. import io.netty.channel.EventLoopGroup; 
  7. import io.netty.channel.nio.NioEventLoopGroup; 
  8. import io.netty.channel.socket.nio.NioServerSocketChannel; 
  9. import lombok.extern.slf4j.Slf4j; 
  10. import org.springframework.beans.factory.annotation.Autowired; 
  11. import org.springframework.beans.factory.annotation.Value; 
  12. import org.springframework.boot.ApplicationRunner; 
  13. import org.springframework.context.annotation.Bean; 
  14. import org.springframework.stereotype.Component; 
  15.  
  16. /** 
  17.  * @author test 
  18.  * <p> 
  19.  * 服務啟動監聽器 
  20.  **/ 
  21. @Slf4j 
  22. @Component 
  23. public class NettyServer { 
  24.  
  25.  @Value("${server.netty.port}"
  26.  private int port; 
  27.  
  28.  @Autowired 
  29.  private ServerChannelInitializer serverChannelInitializer; 
  30.  
  31.  @Bean 
  32.  ApplicationRunner nettyRunner() { 
  33.   return args -> { 
  34.    //new 一個主線程組 
  35.    EventLoopGroup bossGroup = new NioEventLoopGroup(1); 
  36.    //new 一個工作線程組 
  37.    EventLoopGroup workGroup = new NioEventLoopGroup(); 
  38.    ServerBootstrap bootstrap = new ServerBootstrap() 
  39.      .group(bossGroup, workGroup) 
  40.      .channel(NioServerSocketChannel.class) 
  41.      .childHandler(serverChannelInitializer) 
  42.      //設置隊列大小 
  43.      .option(ChannelOption.SO_BACKLOG, 1024) 
  44.      // 兩小時內沒有數據的通信時,TCP會自動發送一個活動探測數據報文 
  45.      .childOption(ChannelOption.SO_KEEPALIVE, true); 
  46.    //綁定端口,開始接收進來的連接 
  47.    try { 
  48.     ChannelFuture future = bootstrap.bind(port).sync(); 
  49.     log.info("服務器啟動開始監聽端口: {}", port); 
  50.     future.channel().closeFuture().sync(); 
  51.    } catch (InterruptedException e) { 
  52.     e.printStackTrace(); 
  53.    } finally { 
  54.     //關閉主線程組 
  55.     bossGroup.shutdownGracefully(); 
  56.     //關閉工作線程組 
  57.     workGroup.shutdownGracefully(); 
  58.    } 
  59.   }; 
  60.  } 

3.netty服務端處理器

  1. package com.test.netty; 
  2.  
  3. import com.test.common.util.JsonUtil; 
  4. import io.netty.channel.Channel; 
  5. import io.netty.channel.ChannelHandler; 
  6. import io.netty.channel.ChannelHandlerContext; 
  7. import io.netty.channel.SimpleChannelInboundHandler; 
  8. import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; 
  9. import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; 
  10. import lombok.Data; 
  11. import lombok.extern.slf4j.Slf4j; 
  12. import org.springframework.beans.factory.annotation.Autowired; 
  13. import org.springframework.stereotype.Component; 
  14.  
  15. import java.net.URLDecoder; 
  16. import java.util.*; 
  17.  
  18. /** 
  19.  * @author test 
  20.  * <p> 
  21.  * netty服務端處理器 
  22.  **/ 
  23. @Slf4j 
  24. @Component 
  25. @ChannelHandler.Sharable 
  26. public class NettyServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { 
  27.  
  28.  @Autowired 
  29.  private ServerChannelCache cache; 
  30.  private static final String dataKey = "test="
  31.  
  32.  @Data 
  33.  public static class ChannelCache { 
  34.  } 
  35.  
  36.  
  37.  /** 
  38.   * 客戶端連接會觸發 
  39.   */ 
  40.  @Override 
  41.  public void channelActive(ChannelHandlerContext ctx) throws Exception { 
  42.   Channel channel = ctx.channel(); 
  43.   log.info("通道連接已打開,ID->{}......", channel.id().asLongText()); 
  44.  } 
  45.  
  46.  @Override 
  47.  public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 
  48.   if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) { 
  49.    Channel channel = ctx.channel(); 
  50.    WebSocketServerProtocolHandler.HandshakeComplete handshakeComplete = (WebSocketServerProtocolHandler.HandshakeComplete) evt; 
  51.    String requestUri = handshakeComplete.requestUri(); 
  52.    requestUri = URLDecoder.decode(requestUri, "UTF-8"); 
  53.    log.info("HANDSHAKE_COMPLETE,ID->{},URI->{}", channel.id().asLongText(), requestUri); 
  54.    String socketKey = requestUri.substring(requestUri.lastIndexOf(dataKey) + dataKey.length()); 
  55.    if (socketKey.length() > 0) { 
  56.     cache.add(socketKey, channel); 
  57.     this.send(channel, Cmd.DOWN_START, null); 
  58.    } else { 
  59.     channel.disconnect(); 
  60.     ctx.close(); 
  61.    } 
  62.   } 
  63.   super.userEventTriggered(ctx, evt); 
  64.  } 
  65.  
  66.  @Override 
  67.  public void channelInactive(ChannelHandlerContext ctx) throws Exception { 
  68.   Channel channel = ctx.channel(); 
  69.   log.info("通道連接已斷開,ID->{},用戶ID->{}......", channel.id().asLongText(), cache.getCacheId(channel)); 
  70.   cache.remove(channel); 
  71.  } 
  72.  
  73.  /** 
  74.   * 發生異常觸發 
  75.   */ 
  76.  @Override 
  77.  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 
  78.   Channel channel = ctx.channel(); 
  79.   log.error("連接出現異常,ID->{},用戶ID->{},異常->{}......", channel.id().asLongText(), cache.getCacheId(channel), cause.getMessage(), cause); 
  80.   cache.remove(channel); 
  81.   ctx.close(); 
  82.  } 
  83.  
  84.  /** 
  85.   * 客戶端發消息會觸發 
  86.   */ 
  87.  @Override 
  88.  protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { 
  89.   try { 
  90.    // log.info("接收到客戶端發送的消息:{}", msg.text()); 
  91.    ctx.channel().writeAndFlush(new TextWebSocketFrame(JsonUtil.toString(Collections.singletonMap("cmd""100")))); 
  92.   } catch (Exception e) { 
  93.    log.error("消息處理異常:{}", e.getMessage(), e); 
  94.   } 
  95.  } 
  96.  
  97.  public void send(Cmd cmd, String id, Object obj) { 
  98.   HashMap<String, Channel> channels = cache.get(id); 
  99.   if (channels == null) { 
  100.    return
  101.   } 
  102.   Map<String, Object> data = new LinkedHashMap<>(); 
  103.   data.put("cmd", cmd.getCmd()); 
  104.   data.put("data", obj); 
  105.   String msg = JsonUtil.toString(data); 
  106.   log.info("服務器下發消息: {}", msg); 
  107.   channels.values().forEach(channel -> { 
  108.    channel.writeAndFlush(new TextWebSocketFrame(msg)); 
  109.   }); 
  110.  } 
  111.  
  112.  public void send(Channel channel, Cmd cmd, Object obj) { 
  113.   Map<String, Object> data = new LinkedHashMap<>(); 
  114.   data.put("cmd", cmd.getCmd()); 
  115.   data.put("data", obj); 
  116.   String msg = JsonUtil.toString(data); 
  117.   log.info("服務器下發消息: {}", msg); 
  118.   channel.writeAndFlush(new TextWebSocketFrame(msg)); 
  119.  } 
  120.  

4.netty服務端緩存類

  1. package com.test.netty; 
  2.  
  3. import io.netty.channel.Channel; 
  4. import io.netty.util.AttributeKey; 
  5. import org.springframework.stereotype.Component; 
  6.  
  7. import java.util.HashMap; 
  8. import java.util.concurrent.ConcurrentHashMap; 
  9.  
  10. @Component 
  11. public class ServerChannelCache { 
  12.  private static final ConcurrentHashMap<String, HashMap<String, Channel>> CACHE_MAP = new ConcurrentHashMap<>(); 
  13.  private static final AttributeKey<String> CHANNEL_ATTR_KEY = AttributeKey.valueOf("test"); 
  14.  
  15.  public String getCacheId(Channel channel) { 
  16.   return channel.attr(CHANNEL_ATTR_KEY).get(); 
  17.  } 
  18.  
  19.  public void add(String cacheId, Channel channel) { 
  20.   channel.attr(CHANNEL_ATTR_KEY).set(cacheId); 
  21.   HashMap<String, Channel> hashMap = CACHE_MAP.get(cacheId); 
  22.   if (hashMap == null) { 
  23.    hashMap = new HashMap<>(); 
  24.   } 
  25.   hashMap.put(channel.id().asShortText(), channel); 
  26.   CACHE_MAP.put(cacheId, hashMap); 
  27.  } 
  28.  
  29.  public HashMap<String, Channel> get(String cacheId) { 
  30.   if (cacheId == null) { 
  31.    return null
  32.   } 
  33.   return CACHE_MAP.get(cacheId); 
  34.  } 
  35.  
  36.  public void remove(Channel channel) { 
  37.   String cacheId = getCacheId(channel); 
  38.   if (cacheId == null) { 
  39.    return
  40.   } 
  41.   HashMap<String, Channel> hashMap = CACHE_MAP.get(cacheId); 
  42.   if (hashMap == null) { 
  43.    hashMap = new HashMap<>(); 
  44.   } 
  45.   hashMap.remove(channel.id().asShortText()); 
  46.   CACHE_MAP.put(cacheId, hashMap); 
  47.  } 

5.netty服務初始化器

  1. package com.test.netty; 
  2.  
  3. import io.netty.channel.ChannelInitializer; 
  4. import io.netty.channel.ChannelPipeline; 
  5. import io.netty.channel.socket.SocketChannel; 
  6. import io.netty.handler.codec.http.HttpObjectAggregator; 
  7. import io.netty.handler.codec.http.HttpServerCodec; 
  8. import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; 
  9. import io.netty.handler.stream.ChunkedWriteHandler; 
  10. import org.springframework.beans.factory.annotation.Autowired; 
  11. import org.springframework.stereotype.Component; 
  12.  
  13. /** 
  14.  * @author test 
  15.  * <p> 
  16.  * netty服務初始化器 
  17.  **/ 
  18. @Component 
  19. public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> { 
  20.  
  21.  @Autowired 
  22.  private NettyServerHandler nettyServerHandler; 
  23.  
  24.  @Override 
  25.  protected void initChannel(SocketChannel socketChannel) throws Exception { 
  26.   ChannelPipeline pipeline = socketChannel.pipeline(); 
  27.   pipeline.addLast(new HttpServerCodec()); 
  28.   pipeline.addLast(new ChunkedWriteHandler()); 
  29.   pipeline.addLast(new HttpObjectAggregator(8192)); 
  30.   pipeline.addLast(new WebSocketServerProtocolHandler("/test.io"true, 5000)); 
  31.   pipeline.addLast(nettyServerHandler); 
  32.  } 

6.html測試

  1. <!DOCTYPE HTML> 
  2. <html> 
  3.  <head> 
  4.  <meta charset="utf-8"
  5.  <title>test</title> 
  6.   
  7.   <script type="text/javascript"
  8.    function WebSocketTest() 
  9.    { 
  10.    if ("WebSocket" in window) 
  11.    { 
  12.     alert("您的瀏覽器支持 WebSocket!"); 
  13.      
  14.     // 打開一個 web socket 
  15.     var ws = new WebSocket("ws://localhost:port/test.io"); 
  16.      
  17.     ws.onopen = function() 
  18.     { 
  19.      // Web Socket 已連接上,使用 send() 方法發送數據 
  20.      ws.send("發送數據"); 
  21.      alert("數據發送中..."); 
  22.     }; 
  23.      
  24.     ws.onmessage = function (evt)  
  25.     {  
  26.      var received_msg = evt.data; 
  27.      alert("數據已接收..."); 
  28.     }; 
  29.      
  30.     ws.onclose = function() 
  31.     {  
  32.      // 關閉 websocket 
  33.      alert("連接已關閉...");  
  34.     }; 
  35.    } 
  36.     
  37.    else 
  38.    { 
  39.     // 瀏覽器不支持 WebSocket 
  40.     alert("您的瀏覽器不支持 WebSocket!"); 
  41.    } 
  42.    } 
  43.   </script> 
  44.    
  45.  </head> 
  46.  <body> 
  47.   
  48.   <div id="sse"
  49.    <a href="javascript:WebSocketTest()" rel="external nofollow" >運行 WebSocket</a> 
  50.   </div> 
  51.    
  52.  </body> 
  53. </html> 

 7.vue測試

  1. mounted() { 
  2.    this.initWebsocket(); 
  3.   }, 
  4.   methods: { 
  5.    initWebsocket() { 
  6.     let websocket = new WebSocket('ws://localhost:port/test.io?test=123456'); 
  7.     websocket.onmessage = (event) => { 
  8.      let msg = JSON.parse(event.data); 
  9.      switch (msg.cmd) { 
  10.       case "000"
  11.        this.$message({ 
  12.         type: 'success'
  13.         message: "建立實時連接成功!"
  14.         duration: 1000 
  15.        }) 
  16.        setInterval(()=>{websocket.send("heartbeat")},60*1000); 
  17.        break; 
  18.       case "001"
  19.        this.$message.warning("收到一條新的信息,請及時查看!"
  20.        break; 
  21.      } 
  22.     } 
  23.     websocket.onclose = () => { 
  24.      setTimeout(()=>{ 
  25.       this.initWebsocket(); 
  26.      },30*1000); 
  27.     } 
  28.     websocket.onerror = () => { 
  29.      setTimeout(()=>{ 
  30.       this.initWebsocket(); 
  31.      },30*1000); 
  32.     } 
  33.    }, 
  34.   }, 
  35. ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210107160420568.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1X3Fpbmdfc29uZw==,size_16,color_FFFFFF,t_70#pic_center) 

8.服務器下發消息

  1. @Autowired 
  2.  private NettyServerHandler nettyServerHandler; 
  3. nettyServerHandler.send(CmdWeb.WMESSAGE, id, message); 

到此這篇關于Springboot+Netty+Websocket實現消息推送實例的文章就介紹到這了希望大家以后多多支持麥叔!

 

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

2024-08-02 09:00:17

NettyWebSocketNIO

2021-03-26 08:16:32

SpringbootWebsocket前端

2021-03-25 08:29:33

SpringBootWebSocket即時消息

2023-08-14 08:01:12

websocket8g用戶

2024-09-02 09:31:19

2024-09-12 14:50:08

2022-06-28 08:37:07

分布式服務器WebSocket

2024-11-14 11:56:45

2025-07-01 07:34:03

2013-05-17 15:34:45

2025-06-30 01:45:00

Netty輪詢HTTP 協議

2023-07-26 07:28:55

WebSocket服務器方案

2024-09-11 08:35:54

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2023-08-09 08:01:00

WebSockett服務器web

2017-07-11 13:58:10

WebSocket

2023-01-13 00:02:41

2023-01-05 09:17:58

2024-04-07 09:41:18

SignalR實時通信開發

2023-09-19 15:33:50

Web實時消息推送
點贊
收藏

51CTO技術棧公眾號

男人天堂亚洲天堂| 国产xxxx在线观看| 日韩欧美自拍| 日韩欧美123| 37pao成人国产永久免费视频| 91福利在线视频| 国产一区二区三区视频在线播放| 久久久久久国产精品| 日本少妇高潮喷水xxxxxxx| 国产精品一区二区三区av | 美女mm1313爽爽久久久蜜臀| 蜜臀久久99精品久久久无需会员 | 在线免费观看黄| 粉嫩蜜臀av国产精品网站| 热久久这里只有| 激情五月婷婷在线| 日韩.com| 亚洲欧美日韩一区二区在线 | 精品在线网站观看| 欧美日本一区二区在线观看| 国产美女三级视频| 欧美aaa免费| 国产精品久久久一本精品 | 午夜精品久久| 中文字幕不卡在线视频极品| 亚洲一二三四五| 日韩成人在线一区| 欧洲av一区二区嗯嗯嗯啊| 男人插女人视频在线观看| 欧美激情黑人| 国产精品色婷婷久久58| 蜜桃日韩视频| 五月婷婷开心中文字幕| 国产高清久久久久| 91久久精品美女| 最近中文字幕免费在线观看| 亚洲伊人观看| 97超碰国产精品女人人人爽| 少妇久久久久久被弄高潮| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美一区二区啪啪| 在线视频观看一区二区| 精品国产黄a∨片高清在线| 色婷婷综合激情| 六月丁香婷婷激情| 美女91在线看| 黑人精品xxx一区一二区| 91精品国产91久久久久麻豆 主演| 麻豆视频在线观看免费| 国产精品国产三级国产普通话99| 日韩精品不卡| aaa在线观看| 国产精品视频一二三区 | 国产福利第一视频在线播放| 久久夜色精品国产噜噜av| 精品视频在线观看| 午夜福利视频一区二区| 99re成人精品视频| 九色综合婷婷综合| 黄色av免费在线观看| 久久精品夜夜夜夜久久| 日本10禁啪啪无遮挡免费一区二区| 天天舔天天干天天操| 91看片淫黄大片一级在线观看| 美女一区视频| 国产原创av在线| 中文在线资源观看网站视频免费不卡 | 粉嫩一区二区三区四区公司1| 精品久久久久一区| 中文字幕免费高清视频| 日韩极品少妇| 亚洲欧美日韩在线高清直播| 免费看裸体网站| 91麻豆精品国产91久久久平台| 最近日韩中文字幕中文| 希岛爱理中文字幕| aa国产精品| 国产精品成av人在线视午夜片 | 免费成人美女在线观看.| 国产欧美一区二区三区在线看| 国产精品久久久久久69| 国产suv一区二区三区88区| 国产传媒一区二区| 亚洲欧美丝袜中文综合| 国产日韩高清在线| 色哟哟免费网站| 白浆视频在线观看| 色综合久久精品| 久久精品一卡二卡| 人妖一区二区三区| www日韩中文字幕在线看| www日韩在线| 欧美日韩精品| 日韩免费精品视频| 99精品国产99久久久久久97| 波多野结衣视频一区| 欧洲在线视频一区| 午夜羞羞小视频在线观看| 欧美视频一二三| 欧美专区第二页| 免费不卡中文字幕在线| 欧美成人激情视频免费观看| 国产一区二区99| 韩国av一区二区三区| 精品一区二区三区国产| 麻豆影视国产在线观看| 丁香五六月婷婷久久激情| 一区二区久久精品| 欧美三级午夜理伦三级小说| 久久精品99无色码中文字幕| 国产91精品一区| 国产风韵犹存在线视精品| 欧美日韩电影一区二区| 波多野结衣精品| 欧美日韩在线三级| 天天插天天射天天干| 亚洲国产老妈| 国产美女久久精品香蕉69| 亚洲av毛片成人精品| 一区二区三区加勒比av| 中文字幕亚洲乱码| 夜夜躁狠狠躁日日躁2021日韩| 欧美日本黄视频| 中文字幕免费播放| 久久久久久久网| 人人妻人人澡人人爽欧美一区双 | 精品久久久久av影院| av资源在线免费观看| 久久国产直播| 精品久久久久久综合日本| 色老头在线观看| 欧美日韩色综合| 蜜桃久久精品成人无码av| 中日韩视频在线观看| 国产精选一区二区| 日韩欧美一起| 日韩精品专区在线| 国产精品视频一区二区三| 麻豆91精品视频| 婷婷四月色综合| 日本另类视频| 伊人久久五月天| 国产免费www| 亚洲国产经典视频| 亚洲色图久久久| 人人狠狠综合久久亚洲婷| 奇米成人av国产一区二区三区| 四虎永久在线观看| 欧美日韩视频在线| 内射中出日韩无国产剧情| 国产亚洲精品v| 欧美另类一区| 姬川优奈av一区二区在线电影| 亚洲美女免费精品视频在线观看| 亚洲综合久久网| 日本一区二区三区dvd视频在线| 国产97色在线 | 日韩| 国产亚洲欧美日韩在线观看一区二区| 青青久久aⅴ北条麻妃| 久久久久久久影视| 欧美三级资源在线| 激情五月激情综合| 国产精品资源在线观看| 野外做受又硬又粗又大视频√| 国产欧美三级电影| 国产成人精品网站| 一广人看www在线观看免费视频| 欧美日韩一区二区在线观看 | 午夜精品久久久久久久久| 日本黄色片在线播放| 久久高清一区| 在线免费观看一区二区三区| 日韩精品亚洲专区在线观看| 国语自产精品视频在免费| 你懂的好爽在线观看| 欧美日韩激情一区二区三区| 国产传媒免费在线观看| 国产激情一区二区三区桃花岛亚洲 | h视频网站在线观看| 91精品视频网| 亚洲欧美在线视频免费| 日本一区二区三区在线不卡| 久久精品无码一区二区三区毛片 | 中文字幕第21页| 亚洲精品成人影院| 久久99精品久久久久子伦| 成人福利一区二区| 欧美精品久久一区二区| 国产视频第一区| 欧美成人高清电影在线| 无码人妻久久一区二区三区 | 榴莲视频成人app| 8x拔播拔播x8国产精品| 午夜视频在线观看网站| 亚洲精品一区二区精华| 在线观看国产精品入口男同| 亚洲高清不卡在线观看| 91视频免费看片| 不卡视频免费播放| 国产探花在线看| 国产欧美三级| 99视频精品全部免费看| 欧美a大片欧美片| 亚洲a区在线视频| 91精品xxx在线观看| 欧美大片第1页| seseavlu视频在线| 日韩电影中文字幕在线| 国产美女无遮挡永久免费| 色呦呦网站一区| 五月天婷婷网站| 亚洲天堂中文字幕| 91动漫免费网站| 久久毛片高清国产| 亚洲婷婷在线观看| 国产精品一二三| 91 在线视频观看| 久久午夜电影| 国产成人在线免费看| 亚洲午夜av| 四虎影院一区二区| 成人高清电影网站| 欧美日韩精品免费观看视一区二区| 日本成人手机在线| 91精品久久久久久久久青青 | 欧美综合在线视频| 亚洲第一精品在线观看| 亚洲成人tv网| 久久久久久久蜜桃| 亚洲欧美色图小说| 懂色av蜜臀av粉嫩av永久| 久久久精品tv| 成人性生交大免费看| 91碰在线视频| 欧美 日本 国产| 99久久er热在这里只有精品15| 香蕉在线观看视频| 国产.欧美.日韩| 波多野吉衣在线视频| 国产精品亚洲一区二区三区在线| 久久6免费视频| 国产做a爰片久久毛片| 久热在线视频观看| 激情久久五月天| 欧美激情第四页| 成人性生交大片免费 | 欧美高清在线一区二区| 亚欧洲乱码视频| 久久精品亚洲精品国产欧美kt∨| 亚洲一区二区观看| 久久久久久久久久久电影| 欧美特级黄色录像| 欧美激情一区二区三区在线| 免费视频91蜜桃| 中文字幕av一区二区三区| 中文字幕在线观看二区| 亚洲欧美日本韩国| 国产亚洲精品码| 午夜亚洲国产au精品一区二区| 亚洲欧美在线观看视频| 日韩欧美亚洲国产一区| 波多野结衣午夜| 7777女厕盗摄久久久| 超碰在线观看99| 亚洲福利视频久久| 美女毛片在线看| 色黄久久久久久| 直接在线观看的三级网址| 久久人人97超碰精品888| 欧美私密网站| 国产精品综合不卡av| 国产精品亚洲欧美日韩一区在线| 国产精品.com| 精品国产精品国产偷麻豆| 特级西西444| 久久激情中文| 手机在线国产视频| 成人国产在线观看| 久久国产柳州莫菁门| 亚洲日本电影在线| 国产精品午夜影院| 欧美日韩久久不卡| 五月婷中文字幕| 久久精品成人欧美大片古装| 91九色美女在线视频| 国产精品白丝jk喷水视频一区| 日本免费一区二区三区视频| 麻豆成人av| 偷偷www综合久久久久久久| 激情五月六月婷婷| 日日骚欧美日韩| 美女被爆操网站| 国产日本欧美一区二区| 精品99在线观看| 欧美日韩在线精品一区二区三区激情 | 日本女人性生活视频| 亚洲午夜免费福利视频| 亚洲精品毛片一区二区三区| 日韩免费视频一区| 都市激情一区| 97在线视频免费观看| 色综合视频一区二区三区日韩| 国产欧美日韩综合一区在线观看 | 欧美激情精品久久久久久久变态 | 蜜臀久久99精品久久久画质超高清| 杨幂一区二区国产精品| 欧美高清在线视频| 精品美女久久久久| 91麻豆精品国产91久久久更新时间 | 成人av一级片| 国产成人a级片| 日本二区三区视频| 91精品福利在线| 神宫寺奈绪一区二区三区| 久久亚洲精品成人| 91精品美女| 欧洲亚洲一区| 模特精品在线| 中国一级特黄录像播放| 亚洲主播在线播放| 国产熟女一区二区丰满| 一区二区三区国产在线观看| 亚洲黄色免费看| 国产一区二区三区四区hd | 无码人妻丰满熟妇区96| 国产成人鲁色资源国产91色综| 国产免费嫩草影院| 在线观看av一区二区| 色视频精品视频在线观看| 国内精品美女av在线播放| 伊人精品综合| 美女av免费观看| 国产东北露脸精品视频| 国产探花在线免费观看| 91精品视频网| 3d玉蒲团在线观看| 亚洲精品日韩激情在线电影| 天天综合精品| 国产男女无遮挡猛进猛出| 中文字幕亚洲一区二区va在线| 中文字幕永久免费视频| 综合欧美国产视频二区| 免费一区二区三区四区| 亚洲一区二区三区免费观看| 美国一区二区三区在线播放| 亚洲精品视频网址| 欧美三级视频在线观看 | 欧美精品在线第一页| 激情久久免费视频| 高清无码一区二区在线观看吞精| 国产精品888| 精品无码人妻一区二区三区品| 欧美成人乱码一区二区三区| h片在线观看| 欧美精品一区二区视频 | 欧美日韩免费区域视频在线观看| 少妇精品高潮欲妇又嫩中文字幕| 91精品国产色综合| 一区二区三区视频免费观看| 成人久久久久久久久| 亚洲国产高清不卡| av中文在线观看| 久久久免费av| 婷婷成人在线| 日本美女高潮视频| 亚洲三级在线看| 日本黄视频在线观看| 欧美在线xxx| 欧美wwwww| 亚洲女则毛耸耸bbw| 欧美日韩美女在线| 色综合久久影院| 99久久精品无码一区二区毛片| 日韩视频在线一区二区三区| 亚洲第一成人网站| 这里只有精品电影| 久久久男人天堂| 亚洲精品永久www嫩草| 国产精品综合一区二区三区| 欧美亚韩一区二区三区| 中文字幕日韩欧美精品在线观看| 人人爱人人干婷婷丁香亚洲| 欧美s码亚洲码精品m码| 中文字幕一区在线| 好吊色一区二区三区| 国产福利精品视频| 欧美精品成人| 日韩av片在线| 亚洲国产婷婷香蕉久久久久久| 欧美与亚洲与日本直播| youjizz.com在线观看| 国产日韩高清在线| 日本激情一区二区| 国产欧美精品va在线观看| 亚洲经典在线| chinese全程对白| 亚洲欧美在线一区二区| 伊人www22综合色| 在线能看的av网站| 黄色精品一区二区|