久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

SpringBoot+WebSocket+Netty實現消息推送的示例代碼

瀏覽:59日期:2023-05-20 08:58:36

上一篇文章講了Netty的理論基礎,這一篇講一下Netty在項目中的應用場景之一:消息推送功能,可以滿足給所有用戶推送,也可以滿足給指定某一個用戶推送消息,創建的是SpringBoot項目,后臺服務端使用Netty技術,前端頁面使用WebSocket技術。

大概實現思路:

前端使用webSocket與服務端創建連接的時候,將用戶ID傳給服務端 服務端將用戶ID與channel關聯起來存儲,同時將channel放入到channel組中 如果需要給所有用戶發送消息,直接執行channel組的writeAndFlush()方法 如果需要給指定用戶發送消息,根據用戶ID查詢到對應的channel,然后執行writeAndFlush()方法 前端獲取到服務端推送的消息之后,將消息內容展示到文本域中

下面是具體的代碼實現,基本上每一步操作都配有注釋說明,配合注釋看應該還是比較容易理解的。

第零步:引入Netty的依賴,和一個工具包(只用到了json工具,可用其他json工具代替)

<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.33.Final</version></dependency><dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.2.3</version></dependency>

第一步:在NettyConfig中定義一個channel組,管理所有的channel,再定義一個map,管理用戶與channel的對應關系。

package com.sixj.nettypush.config;import io.netty.channel.Channel;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.util.concurrent.GlobalEventExecutor;import java.util.concurrent.ConcurrentHashMap;/** * @author sixiaojie * @date 2020-03-28-15:07 */public class NettyConfig { /** * 定義一個channel組,管理所有的channel * GlobalEventExecutor.INSTANCE 是全局的事件執行器,是一個單例 */ private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); /** * 存放用戶與Chanel的對應信息,用于給指定用戶發送消息 */ private static ConcurrentHashMap<String,Channel> userChannelMap = new ConcurrentHashMap<>(); private NettyConfig() {} /** * 獲取channel組 * @return */ public static ChannelGroup getChannelGroup() { return channelGroup; } /** * 獲取用戶channel map * @return */ public static ConcurrentHashMap<String,Channel> getUserChannelMap(){ return userChannelMap; }}

第二步:創建NettyServer,定義兩個EventLoopGroup,bossGroup輔助客戶端的tcp連接請求, workGroup負責與客戶端之前的讀寫操作,需要說明的是,需要開啟一個新的線程來執行netty server,要不然會阻塞主線程,到時候就無法調用項目的其他controller接口了。

package com.sixj.nettypush.websocket;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.handler.codec.http.HttpObjectAggregator;import io.netty.handler.codec.http.HttpServerCodec;import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;import io.netty.handler.codec.serialization.ObjectEncoder;import io.netty.handler.stream.ChunkedWriteHandler;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import java.net.InetSocketAddress;/** * @author sixiaojie * @date 2020-03-28-13:44 */@Componentpublic class NettyServer{ private static final Logger log = LoggerFactory.getLogger(NettyServer.class); /** * webSocket協議名 */ private static final String WEBSOCKET_PROTOCOL = 'WebSocket'; /** * 端口號 */ @Value('${webSocket.netty.port:58080}') private int port; /** * webSocket路徑 */ @Value('${webSocket.netty.path:/webSocket}') private String webSocketPath; @Autowired private WebSocketHandler webSocketHandler; private EventLoopGroup bossGroup; private EventLoopGroup workGroup; /** * 啟動 * @throws InterruptedException */ private void start() throws InterruptedException { bossGroup = new NioEventLoopGroup(); workGroup = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); // bossGroup輔助客戶端的tcp連接請求, workGroup負責與客戶端之前的讀寫操作 bootstrap.group(bossGroup,workGroup); // 設置NIO類型的channel bootstrap.channel(NioServerSocketChannel.class); // 設置監聽端口 bootstrap.localAddress(new InetSocketAddress(port)); // 連接到達時會創建一個通道 bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception {// 流水線管理通道中的處理程序(Handler),用來處理業務// webSocket協議本身是基于http協議的,所以這邊也要使用http編解碼器ch.pipeline().addLast(new HttpServerCodec());ch.pipeline().addLast(new ObjectEncoder());// 以塊的方式來寫的處理器ch.pipeline().addLast(new ChunkedWriteHandler());/*說明:1、http數據在傳輸過程中是分段的,HttpObjectAggregator可以將多個段聚合2、這就是為什么,當瀏覽器發送大量數據時,就會發送多次http請求 */ch.pipeline().addLast(new HttpObjectAggregator(8192));/*說明:1、對應webSocket,它的數據是以幀(frame)的形式傳遞2、瀏覽器請求時 ws://localhost:58080/xxx 表示請求的uri3、核心功能是將http協議升級為ws協議,保持長連接*/ch.pipeline().addLast(new WebSocketServerProtocolHandler(webSocketPath, WEBSOCKET_PROTOCOL, true, 65536 * 10));// 自定義的handler,處理業務邏輯ch.pipeline().addLast(webSocketHandler); } }); // 配置完成,開始綁定server,通過調用sync同步方法阻塞直到綁定成功 ChannelFuture channelFuture = bootstrap.bind().sync(); log.info('Server started and listen on:{}',channelFuture.channel().localAddress()); // 對關閉通道進行監聽 channelFuture.channel().closeFuture().sync(); } /** * 釋放資源 * @throws InterruptedException */ @PreDestroy public void destroy() throws InterruptedException { if(bossGroup != null){ bossGroup.shutdownGracefully().sync(); } if(workGroup != null){ workGroup.shutdownGracefully().sync(); } } @PostConstruct() public void init() { //需要開啟一個新的線程來執行netty server 服務器 new Thread(() -> { try {start(); } catch (InterruptedException e) {e.printStackTrace(); } }).start(); }}

第三步: 具體實現業務的WebSocketHandler,具體實現邏輯看注釋

package com.sixj.nettypush.websocket;import cn.hutool.json.JSONObject;import cn.hutool.json.JSONUtil;import com.sixj.nettypush.config.NettyConfig;import io.netty.channel.ChannelHandler;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;import io.netty.util.AttributeKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;/** * TextWebSocketFrame類型, 表示一個文本幀 * @author sixiaojie * @date 2020-03-28-13:47 */@Component@ChannelHandler.Sharablepublic class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { private static final Logger log = LoggerFactory.getLogger(NettyServer.class); /** * 一旦連接,第一個被執行 * @param ctx * @throws Exception */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { log.info('handlerAdded 被調用'+ctx.channel().id().asLongText()); // 添加到channelGroup 通道組 NettyConfig.getChannelGroup().add(ctx.channel()); } /** * 讀取數據 */ @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { log.info('服務器收到消息:{}',msg.text()); // 獲取用戶ID,關聯channel JSONObject jsonObject = JSONUtil.parseObj(msg.text()); String uid = jsonObject.getStr('uid'); NettyConfig.getUserChannelMap().put(uid,ctx.channel()); // 將用戶ID作為自定義屬性加入到channel中,方便隨時channel中獲取用戶ID AttributeKey<String> key = AttributeKey.valueOf('userId'); ctx.channel().attr(key).setIfAbsent(uid); // 回復消息 ctx.channel().writeAndFlush(new TextWebSocketFrame('服務器連接成功!')); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { log.info('handlerRemoved 被調用'+ctx.channel().id().asLongText()); // 刪除通道 NettyConfig.getChannelGroup().remove(ctx.channel()); removeUserId(ctx); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { log.info('異常:{}',cause.getMessage()); // 刪除通道 NettyConfig.getChannelGroup().remove(ctx.channel()); removeUserId(ctx); ctx.close(); } /** * 刪除用戶與channel的對應關系 * @param ctx */ private void removeUserId(ChannelHandlerContext ctx){ AttributeKey<String> key = AttributeKey.valueOf('userId'); String userId = ctx.channel().attr(key).get(); NettyConfig.getUserChannelMap().remove(userId); }}**第四步:**具體消息推送的接口public interface PushService { /** * 推送給指定用戶 * @param userId * @param msg */ void pushMsgToOne(String userId,String msg); /** * 推送給所有用戶 * @param msg */ void pushMsgToAll(String msg);}

接口實現類:

import java.util.concurrent.ConcurrentHashMap;/** * @author sixiaojie * @date 2020-03-30-20:10 */@Servicepublic class PushServiceImpl implements PushService { @Override public void pushMsgToOne(String userId, String msg){ ConcurrentHashMap<String, Channel> userChannelMap = NettyConfig.getUserChannelMap(); Channel channel = userChannelMap.get(userId); channel.writeAndFlush(new TextWebSocketFrame(msg)); } @Override public void pushMsgToAll(String msg){ NettyConfig.getChannelGroup().writeAndFlush(new TextWebSocketFrame(msg)); }}

controller:

package com.sixj.nettypush.controller;import com.sixj.nettypush.service.PushService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/** * @author sixiaojie * @date 2020-03-30-20:08 */@RestController@RequestMapping('/push')public class PushController { @Autowired private PushService pushService; /** * 推送給所有用戶 * @param msg */ @PostMapping('/pushAll') public void pushToAll(@RequestParam('msg') String msg){ pushService.pushMsgToAll(msg); } /** * 推送給指定用戶 * @param userId * @param msg */ @PostMapping('/pushOne') public void pushMsgToOne(@RequestParam('userId') String userId,@RequestParam('msg') String msg){ pushService.pushMsgToOne(userId,msg); }}

第五步:前端html頁面

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title></head><body><script> var socket; // 判斷當前瀏覽器是否支持webSocket if(window.WebSocket){ socket = new WebSocket('ws://192.168.174.25:58080/webSocket') // 相當于channel的read事件,ev 收到服務器回送的消息 socket.onmessage = function (ev) { var rt = document.getElementById('responseText'); rt.value = rt.value + 'n' + ev.data; } // 相當于連接開啟 socket.onopen = function (ev) { var rt = document.getElementById('responseText'); rt.value = '連接開啟了...' socket.send(JSON.stringify({ // 連接成功將,用戶ID傳給服務端 uid: '123456'}) ); } // 相當于連接關閉 socket.onclose = function (ev) { var rt = document.getElementById('responseText'); rt.value = rt.value + 'n' + '連接關閉了...'; } }else{ alert('當前瀏覽器不支持webSocket') }</script> <form onsubmit='return false'> <textarea style='height: 150px; width: 300px;'></textarea> <input type='button' value='清空內容' onclick='document.getElementById(’responseText’).value=’’'> </form></body></html>

目前為止,所有代碼已經寫完了,測試一下

首先運行這個html文件,會看到服務端給前端返回的消息“服務器連接成功了!”,后端日志會打印服務器收到消息:{'uid':'123456'}

SpringBoot+WebSocket+Netty實現消息推送的示例代碼

然后使用postman測試推送的接口

SpringBoot+WebSocket+Netty實現消息推送的示例代碼

測試成功,打完收工

到此這篇關于SpringBoot+WebSocket+Netty實現消息推送的示例代碼的文章就介紹到這了,更多相關SpringBoot+WebSocket+Netty消息推送內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 中文字幕亚洲一区二区va在线 | 国产成人91 | 波多野结衣 一区二区 | 久久综合久久综合久久综合 | 国产精品毛片久久久久久久 | 精品国产一区二区在线 | 婷婷亚洲综合 | 亚洲 欧美 日韩 在线 | 干一干操一操 | 国产三区四区 | 久久一本| 精品国产乱码久久久久久闺蜜 | 亚洲精品一区二区三区中文字幕 | av一区二区三区四区 | 久热热热 | 羞羞av在线 | 日韩欧美第一页 | 色官网 | 国产免费一区二区三区 | 国产精品视频一二三区 | 色视频久久 | a级在线观看 | 日韩一区二区在线观看 | 九色一区| 综合久久99| 日本久久久久久 | 亚洲一区中文字幕在线观看 | 少妇黄色一级片 | 久久免费电影 | 成人深夜在线 | 国产精品一区二区三区99 | 成人午夜激情 | 免费a爱片猛猛 | xnxx 日本19| 日韩视频一区二区三区 | 精品一区二区三区免费视频 | aaa久久| 国产a一三三四区电影 | 久久999免费视频 | 久久99精品国产麻豆婷婷洗澡 | 亚洲欧美一区二区三区视频 | 日韩一区在线播放 | 国产午夜精品一区二区三区嫩草 | 99精品视频一区二区三区 | 日韩在线免费观看视频 | 久久精品一区二区三区四区 | 一级电影免费在线观看 | 国产黄色大片 | 中文字幕在线看 | 91中文字幕在线 | 欧美激情精品久久久久久免费 | 中文字幕一区在线观看视频 | 欧美一二三 | www.成人| 欧美黄色一区 | 毛片a片| 综合久久色 | 我要看黄色一级大片 | 精品91久久久| 国产精品久久久久久久久 | 欧美一级黄色影院 | 国内精品在线视频 | 国产精品久久7777 | 国产区视频在线 | 国产精品久久久久一区二区三区共 | 99免费视频| 久久精品一区二区三区四区 | 国产精品久久电影观看 | 精品久久久一区 | av网址在线播放 | 亚洲国产精品久久久久秋霞不卡 | 天天干狠狠干 | 日韩激情免费视频 | 欧美日韩一区二区三区 | 人人干人人干人人 | 亚洲激情在线 | 久久久久久久一区 | 九色91九色porny永久 | 国产精品久热 | 在线观看91 | 日韩综合网 | 精品日韩一区 | 一区二区在线看 | 三级在线免费 | 剑来高清在线观看 | 日韩在线视频一区 | 精品无码久久久久国产 | 欧美高清视频一区 | 亚洲视频在线观看 | 伦理午夜电影免费观看 | 亚洲三区在线观看 | 在线播放亚洲 | 美女国产网站 | 国产中文字幕在线 | 三级在线免费 | 狠狠综合久久av一区二区老牛 | 精品黄网 | 免费成人av在线 | 成人免费看片 | 日本精品一区二区三区视频 | 成人三级视频网站 | 日韩在线免费 | 亚洲综合在线视频 | 91精品综合久久久久久五月天 | 成人午夜啪啪好大 | 精品美女久久久 | 国产高清在线看 | 欧美日韩精品一区二区三区在线观看 | 国产美女久久久 | 久久精品久久久久久 | 日韩精品一区二区三区四区视频 | 91麻豆精品国产91久久久资源速度 | 精品一区二区三 | 影视在线观看 | 91亚洲国产成人久久精品网站 | 亚洲视频 欧美视频 | 女人夜夜春高潮爽a∨片传媒 | 日韩精品网站在线观看 | 亚洲精品视频在线观看免费视频 | 91 在线观看 | 国产午夜精品久久久 | 欧美视频二区 | 不卡视频一二三区 | 日韩一区二区中文字幕 | 日韩中文一区 | 亚洲性生活免费视频 | 黄p在线看| 亚洲精品中文字幕在线观看 | 国模一区二区三区 | 国产精品久久久久久久久久 | 伊人激情网 | 国产精品毛片无码 | 亚洲精品1 | 97视频精品| 欧美三及片 | 色视频网站在线观看 | 在线视频成人 | 人人人射 | 国产999久久| 一区二区中文字幕 | 国产精品夜夜 | 一区二区在线视频 | 色婷婷一区二区三区四区 | 中文字幕日本视频 | 免费国产成人 | 国产综合网站 | 国产色婷婷精品综合在线播放 | 欧美在线综合视频 | 91久久国产综合久久 | 欧美精品中文字幕久久二区 | 青青草久| 中文在线一区 | 免费看一区二区三区 | 四虎成人在线播放 | 欧美日韩一区在线观看 | 亚洲久久| 日韩av在线一区 | 国产区精品 | 久久久久久久久中文字幕 | 日韩精品一区二区三区在线 | 欧美国产日韩另类 | 国产综合一区二区 | 成人av在线网 | www久久99| 久久精品一区 | 国产精彩视频 | 黄色一级毛片在线观看 | 欧美一级片免费看 | 久久一级| 伊人久久精品久久亚洲一区 | 91精品久久久久 | 亚洲成人在线观看视频 | 国产精品国色综合久久 | 欧美一区二区 | 精品日韩欧美 | 日韩影音 | 91久久爽久久爽爽久久片 | 视频在线一区二区 | 国产区免费在线观看 | 亚洲人人舔人人 | 精品一区二区三区视频 | 日韩中文一区二区三区 | 亚洲色图偷拍视频 | 男人的天堂在线视频 | 一区二区三区高清不卡 | 成人国产综合 | 国产精品久久久久久久久久妞妞 | 国产成人精品午夜视频免费 | 亚洲综合精品 | 欧美天天 | 国产成人精品亚洲日本在线观看 | 欧美一级做性受免费大片免费 | 精品无人乱码一区二区三区的优势 | 日韩三级| 精品天堂 | 欧美综合区| 日本一区二区三区在线视频 | 一区二区三区四区在线 | 精品久久不卡 | 国产美女在线播放 | 国产精品久久久久久久久免费高清 | 免费在线观看成年人视频 | 亚洲毛片在线 | 国产一级电影网 | 亚洲欧美日韩电影 | 久久久美女 | 成人欧美 | 日韩在线播放一区二区三区 | 日韩电影在线 | 视频在线一区二区 | 国产一区在线免费 | 久久久久久久久久久九 | 99精品全国免费观看视频软件 | 欧美日韩一区二区三区在线观看 | 最新日韩一区 | 国产久 | 噜噜噜视频在线观看 | 欧美日韩电影一区二区三区 | 亚洲 欧美 另类 综合 偷拍 | 亚洲一区视频在线播放 | 欧美性一区二区 | 成人国产在线观看 | 国产免费av网站 | 久久精品小视频 | 岛国一区 | 亚洲欧洲精品在线 | 丁香在线 | 国产欧美一区二区视频 | 亚洲国产精品久久久久久 | 久久久一区二区三区 | www国产精品 | 国产精品69毛片高清亚洲 | 亚洲精品一区在线观看 | 91精品国产91久久久久久蜜臀 | 视频在线一区 | 国产精品一区在线观看 | 亚洲精品一区二区三区在线播放 | 青草成人免费视频 | 中文字幕精品一区久久久久 | 国产农村妇女精品 | 伊人网91 | 伊人一区| 国产亚洲精品美女久久久久久久久久 | 精品久久久一 | 成人免费视频网站 | av中文在线 | 免费成人毛片 | 亚洲精品一区二区网址 | 国产高清亚洲 | 91麻豆精品国产91久久久久久 | 国产精品久久二区 | 91视频在线| 成人免费毛片高清视频 | 超碰在线9 | 成人看片在线观看 | 欧美久久久久 | 久久精品国产免费 | 国产精品亚洲第一 | 国产精品久久久久久久久久久久 | 麻豆专区一区二区三区四区五区 | 成人欧美一区二区三区黑人孕妇 | 日韩拍拍 | 一区二区精品视频在线观看 | 欧美日韩h | 精品久久国产 | 亚洲国产精品一区二区久久 | 一级特黄网站 | 亚洲一区二区三区精品视频 | 亚洲成人在线观看视频 | 天堂精品 | 日韩成人精品 | 国产视频色 | 精品一区免费观看 | av一区二区在线播放 | 亚洲一区丝袜 | 欧美精品一区二区三区在线 | 国产亚洲欧美在线 | 欧美电影一区 | 久久精品久久久久 | 久久久久久免费精品 | 中文字幕日韩一区二区三区 | 天堂精品| 日韩欧美一区二区三区免费观看 | 久久久精品网站 | 国产精品99久久免费观看 | 可以免费看黄视频的网站 | 999在线视频免费观看 | 天天夜碰日日摸日日澡 | 韩国三级午夜理伦三级三 | 日本福利视频网 | 激情综合色综合久久综合 | 久久久999精品视频 欧美老妇交乱视频 | 亚洲人成一区 | 中文字幕一区二区三区乱码在线 | 91视在线国内在线播放酒店 | 一区二区三区在线观看视频 | 中文在线一区二区 | 狠狠久久伊人中文字幕 | 日本免费三片免费观看 | 日韩极品视频 | 一区二区免费视频 | 日韩中文字 | 午夜私人影院在线观看 | 久久av免费 | 亚洲专区中文字幕 | 国内精品在线视频 | 成人中文字幕在线 | 欧美高清视频一区 | 在线日韩视频 | 久久精品国产一区 | 日韩性色视频 | 亚洲影视一区二区 | 国产在线日韩 | 欧洲毛片 | 国产成人网 | 天堂一区二区三区 | jizz中国zz女人18高潮 | 国产精品久久国产精品 | 精品视频一区二区三区 | 成年人网站在线免费观看 | 国产精品久久久久久久久福交 | 伊人春色网 | 欧美日韩一区二区在线 | 一区二区三区在线 | 欧 | 欧美精品91 | 亚洲午夜精品一区二区三区 | 亚洲精品在线播放视频 | 永久91嫩草亚洲精品人人 | 青青久久| 一级黄色录象片 | 日韩一级av毛片 | 日韩视频一区二区三区 | 国产亚洲视频在线 | 17c一起操| 日韩精品视频在线观看一区二区 | 日韩在线精品 | 国产午夜精品一区二区三区嫩草 | 成人网页| 日韩国产欧美一区 | 免费看一区二区三区 | 国产精品18久久久 | 人人干人人看 | 国产精品入口久久 | 天天舔夜夜操 | 91视频在线看 | 超碰天天 | 午夜a级理论片915影院 | 久草成人 | 欧美国产视频一区 | 羞羞视频免费观看 | 国产九九九 | 在线观看国精产品二区1819 | 九九精品视频在线 | 欧美a区 | 成人综合社区 | 午夜视频91| 美国一级毛片a | 亚洲h| 九九热精品视频 | 午夜av电影院 | 日韩成人在线一区 | 亚洲一区 日韩精品 中文字幕 | 国产精品久久久久久久久久久免费看 | 欧美综合在线一区 | 欧美日韩综合一区 | 国产精品揄拍一区二区久久国内亚洲精 | 亚洲国产精久久久久久久 | 久久激情网站 | 日韩视频精品 | 欧美日一区| 99精品久久久久久久免费 | 2020国产在线 | 久久久久国产一区二区三区 | 免费黄色毛片视频 | 成人影院在线 | 色小妹一二三区 | 国产精品久久久久久久久久三级 | 国产日韩一区二区 | 亚洲欧美日韩另类精品一区二区三区 | 思热99re视热频这里只精品 | 成人精品免费视频 | 精品久久久久久亚洲精品 | 中文字幕日韩久久 | 欧美日韩一级在线观看 | 久久久久一区二区 | 蜜桃comaaa | 在线视频亚洲 | www亚洲精品 | 久久国产高清 | 欧美一级免费在线观看 | 久久av综合 | 天天成人综合网 | 狠狠操夜夜操 | 中文字幕第一页在线 | 在线一区观看 | 天天干视频 | 成人高清视频在线观看 | 久久人人爽人人爽人人片av软件 | 国产三级精品在线 | www.久久| 91在线看片 | 亚洲综合在线网 | 亚洲成人日本 | 黄毛片网站 | 伊人网一区 | 91亚洲国产成人久久精品网站 | 亚洲精品国产setv | 日韩欧美久久 | 天天操网 | 精品在线一区二区三区 | 日韩在线视屏 | 免费的色网站 | 亚洲国产精品麻豆 | 亚洲欧美日韩精品 | 黄色免费成人 | 国产亚洲欧美在线 | 97久久香蕉国产线看观看 | 欧美日韩成人在线视频 | 国产天天操 | 中文字幕日韩专区 | 一区二区在线视频 | 成人免费共享视频 | 欧美寡妇偷汉性猛交 | 久免费视频 | 一区二区三区四区久久 | 成人免费一区二区三区视频网站 | 久久一级 | 亚洲国产成人在线 | 日韩有码一区 | 一级黄色片aaa | 夜夜超碰 | 亚洲色图3p | 草久网| 成年人视频在线观看免费 | 99视频免费观看 | 成人a毛片 | 久久9国产偷伦 | 国产一区免费在线观看 | 国产在线一级视频 | 三区在线 | 久久国产精品免费一区二区三区 | 亚洲精品日韩在线 | 国产日韩欧美精品一区二区 | 亚洲成人网在线 | 欧美日韩成人在线观看 | 成年人性视频 | 亚洲激情视频在线播放 | 国产免费拔擦拔擦8x高清在线人 | 国产免费一区二区 | 久久日本视频 | 国产精品一区在线 | 91亚洲精品乱码久久久久久蜜桃 | 国产最新精品视频 | 国产精品久久天天躁 | 久久久久久久99精品免费观看 | 国内福利视频 | 999视频在线免费观看 | 99视频在线 | 天天操夜夜操av | 欧美一级片毛片免费观看视频 | 天天舔天天干 | 精品国产一区二区三区成人影院 | 成人免费在线观看视频 | 亚洲人成在线观看 | 中文字幕在线观看一区二区三区 | 亚洲国产欧美在线 | 精品亚洲一区二区三区在线观看 | 久久久午夜爽爽一区二区三区三州 | 久久三区 | 成人一区二区三区在线观看 | 亚洲成人精品一区 | 久久久91| 日本久久久一区二区三区 | 不卡一二| 精品久久久久久久久久久院品网 | 中文字幕av一区二区三区 | 涩涩视频在线免费看 | 欧美a在线 | 日本久久精品视频 | 欧美精品一区二区三区在线 | 国产精品久久久一区二区 | 精品www| 国产专区一区二区三区 | 国产日韩一区二区三区 | 国产精品成人久久久久 | 91视频网址| 欧美高清视频一区二区三区 | 国产欧美精品 | 成年人看的羞羞网站 | 精品国产精品三级精品av网址 | 伊人久久国产 | 日韩www| 午夜影院在线观看视频 | 91久久 | 久久女同互慰一区二区三区 | 91久久精品国产亚洲a∨麻豆 | 亚洲久久在线 | 91极品在线| 性欧美久久久 | 91精品一区二区三区久久久久久 | 玖玖爱视频在线 | 欧美成年黄网站色视频 | 久久国内精品 | 国产一区二区三区久久久 | 欧美精品一区二区在线观看 | 亚欧洲精品视频在线观看 | 国产久| 国产精品综合 | 精品久久久久久久久久久 | 天堂亚洲网 | 国产日韩欧美视频 | 久久久久亚洲国产 | 日本久久二区 | 91麻豆精品国产91久久久更新时间 | 天天操一操 | 久久国产一区二区三区 | 欧美亚洲另类丝袜综合网动图 | 高清视频一区二区三区 | 五月婷婷综合激情网 | 日本一区二区在线视频 | 一区二区三区国产好 | 杏导航aⅴ福利网站 | 一级毛片观看 | 国产成人一区二区三区 | 欧美日韩一区二区在线观看 | 99re6热只有精品免费观看 | www国产成人免费观看视频,深夜成人网 | 91久久久久| 国产一级片 | 久久久精品一区二区三区 | 久久女同互慰一区二区三区 | 东北一级毛片 | 亚洲一区二区av | 精品久 | 中文字幕一区在线观看视频 | 亚洲国产字幕 | 日韩视频一区二区三区四区 | 国产精品乱码一区二区三区 | 中文字幕亚洲一区 | 国产高清视频一区二区 | 久国产精品视频 | 免费看的毛片 | 亚洲免费一区 | 理论片87福利理论电影 | 国产精品亚洲第一区在线暖暖韩国 | 日韩欧美黄色 | 久久国产精品一区二区 | 一区二区蜜桃 | 国产精品久久久久久亚洲影视 | 国产精品久久久久久久久久免费 | 在线看av的网址 | 久久精品久久久 | 综合色婷婷一区二区亚洲欧美国产 | 久久精品一 | 亚洲网站色 | 国产精品久久久久久久久久久久冷 | 99视频网 | 亚洲高清在线视频 | 国产精品99一区二区三区 | 国产第99页 | 欧美香蕉| 国产精品原创av | 激情网站免费观看 | jlzzjlzz国产精品久久 | 先锋av资源网 | 国产99久久精品 | 国产高清网站 | 亚洲视频在线观看一区二区三区 | 精品无码久久久久久国产 | 久久亚洲综合 | 伊人免费视频 | 国产精品丝袜一区二区 | 久久精品视频网站 | 最新国产福利在线 | 国产视频久久久 | 一区二区视频 | 免费福利视频一区二区三区 | 一区二区三区久久 | 手机看片369 | 亚洲午夜视频在线观看 | 日韩性视频 | 国产精品久久在线观看 | 日本jizz在线观看 | 国产一区在线视频 | 成人免费在线视频观看 | 欧美精品网 | 国产欧美日本 | 精品亚洲一区二区三区 | 欧美视频精品在线观看 | 日本久久久一区二区三区 | 国产精品久久久久久久一区探花 | 思九九爱九九 | 狠狠艹夜夜艹 | 国产精品久久久久久久久久久久久久 | 91亚洲精品久久久 | 中文av字幕 | 亚洲在线| 午夜天堂精品久久久久 | 国产成人精品综合 | 暖暖日本在线视频 | 日本成人福利视频 | 亚洲精品麻豆 | 狠狠的干 | 极品女神高潮呻吟av久久 | 青青草久久爱 | 一级片在线观看网站 | 成人a级网站 | av在线播放国产 | www中文字幕 | 亚洲精品9999 | 国产精品久久天天躁 | 成人在线视频网站 | 亚洲精品一区二区三区在线观看 | 亚洲免费电影一区 | 国产午夜久久 |