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

SpringBoot使用WebSocket實現即時消息

開發 前端
本篇給大家介紹SpringBoot使用WebSocket實現即時消息,希望能夠幫助到你!

[[389469]]

 環境:SpringBoot2.3.9.RELEASE

依賴

  1. <dependency> 
  2.         <groupId>org.springframework.boot</groupId> 
  3.         <artifactId>spring-boot-starter-web</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.         <groupId>org.springframework.boot</groupId> 
  7.         <artifactId>spring-boot-starter-websocket</artifactId> 
  8. </dependency> 

定義消息類型

抽象消息對象

  1. public class AbstractMessage { 
  2.     /** 
  3.      *  消息類型 
  4.      */ 
  5.     protected String type ; 
  6.      
  7.     /** 
  8.      *  消息內容 
  9.      */ 
  10.     protected String content ; 
  11.     /** 
  12.      *  消息日期 
  13.      */ 
  14.     protected String date ; 

消息對象子類

1、Ping檢查消息

  1. public class PingMessage extends AbstractMessage { 
  2.     public PingMessage() {} 
  3.     public PingMessage(String type) { 
  4.         this.type = type ; 
  5.     } 

 2、系統消息

  1. public class SystemMessage extends AbstractMessage { 
  2.     public SystemMessage() {} 
  3.     public SystemMessage(String type, String content) { 
  4.         this.type = type ; 
  5.         this.content = content ; 
  6.     } 

 3、點對點消息

  1. public class PersonMessage extends AbstractMessage { 
  2.     private String fromName ; 
  3.     private String toName ; 

 消息類型定義 

  1. public enum MessageType { 
  2.      
  3.     /** 
  4.      *  系統消息 0000;心跳檢查消息 0001;點對點消息2001 
  5.      */ 
  6.     SYSTEM("0000"), PING("0001"), PERSON("2001") ; 
  7.      
  8.     private String type ; 
  9.      
  10.     private MessageType(String type) { 
  11.         this.type = type ; 
  12.     } 
  13.  
  14.     public String getType() { 
  15.         return type; 
  16.     } 
  17.  
  18.     public void setType(String type) { 
  19.         this.type = type; 
  20.     } 
  21.      

 WebSocket服務端點

該類作用就是定義客戶端連接的地址

  1. @ServerEndpoint(value = "/message/{username}",  
  2.     encoders = {WsMessageEncoder.class}, 
  3.     decoders = {WsMessageDecoder.class}, 
  4.     subprotocols = {"gmsg"}, 
  5.     configurator = MessageConfigurator.class)   
  6. @Component   
  7. public class GMessageListener {   
  8.    
  9.     public static ConcurrentMap<String, UserSession> sessions = new ConcurrentHashMap<>(); 
  10.     private static Logger logger = LoggerFactory.getLogger(GMessageListener.class) ; 
  11.    
  12.     private String username ; 
  13.      
  14.     @OnOpen   
  15.     public void onOpen(Session session, EndpointConfig config, @PathParam("username") String username){ 
  16.         UserSession userSession = new UserSession(session.getId(), username, session) ; 
  17.         this.username = username ; 
  18.         sessions.put(username, userSession) ; 
  19.         logger.info("【{}】用戶進入, 當前連接數:{}", username, sessions.size()) ;  
  20.     }   
  21.    
  22.     @OnClose   
  23.     public void onClose(Session session, CloseReason reason){   
  24.         UserSession userSession = sessions.remove(this.username) ; 
  25.         if (userSession != null) { 
  26.             logger.info("用戶【{}】, 斷開連接, 當前連接數:{}", username, sessions.size()) ; 
  27.         } 
  28.     } 
  29.      
  30.     @OnMessage 
  31.     public void pongMessage(Session session, PongMessage message) { 
  32.         ByteBuffer buffer = message.getApplicationData() ; 
  33.         logger.debug("接受到Pong幀【這是由瀏覽器發送】:" + buffer.toString()); 
  34.     } 
  35.      
  36.     @OnMessage 
  37.     public void onMessage(Session session, AbstractMessage message) { 
  38.         if (message instanceof PingMessage) { 
  39.             logger.debug("這里是ping消息"); 
  40.             return ; 
  41.         } 
  42.         if (message instanceof PersonMessage) { 
  43.             PersonMessage personMessage = (PersonMessage) message ; 
  44.             if (this.username.equals(personMessage.getToName())) { 
  45.                 logger.info("【{}】收到消息:{}", this.username, personMessage.getContent()); 
  46.             } else { 
  47.                 UserSession userSession = sessions.get(personMessage.getToName()) ; 
  48.                 if (userSession != null) { 
  49.                     try { 
  50.                         userSession.getSession().getAsyncRemote().sendText(new ObjectMapper().writeValueAsString(message)) ; 
  51.                     } catch (JsonProcessingException e) { 
  52.                         e.printStackTrace(); 
  53.                     } 
  54.                 } 
  55.             } 
  56.             return ; 
  57.         } 
  58.         if (message instanceof SystemMessage) { 
  59.             logger.info("接受到消息類型為【系統消息】") ;  
  60.             return ; 
  61.         } 
  62.     } 
  63.      
  64.     @OnError 
  65.     public void onError(Session session, Throwable error) { 
  66.         logger.error(error.getMessage()) ; 
  67.     } 

 WsMessageEncoder.java類

該類的主要作用是,當發送的消息是對象時,該如何轉換

  1. public class WsMessageEncoder implements Encoder.Text<AbstractMessage> { 
  2.     private static Logger logger = LoggerFactory.getLogger(WsMessageDecoder.class) ; 
  3.     @Override 
  4.     public void init(EndpointConfig endpointConfig) { 
  5.     } 
  6.     @Override 
  7.     public void destroy() { 
  8.     } 
  9.     @Override 
  10.     public String encode(AbstractMessage tm) throws EncodeException { 
  11.         String message = null ; 
  12.         try { 
  13.             message = new ObjectMapper().writeValueAsString(tm); 
  14.         } catch (JsonProcessingException e) { 
  15.             logger.error("JSON處理錯誤:{}", e) ; 
  16.         } 
  17.         return message; 
  18.     } 

 WsMessageDecoder.java類

該類的作用是,當接收到消息時如何轉換成對象。

  1. public class WsMessageDecoder implements  Decoder.Text<AbstractMessage> { 
  2.  
  3.     private static Logger logger = LoggerFactory.getLogger(WsMessageDecoder.class) ; 
  4.     private static Set<String> msgTypes = new HashSet<>() ; 
  5.      
  6.     static { 
  7.         msgTypes.add(MessageType.PING.getType()) ; 
  8.         msgTypes.add(MessageType.SYSTEM.getType()) ; 
  9.         msgTypes.add(MessageType.PERSON.getType()) ; 
  10.     } 
  11.     @Override 
  12.     @SuppressWarnings("unchecked"
  13.     public AbstractMessage decode(String s) throws DecodeException { 
  14.         AbstractMessage message = null ; 
  15.         try { 
  16.             ObjectMapper mapper = new ObjectMapper() ; 
  17.             Map<String,String> map = mapper.readValue(s, Map.class) ; 
  18.             String type = map.get("type") ; 
  19.             switch(type) { 
  20.                 case "0000"
  21.                     message = mapper.readValue(s, SystemMessage.class) ; 
  22.                     break; 
  23.                 case "0001"
  24.                     message = mapper.readValue(s, PingMessage.class) ; 
  25.                     break; 
  26.                 case "2001"
  27.                     message = mapper.readValue(s, PersonMessage.class) ; 
  28.                     break; 
  29.             } 
  30.         } catch (JsonProcessingException e) { 
  31.             logger.error("JSON處理錯誤:{}", e) ; 
  32.         } 
  33.         return message ; 
  34.     } 
  35.  
  36.     // 該方法判斷消息是否可以被解碼(轉換) 
  37.     @Override 
  38.     @SuppressWarnings("unchecked"
  39.     public boolean willDecode(String s) { 
  40.         Map<String, String> map = new HashMap<>() ; 
  41.         try { 
  42.             map = new ObjectMapper().readValue(s, Map.class); 
  43.         } catch (JsonProcessingException e) { 
  44.             e.printStackTrace(); 
  45.         } 
  46.         logger.debug("檢查消息:【" + s + "】是否可以解碼") ; 
  47.         String type = map.get("type") ; 
  48.         if (StringUtils.isEmpty(type) || !msgTypes.contains(type)) { 
  49.             return false ; 
  50.         } 
  51.         return true ; 
  52.     } 
  53.     @Override 
  54.     public void init(EndpointConfig endpointConfig) { 
  55.     } 
  56.     @Override 
  57.     public void destroy() { 
  58.     } 

 MessageConfigurator.java類

該類的作用是配置服務端點,比如配置握手信息

  1. public class MessageConfigurator extends ServerEndpointConfig.Configurator { 
  2.     private static Logger logger = LoggerFactory.getLogger(MessageConfigurator.class) ; 
  3.     @Override 
  4.     public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { 
  5.         logger.debug("握手請求頭信息:" + request.getHeaders()); 
  6.         logger.debug("握手響應頭信息:" + response.getHeaders()); 
  7.         super.modifyHandshake(sec, request, response); 
  8.     }    

 WebSocke配置類

  1. @Configuration 
  2. public class WebSocketConfig { 
  3.      
  4.     @Bean 
  5.     public ServerEndpointExporter serverEndpointExporter (){   
  6.         return new ServerEndpointExporter();   
  7.     }   
  8.      

 當以jar包形式運行時需要配置該bean,暴露我們配置的@ServerEndpoint;當我們以war獨立tomcat運行時不能配置該bean。

前端頁面

  1. <!doctype html> 
  2. <html> 
  3.  <head> 
  4.   <meta charset="UTF-8"
  5.   <meta name="Author" content=""
  6.   <meta name="Keywords" content=""
  7.   <meta name="Description" content=""
  8.   <script src="g-messages.js?v=1"></script> 
  9.   <title>WebSocket</title> 
  10.   <style type="text/css"
  11.   </style> 
  12.   <script> 
  13.     let gm = null ; 
  14.     let username = null ; 
  15.     function ListenerMsg({url, protocols = ['gmsg'], options = {}}) { 
  16.         if (!url){  
  17.             throw new Error("未知服務地址") ; 
  18.         } 
  19.         gm = new window.__GM({ 
  20.             url: url, 
  21.             protocols: protocols 
  22.         }) ; 
  23.         gm.open(options) ; 
  24.     } 
  25.     ListenerMsg.init = (user) => { 
  26.         if (!user) { 
  27.             alert("未知的當前登錄人") ; 
  28.             return ; 
  29.         } 
  30.         let url = `ws://localhost:8080/message/${user}` ; 
  31.         let msg = document.querySelector("#msg"
  32.         ListenerMsg({url, options: { 
  33.             onmessage (e) { 
  34.                 let data = JSON.parse(e.data) ; 
  35.                 let li = document.createElement("li") ; 
  36.                 li.innerHTML = "【" + data.fromName + "】對你說:" + data.content ; 
  37.                 msg.appendChild(li) ; 
  38.             } 
  39.         }}) ; 
  40.     } 
  41.     function enter() { 
  42.         username = document.querySelector("#nick").value ; 
  43.         ListenerMsg.init(username) ; 
  44.         document.querySelector("#chat").style.display = "block" ; 
  45.         document.querySelector("#enter").style.display = "none" ; 
  46.         document.querySelector("#cu").innerText = username ; 
  47.     } 
  48.     function send() { 
  49.         let a = document.querySelector("#toname") ; 
  50.         let b = document.querySelector("#content") ; 
  51.         let toName = a.value ; 
  52.         let content = b.value ; 
  53.         gm.sendMessage({type: "2001", content, fromName: username, toName}) ; 
  54.         a.value = '' ; 
  55.         b.value = '' ; 
  56.     } 
  57.   </script> 
  58.  </head> 
  59.  <body> 
  60.     <div id="enter"
  61.         <input id="nick"/><button type="button" onclick="enter()">進入</button> 
  62.     </div> 
  63.     <hr/> 
  64.     <div id="chat" style="display:none;"
  65.         當前用戶:<b id="cu"></b><br/> 
  66.         用戶:<input id="toname" name="toname"/><br/><br/> 
  67.         內容:<textarea id="content" rows="3" cols="22"></textarea><br/> 
  68.         <button type="button" onclick="send()">發送</button> 
  69.     </div> 
  70.     <div> 
  71.         <ul id="msg"
  72.         </ul> 
  73.     </div> 
  74.  </body> 
  75. </html> 

到此所有的代碼完畢,接下來測試

測試

打開兩個標簽頁,以不同的用戶進入。

輸入對方用戶名發送消息

成功了,簡單的websocket。我們生產環境還就這么完的,8g內存跑了6w的用戶。

完畢!!!

 

 

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

2023-08-14 08:01:12

websocket8g用戶

2025-06-30 01:45:00

Netty輪詢HTTP 協議

2020-10-09 12:45:19

創建消息即時消息編程語言

2020-10-09 15:00:56

實時消息編程語言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2019-10-28 20:12:40

OAuthGuard中間件編程語言

2020-03-31 12:21:20

JSON即時消息編程語言

2020-10-12 09:20:13

即時消息Access頁面編程語言

2020-10-19 16:20:38

即時消息Conversatio編程語言

2020-10-16 14:40:20

即時消息Home頁面編程語言

2021-02-05 07:28:11

SpringbootNettyWebsocke

2015-03-18 15:37:19

社交APP場景

2022-06-28 08:37:07

分布式服務器WebSocket

2020-10-10 20:51:10

即時消息編程語言

2023-07-26 07:28:55

WebSocket服務器方案

2021-03-26 08:16:32

SpringbootWebsocket前端

2024-09-02 09:31:19

2010-05-24 09:51:37

System Cent

2024-09-12 14:50:08

2024-11-14 11:56:45

點贊
收藏

51CTO技術棧公眾號

国产在线观看91一区二区三区 | 国产视频1区2区| 51精品国产| 成人av免费在线观看| 欧美激情啊啊啊| 日韩av手机在线播放| www视频在线看| 日本不卡中文字幕| 亚洲精品福利免费在线观看| 国产主播在线看| 黄色三级网站在线观看| 婷婷亚洲最大| 欧美亚男人的天堂| 欧美日产一区二区三区在线观看| 欧美视频xxxx| 欧美成人tv| 亚洲婷婷噜噜| 男人的天堂成人在线| av午夜精品一区二区三区| 亚洲国产中文字幕在线视频综合| 2019亚洲男人天堂| 国产123在线| 午夜日韩影院| 在线视频中文字幕一区二区| 国产欧美一区二区三区不卡高清| 欧美成欧美va| 国产探花一区二区| 精品久久久久久久久久久院品网| 亚洲在线色站| 亚洲综合精品在线| 青草国产精品| 欧美日韩免费一区二区三区| 亚洲色欲久久久综合网东京热| 户外极限露出调教在线视频| 国产成人av电影免费在线观看| 亚洲视频一区二区| 欧洲成人午夜精品无码区久久| 中文在线免费| 成人综合在线观看| 国产精品中文字幕久久久| 国产亚洲小视频| 伦理一区二区三区| 狠狠干狠狠久久| 国产精品一区二区在线观看| 亚洲天天综合网| 奶水喷射视频一区| 97碰碰碰免费色视频| 精品人妻一区二区三区香蕉| 色婷婷综合久久久中字幕精品久久 | 欧美aaaaaaa| 久久 天天综合| 在线日韩欧美视频| 97人妻天天摸天天爽天天| 涩涩涩在线视频| 欧美极品aⅴ影院| 成人免费视频网址| 国产亚洲精品码| 亚洲精品二区三区| 亚洲а∨天堂久久精品9966 | 好吊日av在线| 久久久亚洲综合| 精品国产一区二区三区四区精华| 日韩欧美xxxx| 国产爆初菊在线观看免费视频网站| 日韩av网站在线观看| 2019中文字幕在线| 久久精品女人毛片国产| 激情五月综合网| 日韩精品视频在线观看网址| 色播五月综合网| av免费在线一区| 欧美午夜在线一二页| 毛片在线视频观看| 日本亚洲一区| 国产一本一道久久香蕉| 91精品在线一区| 五月激情六月丁香| 久久精品影视| 亚洲精品电影在线| 久久精品老司机| 亚洲动漫精品| 欧美一级欧美一级在线播放| 奇米777在线| 一区二区网站| 在线一区二区三区四区五区| 国产精品高潮呻吟久久av野狼| 亚洲天堂第一区| 精品视频一二三| 国产一区二区伦理| 91精品免费| 最近中文字幕免费在线观看| 久久久久欧美精品| 久久久人成影片一区二区三区观看| 亚洲成人黄色av| 水蜜桃久久夜色精品一区| 久久精品日韩无码| 五月天激情四射| 先锋影音久久| 国产美女在线观看一区| 97久久超碰福利国产精品…| 日本三级免费看| 精品国自产在线观看| 麻豆一区二区三区| 久久久久久香蕉网| 日本妇女毛茸茸| 亚洲作爱视频| 久久久精品久久久久| 国产午夜福利精品| 石原莉奈一区二区三区在线观看 | 黄色片在线观看免费| 国产三级精品三级在线观看国产| 精品香蕉一区二区三区| 欧洲性xxxx| 欧美日韩伦理在线免费| 日韩精品有码在线观看| 污视频在线观看免费网站| 里番精品3d一二三区| 亚洲欧洲日韩国产| 草视频在线观看| 性xxxx视频| 日韩欧美美女在线观看| 中文字幕在线看视频国产欧美在线看完整 | 美女日批在线观看| 奇米狠狠一区二区三区| 插插插亚洲综合网| 无码人妻丰满熟妇精品| 国产**成人网毛片九色 | 毛片毛片毛片毛片毛| 国产一区二区精品福利地址| 日韩亚洲第一页| 在线观看日韩中文字幕| 国产福利精品一区二区| 亚洲成人蜜桃| 特黄毛片在线观看| 精品久久在线播放| 欧美日韩一区二区在线免费观看| 国产一区二区久久久久| 91精品国产综合久久久久久| 色一情一交一乱一区二区三区| 亚洲视频观看| 亚洲自拍小视频| a天堂中文在线| 欧美日韩一区二区精品| 国产麻豆剧传媒精品国产| 国产精品xnxxcom| 中文字幕国产日韩| 久久久久久久久久成人| 99国产精品99久久久久久| www.18av.com| 视频一区中文字幕精品| 中文字幕日韩免费视频| 久久影视中文字幕| 美女免费视频一区| 日韩高清av电影| 色老太综合网| 最新中文字幕一区二区三区| 久久久久久尹人网香蕉| 国产精品99精品无码视| 国产精品主播直播| 人人妻人人澡人人爽精品欧美一区| 久久久成人av毛片免费观看| 7777精品伊人久久久大香线蕉| 免费观看一区二区三区| av中字幕久久| 国产精品扒开腿做爽爽爽男男 | 美女国产一区二区| 99在线免费观看视频| 国产永久av在线| 香蕉视频国产精品| 欧美体内she精视频| 18禁一区二区三区| 红桃视频亚洲| 国产伦精品一区二区| 午夜性色福利视频| av一区二区三区四区| 免费看欧美黑人毛片| 精品乱码一区二区三区四区| 在线播放国产精品| 国产孕妇孕交大片孕| 久久久三级国产网站| 欧美大片免费播放| 芒果视频成人app| 日韩欧美一区中文| 日韩伦人妻无码| 韩国三级中文字幕hd久久精品| 色一情一乱一伦一区二区三区丨 | 久久只精品国产| 国产91xxx| 欧美精品momsxxx| 欧美日本一道本| 五月综合激情网| jizz大全欧美jizzcom| 欧美日韩久久精品| 92裸体在线视频网站| 牛牛精品在线| 亚洲免费电影一区| 一区二区日韩视频| 亚洲自拍欧美精品| 婷婷激情5月天| 欧美色综合网| 91在线观看免费高清| 激情网站在线| 国产亚洲美女久久| 国产www视频| 亚洲日本电影在线| 亚洲午夜精品一区| 亚洲精品四区| 亚洲va国产va天堂va久久| av日韩中文| 日韩av中文在线| 国产无套内射又大又猛又粗又爽| 国产性色一区二区| 91丨porny丨九色| 久久激情视频| 久久久久99精品成人片我成大片| 丝袜在线观看| 欧美成人性战久久| 伊人中文字幕在线观看 | 久久久精品动漫| 黄色网址在线播放| 在线播放中文字幕一区| 日本熟伦人妇xxxx| 国产精品久久久久久久久动漫| 佐佐木明希电影| 秋霞av亚洲一区二区三| 成人嫩草影院| 亚洲第一精品福利| 男人天堂视频网| 一区二区三区视频在线看| 激情综合网俺也去| 欧美激情亚洲| 粉嫩av一区二区三区免费观看| 三妻四妾的电影电视剧在线观看| 日韩专区中文字幕| 户外极限露出调教在线视频| 在线免费亚洲电影| 久久黄色免费视频| 91麻豆swag| 国产大学生av| 亚洲伦理一区| 国产乱子伦精品视频| 国产精品久久久久av蜜臀| 91chinesevideo永久地址| 免费在线看黄| 51精品国自产在线| 特级西西444www高清大视频| 亚洲同性gay激情无套| 亚洲制服丝袜av| 成人国产精品免费视频| 91看片在线观看| 日韩av在线免费| 老牛影视av牛牛影视av| 天天综合天天综合色| 亚洲av片不卡无码久久| 男人操女人的视频在线观看欧美| 日本香蕉视频在线观看| 欧美天堂社区| 国产精品污www一区二区三区| 国产成人免费av一区二区午夜 | 亚洲18在线看污www麻豆| 男人av在线播放| 欧美疯狂做受xxxx高潮| 欧美色图亚洲激情| 免费欧美激情| 国产精品mp4| 国产三级在线播放| 久久精品国产一区| 丝袜视频国产在线播放| 日韩一区二区三区免费观看| 国产精品国产三级国产普通话对白| 欧美日本免费一区二区三区| 久草视频免费在线| 中文字幕在线不卡视频| 精品国产大片大片大片| 亚洲视频免费在线观看| 国产男男chinese网站| 久久婷婷国产综合国色天香| 中文字幕乱码在线人视频| 久久久久一区| 国产va亚洲va在线va| 亚洲精品一级| 六月婷婷激情网| 国产精品mm| 欧美激情成人网| 免费欧美在线视频| 亚洲天堂av一区二区| 99精品桃花视频在线观看| 90岁老太婆乱淫| 亚洲欧洲无码一区二区三区| 免费三级在线观看| 欧美日韩在线视频一区| 337p粉嫩色噜噜噜大肥臀| 欧美剧在线免费观看网站| 网站黄在线观看| 欧美大片在线观看| 熟妇人妻中文av无码| 亚洲精品一区二区三区香蕉| 国产影视一区二区| 欧美在线啊v一区| 亚洲 日本 欧美 中文幕| 日韩欧美中文字幕精品| 国产美女明星三级做爰| 欧美午夜精品免费| www.午夜激情| 精品国产欧美一区二区| 男人天堂亚洲二区| 久久国产精品99国产精| av片在线观看| 久久777国产线看观看精品| 毛片av在线| 午夜精品福利在线观看| av在线亚洲一区| 久久久久久九九九九| 台湾亚洲精品一区二区tv| 欧美日韩一级视频| 久久久久久久黄色| 一区二区三区精品| 国产调教在线观看| 欧美日韩中国免费专区在线看| 国语对白永久免费| 欧美一区二区免费观在线| 人妻91麻豆一区二区三区| 日韩网站免费观看高清| 黄色网址免费在线观看| 欧美日韩xxx| 九七电影院97理论片久久tvb| 国产精品美女黄网| 欧美日韩中文一区二区| 日韩av资源在线| 可以看av的网站久久看| 特级特黄刘亦菲aaa级| 97久久超碰国产精品| 婷婷激情四射网| 香蕉久久一区二区不卡无毒影院| 91久久精品国产91性色69| 欧美日韩不卡一区| aaa在线观看| 麻豆成人在线看| 激情在线视频播放| 国产精品久久久久久久一区探花 | 成人精品福利视频| 国产99亚洲| 久久观看最新视频| 久久精品国产在热久久| 瑟瑟视频在线观看| 亚洲免费观看高清完整| 中文字幕 日韩有码| 亚洲最新中文字幕| 高潮在线视频| 国产99午夜精品一区二区三区| 国产大片一区| 欧美v在线观看| 97久久精品人人做人人爽| 手机av在线不卡| 亚洲一区二区av在线| 亚洲精品久久久蜜桃动漫| 麻豆成人在线看| 日本精品一区二区三区在线观看视频| 你懂的网址一区二区三区| 国产日韩欧美一区在线| 私密视频在线观看| 亚洲欧洲色图综合| 91免费视频播放| 久久激情视频久久| 99久久999| 日韩精品一区二区三区电影| 极品尤物av久久免费看| 久久久久亚洲天堂| 亚洲国产成人爱av在线播放| 欧美1—12sexvideos| 成人精品久久久| 二区三区在线播放| 欧美区二区三区| 国产精品qvod| 国产视频一视频二| 日本一区二区免费在线观看视频| 一级特黄aaa大片| 欧美福利在线观看| 惠美惠精品网| 亚洲精品二区| 国产欧美在线| wwwww黄色| 欧美成人激情免费网| 国产在线美女| 一区二区三区偷拍| 国产精品456| 亚洲欧美日韩精品综合在线观看| 欧美日韩精品在线观看视频 | 国产午夜精品视频一区二区三区| 国产不卡视频一区| 欧产日产国产69| 欧美电影精品一区二区| 蜜桃视频www网站在线观看| 国产精品日韩欧美一区二区| 午夜在线播放视频欧美| 国产欧美一区二区三区在线观看视频| 日本福利一区二区| 免费网站成人| 国内精品二区| 国产自产2019最新不卡|