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

Springboot 整合 Websocket 輕松實(shí)現(xiàn) IM 及時(shí)通訊

開發(fā) 前端
項(xiàng)目中碰到需要及時(shí)通訊的場(chǎng)景,使用Springboot集成Websocket,即可瞬間破局。本文介紹Springboot如何集成Websocket、IM及時(shí)通訊需要哪些模塊、開發(fā)和部署過(guò)程中遇到的問(wèn)題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼。

一、方案實(shí)踐

集成分為三步:添加依賴、增加配置類和消息核心類、前端集成。

1.1、添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.1.13.RELEASE</version>
</dependency>

1.2、增加WebSocket配置類

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

1.3、增加消息核心類WebSocketServer

@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocketServer {
    // 消息存儲(chǔ)
    private static MessageStore messageStore;
    // 消息發(fā)送
    private static MessageSender messageSender;

    public static void setMessageStore(MessageStore messageStore) {
        WebSocketServer.messageStore = messageStore;
    }

    public static void setMessageSender(MessageSender messageSender) {
        WebSocketServer.messageSender = messageSender;
    }

    /**
     * 連接建立成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        messageStore.saveSession(session);
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose(Session session, @PathParam("userId") String userId) {
        messageStore.deleteSession(session);
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @ Param message 客戶端發(fā)送過(guò)來(lái)的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) throws Exception {
        log.warn("=========== 收到來(lái)自窗口" + session.getId() + "的信息:" + message);
        handleTextMessage(session, new TextMessage(message));
    }

    /**
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, @PathParam("userId") String userId, Throwable error) {
        log.error("=========== 發(fā)生錯(cuò)誤");
        error.printStackTrace();
//        msgStore.deleteSession(session);
    }

    public void handleTextMessage(Session session, TextMessage message) throws Exception {
        log.warn("=========== Received message: {}", message.getPayload());
    }
}

1.4、前端頁(yè)面加入socket

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
  <head>
    <title>WebSocket Example</title>
  </head>
  <body>
    登錄用戶ID:<input type="text" id="sendUserId" /></br>
    接受用戶ID:<input type="text" id="receivedUserId" /></br>
    發(fā)送消息內(nèi)容:<input type="text" id="messageInput" /></br>
    接受消息內(nèi)容:<input type="text" id="messageReceive" /></br>
    <button onclick="sendMessage()">Send</button>

    <script>
      var socket = new WebSocket("ws://localhost:8080/websocket/aaa");
      var roomId = "123456";
      // 隨機(jī)產(chǎn)出六位數(shù)字
      var sendUserId = Math.floor(Math.random() * 1000000);

      document.getElementById("sendUserId").value = sendUserId;
      var messageReceive = document.getElementById("messageReceive");


      socket.onopen = function (event) {
        console.log("WebSocket is open now.");
        let loginInfo = {
          msgType: 2, //登錄消息
          sendUserId: sendUserId,
          bizType: 1, //業(yè)務(wù)類型
          bizOptModule: 1, //業(yè)務(wù)模塊
          roomId: roomId,
          msgBody: {},
        };
        socket.send(JSON.stringify(loginInfo));
      };

      socket.onmessage = function (event) {
        var message = event.data;
        console.log("Received message: " + message);
        messageReceive.value = message;
      };

      socket.onclose = function (event) {
        console.log("WebSocket is closed now.");
      };

      function sendMessage() {
        var message = document.getElementById("messageInput").value;
        var receivedUserId = document.getElementById("receivedUserId").value;
        let operateInfo = {
          msgType: 100, //業(yè)務(wù)消息
          sendUserId: sendUserId,
          bizType: 1, //業(yè)務(wù)類型
          bizOptModule: 1, //業(yè)務(wù)模塊
          roomId: roomId,
          receivedUserId: receivedUserId,
          msgBody: {
            operateType: 1, //操作類型:禁言
            operateContent: "1",
          },
        };
        socket.send(JSON.stringify(operateInfo));
      }

      setInterval(() => {
        socket.send("ping");
      }, 30000);
    </script>
  </body>
</html>

二、小型及時(shí)通訊包含的模塊

以上只是集成了Websocket框架,實(shí)現(xiàn)了基本的全雙工通信,服務(wù)器和客戶端都可以同時(shí)發(fā)送和接收數(shù)據(jù)。要想實(shí)現(xiàn)一些小型完整的及時(shí)通訊,還需要具備以下幾個(gè)核心模塊。架構(gòu)圖如下:

2.1、架構(gòu)圖

圖片圖片

2.2、消息對(duì)象模型

組織消息內(nèi)容,比如消息類型、發(fā)送者用戶ID、接受者用戶ID、具體的消息體等。比如:

public class SocketMsg<T> {

    /**
     * 消息類型:1心跳  2登錄 3業(yè)務(wù)操作
     */
    private Integer msgType;

    /**
     * 發(fā)送者用戶ID
     */
    private String sendUserId;
    /**
     * 接受者用戶ID
     */
    private String receivedUserId;

    /**
     * 業(yè)務(wù)類型
     */
    private Integer bizType;

    /**
     * 業(yè)務(wù)操作模塊
     */
    private Integer bizOptModule;

    /**
     * 消息內(nèi)容
     */
    private T msgBody;
}

2.3、消息存儲(chǔ)模塊

負(fù)責(zé)存儲(chǔ)消息內(nèi)容、用戶ID和sessionID的關(guān)系,防止數(shù)據(jù)丟失或者服務(wù)器重啟等。

2.4、消息發(fā)送模塊

功能開發(fā)完畢,一般部署到分布式集群環(huán)境,所以通訊時(shí)session會(huì)分布在多臺(tái)服務(wù)器。比如用戶A的session在機(jī)器1,用戶B的session在機(jī)器2,此時(shí)A發(fā)送給B,就無(wú)法單獨(dú)通過(guò)機(jī)器1完成。

因?yàn)闄C(jī)器1拿不到機(jī)器2里的session,所以消息發(fā)不過(guò)去。此時(shí)只能借助別的中間件來(lái)實(shí)現(xiàn),比如借助消息中間件kafka實(shí)現(xiàn)。

機(jī)器1將消息發(fā)送給kafka,然后機(jī)器1和機(jī)器2都監(jiān)聽(tīng)kafka,然后查看用戶對(duì)應(yīng)的session是否在本機(jī),如果在本機(jī)則發(fā)送出去。

2.5、消息推送模塊

模塊3提到的消息發(fā)送流程中,消息發(fā)送給 消息中間件,然后服務(wù)器消費(fèi)到消費(fèi),在通過(guò)本機(jī)的session推送給客戶端。

三、遇到的幾個(gè)問(wèn)題

3.1、連接自動(dòng)斷開

WebSocket連接之后,發(fā)現(xiàn)一個(gè)問(wèn)題:每隔一段時(shí)間如果不傳送數(shù)據(jù)的話,與前端的連接就會(huì)自動(dòng)斷開。可以采用心跳消息的方式來(lái)解決這個(gè)問(wèn)題。比如客服端每隔30秒自動(dòng)發(fā)送ping消息給服務(wù)端,服務(wù)端返回pong。

3.2、Session無(wú)法被序列化

分布式場(chǎng)景會(huì)存在這樣的問(wèn)題:當(dāng)一次請(qǐng)求負(fù)載到第一臺(tái)服務(wù)器時(shí),session在第一臺(tái)服務(wù)器線程上,第二次請(qǐng)求,負(fù)載到第二臺(tái)服務(wù)器上,此時(shí)通過(guò)userId查找當(dāng)前用戶的session時(shí),是查找不到的。

本來(lái)想著把session存入到redis中,就可以從redis獲取用戶的session,希望用這種方式來(lái)解決分布式場(chǎng)景下消息發(fā)送的問(wèn)題。但是會(huì)出現(xiàn)如下錯(cuò)誤:

The remote endpoint was in state [STREAM_WRITING] which is an invalid state for called method

翻看了session源碼,發(fā)現(xiàn)session無(wú)法被序列化。所以這個(gè)方案只能放棄。解決方案請(qǐng)看下面的問(wèn)題5或者上面的架構(gòu)圖。

3.3、對(duì)象無(wú)法自動(dòng)注入

使用了@ServerEndpoint注解的類中使用@Resource或@Autowired注入對(duì)象都會(huì)失敗,并且報(bào)空指針異常。

原因是WebSocket服務(wù)是線程安全的,那么當(dāng)我們?nèi)グl(fā)起一個(gè)ws連接時(shí),就會(huì)創(chuàng)建一個(gè)端點(diǎn)對(duì)象。WebSocket服務(wù)是多對(duì)象的,不是單例的。而我們的Spring的Bean默認(rèn)就是單例的,在非單例類中注入一個(gè)單例的Bean是沖突的。

或者說(shuō):

Spring管理采用單例模式(singleton),而 WebSocket 是多對(duì)象的,即每個(gè)客戶端對(duì)應(yīng)后臺(tái)的一個(gè) WebSocket 對(duì)象,也可以理解成 new 了一個(gè) WebSocket,這樣當(dāng)然是不能獲得自動(dòng)注入的對(duì)象了,因?yàn)檫@兩者剛好沖突。

@Autowired 注解注入對(duì)象操作是在啟動(dòng)時(shí)執(zhí)行的,而不是在使用時(shí),而 WebSocket 是只有連接使用時(shí)才實(shí)例化對(duì)象,且有多個(gè)連接就有多個(gè)對(duì)象。所以我們可以得出結(jié)論,這個(gè) Service 根本就沒(méi)有注入到 WebSocket 當(dāng)中。

如何解決呢?

使用靜態(tài)對(duì)象,并且對(duì)外暴露set方法,這樣在對(duì)象初始化的時(shí)候,將其注入到WebSocketServer中。比如說(shuō)這樣:

@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocketServer {
  private static MessageStore messageStore;
  private static MessageSender messageSender;

  public static void setMessageStore(MessageStore messageStore) {
      WebSocketServer.messageStore = messageStore;
  }

  public static void setMessageSender(MessageSender messageSender) {
      WebSocketServer.messageSender = messageSender;
  }
}


@Slf4j
@Service
public class MessageStore {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @PostConstruct
    public void init() {
        WebSocketServer.setMessageStore(this);
    }
}

3.4、分布式場(chǎng)景消息如何發(fā)給客戶端

問(wèn)題2中提到了分布式場(chǎng)景下存在的session不在本機(jī)的問(wèn)題,這種場(chǎng)景可以通過(guò)發(fā)送消息中間件的方式解決。具體這樣解決:

每次連接時(shí),都將userId和對(duì)應(yīng)的session存入到本機(jī),發(fā)送消息時(shí),直接發(fā)送給MQ-Broker,然后每臺(tái)應(yīng)用負(fù)載都去消費(fèi)這個(gè)消息,拿到消息之后,判斷在本機(jī)能根據(jù)userId是否能找到session,找到session則推送到客戶端。

3.5、部署時(shí)Nginx配置問(wèn)題

代碼開發(fā)完畢之后,本機(jī)跑通后,然后部署到服務(wù)器之后,還差很重要的一步:配置nginx代理。

3.5.1、給后端應(yīng)用部署獨(dú)立域名

要給后端應(yīng)用部署獨(dú)立域名,nginx代理直接轉(zhuǎn)發(fā)到應(yīng)用的獨(dú)立域名,不要走微服務(wù)的gateway網(wǎng)關(guān)轉(zhuǎn)發(fā)過(guò)去。

3.5.2、多層nginx轉(zhuǎn)發(fā)問(wèn)題

當(dāng)只有一層nginx的時(shí)候,配置比較簡(jiǎn)單,如下:

location ~* ^/api/websocket/* {
      proxy_pass http://mangodwsstest.mangod.top;
      
      proxy_read_timeout 300s;
      proxy_send_timeout 300s;
      proxy_set_header Host mangodwsstest.mangod.top;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header X-Real-IP $remote_addr;
 }

但是,當(dāng)有兩層nginx轉(zhuǎn)發(fā)的時(shí)候,問(wèn)題就出現(xiàn)了。

在最外層的nginx需要使用如下配置,不能照抄后面一層的配置。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for和proxy_set_header X-Forwarded-Proto $scheme這兩個(gè)配置不能少,用來(lái)將協(xié)議和真實(shí)IP傳遞給后面一層的nginx。

location ~* ^/api/websocket/* {
      proxy_pass http://mangodwsstest.mangod.top;

      proxy_read_timeout 300s;
      proxy_send_timeout 300s;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Real-IP  $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
}

四、完整代碼和示例

4.1、頁(yè)面效果如下

開啟兩個(gè)web頁(yè)面,用戶1輸入用戶2的用戶ID,輸入發(fā)送消息內(nèi)容,點(diǎn)擊發(fā)送。在用戶2的頁(yè)面的接受消息內(nèi)容可以看到發(fā)送的消息。

圖片圖片

圖片圖片

4.2、代碼結(jié)構(gòu)

圖片圖片

4.3、代碼地址

https://github.com/yclxiao/spring-websocket.git

五、總結(jié)

本文聊了Springboot如何集成Websocket、IM及時(shí)通訊需要哪些模塊、開發(fā)和部署過(guò)程中遇到的問(wèn)題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼。

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2023-01-13 00:02:41

2023-01-05 09:17:58

2023-08-09 08:01:00

WebSockett服務(wù)器web

2021-03-26 08:16:32

SpringbootWebsocket前端

2012-08-13 13:03:31

Web

2024-09-12 14:50:08

2024-11-14 12:22:37

SpringMail郵件

2015-06-02 11:24:06

容聯(lián)云通訊

2024-11-18 17:04:03

Vue3C#

2023-07-26 07:28:55

WebSocket服務(wù)器方案

2021-03-25 08:29:33

SpringBootWebSocket即時(shí)消息

2023-08-14 08:01:12

websocket8g用戶

2024-03-21 08:34:49

Vue3WebSocketHTTP

2021-08-14 09:23:03

即時(shí)通訊IM互聯(lián)網(wǎng)

2021-02-05 07:28:11

SpringbootNettyWebsocke

2020-04-23 15:08:41

SpringBootMyCatJava

2024-09-05 08:58:37

2022-04-28 07:31:41

Springkafka數(shù)據(jù)量

2024-08-02 09:00:17

NettyWebSocketNIO

2024-08-29 08:58:30

JPA編寫數(shù)據(jù)操
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久爱av电影| 三级精品视频久久久久| 97视频在线观看免费| 最近中文字幕无免费| 久久久一本精品| 综合欧美亚洲日本| 国产精品国产三级国产专区53 | 亚洲性视频大全| 欧美日韩在线直播| www.av毛片| 菠萝蜜视频在线观看一区| 97久久久免费福利网址| 欧美亚洲色综久久精品国产| 日韩综合一区二区三区| 色综合久久天天综合网| 少妇高潮大叫好爽喷水| 久久久久久久久久久97| 草民午夜欧美限制a级福利片| eeuss一区二区三区| 男人天堂2024| 欧美一区在线看| 夜夜嗨av一区二区三区免费区| 成人一区二区三区仙踪林| 欧美aaa大片视频一二区| 亚洲综合免费观看高清在线观看| 少妇特黄a一区二区三区| 欧美一级一区二区三区| 久草成人在线| 日韩精品一区国产麻豆| 午夜激情av在线| 999国产在线视频| 懂色av一区二区在线播放| 精品国产一区二区三区av性色| 亚洲成人福利在线观看| 欧美裸体视频| 亚洲成人在线观看视频| 国产视频一区在线观看| 日韩视频一区在线| 无码少妇一区二区| 伊人久久大香线蕉综合网蜜芽| 日韩免费视频一区二区| www.51色.com| 成年人网站在线| 国产欧美一区二区在线观看| 看欧美日韩国产| 中文字幕第315页| 久久亚洲美女| 国产aⅴ夜夜欢一区二区三区| 波多野结衣之无限发射| 久热精品在线观看| 久久精品影视| 日韩亚洲欧美中文在线| 久久久久久国产免费a片| 亚洲自拍电影| 国产亚洲欧美另类中文| 国产手机在线观看| 欧美男gay| 亚洲色图激情小说| 51妺嘿嘿午夜福利| 菠萝蜜一区二区| 中文字幕不卡在线视频极品| 一区二区视频在线观看| 在线国产99| 五月天婷婷视频| 久久网站最新地址| 538国产精品一区二区免费视频| 欧美精品99久久久| 激情视频一区二区三区| 97视频在线观看播放| 久久久精品福利| 爽好久久久欧美精品| 国产精品电影网站| 国内偷拍精品视频| 国产精品sm| 日韩电影免费观看在线观看| 特级西西人体wwwww| 国产精品伊人| 欧美一级二级在线观看| 亚洲成年人av| 亚洲精品动态| 色老头一区二区三区在线观看| 性欧美疯狂猛交69hd| 国产综合婷婷| 国产成人极品视频| 国产免费一区二区三区免费视频| 国产91对白在线观看九色| 国产伦精品一区二区三区四区视频 | 欧美日韩精品一区二区三区四区 | 91视频 -- 69xx| 久久毛片亚洲| 欧美一区二区视频在线观看| 男人操女人免费| 国产福利亚洲| 色综合久久99| 日本韩国欧美中文字幕| 色综合www| 最新的欧美黄色| 日韩激情综合网| 国产亚洲久久| 亚洲国产高潮在线观看| 色无极影院亚洲| 忘忧草精品久久久久久久高清| 亚洲精品日韩在线| 欧美自拍偷拍网| 在线国产日韩| 国产精选久久久久久| 韩国av永久免费| 国产呦精品一区二区三区网站| 国产精品日韩一区二区免费视频| 高清在线观看av| 亚洲综合免费观看高清完整版在线| 日韩免费高清在线| 成人在线超碰| 北条麻妃一区二区三区中文字幕 | 四虎在线观看| 亚洲精品福利视频网站| 成人精品视频一区二区| 91精品啪在线观看国产爱臀| 91麻豆精品91久久久久久清纯| 国产亚洲色婷婷久久99精品91| 日韩欧美视频| 日本成人精品在线| 亚洲va天堂va欧美ⅴa在线| 国产精品私人自拍| 国产精品69页| 精品福利一区| 欧美激情视频一区二区| 91精品国产乱码久久| 久久久精品tv| 干日本少妇首页| 激情小说综合网| 一级二级三级视频| 久久美女艺术照精彩视频福利播放 | 国内精品久久久久久久久| 欧美成人一二三区| 久久国产精品无码网站| 日韩少妇中文字幕| 黑人巨大精品欧美一区二区桃花岛| 亚洲福利在线看| 国产主播在线观看| 粉嫩av一区二区三区在线播放| 亚洲区成人777777精品| 电影91久久久| 欧美成人免费播放| 国产成人精品一区二区无码呦| 国产成+人+日韩+欧美+亚洲| 精品一区二区成人免费视频| 青青在线精品| 久久久av网站| 99热这里只有精品1| 亚洲视频每日更新| 色偷偷中文字幕| 欧美日韩国产亚洲一区| www.久久爱.cn| 黄色成人在线网| 日韩精品专区| 日韩一区二区三区四区| 日韩av手机在线免费观看| 韩国理伦片一区二区三区在线播放| 一区二区视频在线免费| 日本免费一区二区三区视频| 日韩理论片中文av| 中文字幕日韩免费视频| 日韩三级av在线| 久久免费看少妇高潮| 国语对白做受xxxxx在线中国 | 日本视频一区在线观看| 欧洲伦理片一区 二区 三区| 日韩欧美亚洲一二三区| 亚洲最大成人综合网| 久久国内精品视频| 欧美在线观看黄| 欧美变态挠脚心| 国产精品第一区| а√资源新版在线天堂| 精品国产乱码久久久久久久 | 日本久久一区二区| 97精品在线播放| 国产一区二区在线观看视频| 亚洲成人999| 日本三级片在线观看| 久久综合九色综合久久久精品综合| 国产免费毛卡片| 欧美日韩性在线观看| 亚洲www啪成人一区二区| 欧美日韩一区二区欧美激情| 懂色av蜜臀av粉嫩av永久| 国产精品一区二区在线观看不卡| 91色p视频在线| 女囚岛在线观看| 国产香蕉精品视频一区二区三区| 国产一区二区波多野结衣| 亚洲国产精品久久久久婷婷884 | 美女少妇精品视频| 婷婷色在线观看| 中文字幕亚洲一区二区va在线| 99riav国产精品视频| 国产成人无码www免费视频播放| 中文一区在线播放| 亚洲精品鲁一鲁一区二区三区| 西西人体一区二区| 浴室偷拍美女洗澡456在线| 希岛爱理中文字幕| 风间由美性色一区二区三区四区 | 欧美日韩一区二区在线 | 成人免费福利视频| 在线观看特色大片免费视频| 久久久av电影| 国产高清自拍视频在线观看| 精品国产百合女同互慰| 最新在线中文字幕| 天天爽夜夜爽夜夜爽精品视频| 999精品视频在线观看播放| xf在线a精品一区二区视频网站| 欧美大片久久久| 日韩福利视频网| 少妇性饥渴无码a区免费| 国产综合精品| 男女h黄动漫啪啪无遮挡软件| 国产亚洲欧美日韩在线观看一区二区 | 久久久精品国产免大香伊| av天堂一区二区| 国产一区视频在线看| 天堂av在线网站| 亚洲一区二区伦理| 久操网在线观看| 欧美黄色大片网站| 在线看无码的免费网站| 精品国产精品| 狼狼综合久久久久综合网| 国产精品欧美大片| av色综合网| 日韩成人视屏| 92国产精品久久久久首页 | 日韩制服丝袜av| 大肉大捧一进一出好爽动态图| 中日韩男男gay无套| 九一国产精品视频| 在线日韩中文| 131美女爱做视频| 在线国产日韩| 国产在线更新| 欧美日韩精品欧美日韩精品| 黄色片中文字幕| 激情亚洲一区二区三区四区 | 日韩亚洲在线| 91视频成人免费| 在线精品国产| 日韩video| 欧美日一区二区在线观看 | 好男人在线视频www| 欧美美女bb生活片| 国产精品国产av| 欧美福利一区二区| 国产偷拍一区二区| 日韩小视频在线观看专区| 精品人妻一区二区三区蜜桃| 日韩女优制服丝袜电影| 精品人妻av一区二区三区| 欧美va日韩va| 天天操天天操天天| 亚洲欧美日韩国产精品| 久久久一二三区| 亚洲一级二级在线| 国产五月天婷婷| 欧美日韩国产色视频| 国产一级片毛片| 欧美在线你懂的| 国产精品欧美亚洲| 精品国产一区a| 精品电影在线| 日韩少妇与小伙激情| av网站在线看| 69久久夜色精品国产69| 国产成人精品一区二三区在线观看 | 久久精品国产网站| 日韩中文字幕a| 国产成人在线视频网站| 波多野结衣影院| 国产欧美日韩卡一| 91视频综合网| 欧美性jizz18性欧美| 中国一级特黄视频| 日韩午夜av一区| 视频国产在线观看| 最新的欧美黄色| aa视频在线观看| 国产精品日韩欧美综合| 川上优的av在线一区二区| 色噜噜狠狠狠综合曰曰曰88av | 日韩欧美高清在线播放| 欧美人交a欧美精品| 欧美 变态 另类 人妖| 久久影院电视剧免费观看| 黄色香蕉视频在线观看| 疯狂做受xxxx欧美肥白少妇| 一级片aaaa| 亚洲丁香久久久| 免费大片黄在线| 5278欧美一区二区三区| 国产免费av国片精品草莓男男| 另类欧美小说| 欧美激情日韩| 噼里啪啦国语在线观看免费版高清版| 国产成人综合在线播放| 中文字幕av久久爽一区| 亚洲第一主播视频| 中文字幕在线观看视频一区| 亚洲激情第一页| 成人免费高清| 国产精品人成电影在线观看| 9999久久久久| 欧美少妇在线观看| 日韩在线a电影| 中文字幕xxx| 亚洲午夜精品网| 91久久久久久久久久久久| 亚洲乱码国产乱码精品精| 爱情岛亚洲播放路线| 91九色精品视频| 在线免费av网| 亚洲成人网在线| 黄色片免费在线观看| 欧洲s码亚洲m码精品一区| 久久精品免视看国产成人| 欧美一区二区在线| 精品999成人| 亚洲18在线看污www麻豆| 久久久久久9999| 午夜毛片在线观看| 精品少妇一区二区| 高清免费电影在线观看| 国产精品久久久久久久久久久新郎 | 人妻妺妺窝人体色www聚色窝| 91久久线看在观草草青青| 天堂在线观看视频| 中文字幕亚洲成人| 亚洲综合自拍网| 悠悠色在线精品| 国产麻豆免费视频| 日韩一区二区av| 久久久久久福利| 欧美亚男人的天堂| 日本高清中文字幕二区在线| 午夜精品福利电影| 久久夜色电影| 欧美,日韩,国产在线| 成人免费看的视频| 日本在线免费观看| 日本v片在线高清不卡在线观看| 特级特黄刘亦菲aaa级| 亚洲一区二区视频在线观看| 精品人妻午夜一区二区三区四区 | 欧美人动性xxxxz0oz| 亚洲自拍偷拍区| 午夜精品婷婷| 国产大学生视频| 欧美日韩国产精品专区| 黄色国产在线| 91精品国产综合久久香蕉最新版 | 在线看片不卡| 俄罗斯黄色录像| 欧美性xxxx18| 欧美成人高清在线| 99porn视频在线| 国产一区二区三区的电影 | 日中文字幕在线| 国产精品久久久久av免费| 亚洲91久久| 欧亚乱熟女一区二区在线| 色综合久久中文综合久久牛| 91av资源在线| 99一区二区三区| 欧美亚洲免费| xxxx日本少妇| 日韩av有码在线| 久久免费影院| 成人精品视频在线播放| 久久久久久**毛片大全| 国产乱淫av片免费| 2019亚洲日韩新视频| 成人综合一区| 日本少妇一级片| 在线精品视频免费观看| 在线看福利影| 日本在线观看不卡| 国产99久久久国产精品潘金网站| 久热这里只有精品6| 日韩中文字幕av| 精品国产18久久久久久洗澡| 最新国产黄色网址| 五月天久久比比资源色| 日本最新在线视频| 九9re精品视频在线观看re6| 久88久久88久久久| 午夜精品三级久久久有码| 色老头一区二区三区| 亚洲香蕉视频| 永久免费未满蜜桃| 欧美日韩国产一级片|