国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

萬字好文!Netty實現(xiàn)心跳機制與斷線重連

共 11597字,需瀏覽 24分鐘

 ·

2021-01-23 09:48

心跳機制

何為心跳

所謂心跳, 即在?TCP?長連接中, 客戶端和服務(wù)器之間定期發(fā)送的一種特殊的數(shù)據(jù)包, 通知對方自己還在線, 以確保?TCP?連接的有效性.

注:心跳包還有另一個作用,經(jīng)常被忽略,即:一個連接如果長時間不用,防火墻或者路由器就會斷開該連接

如何實現(xiàn)

核心Handler —— IdleStateHandler

在?Netty?中, 實現(xiàn)心跳機制的關(guān)鍵是?IdleStateHandler, 那么這個?Handler?如何使用呢? 先看下它的構(gòu)造器:

public?IdleStateHandler(int?readerIdleTimeSeconds,?int?writerIdleTimeSeconds,?int?allIdleTimeSeconds)?{
????this((long)readerIdleTimeSeconds,?(long)writerIdleTimeSeconds,?(long)allIdleTimeSeconds,?TimeUnit.SECONDS);
}

這里解釋下三個參數(shù)的含義:

  • readerIdleTimeSeconds: 讀超時. 即當(dāng)在指定的時間間隔內(nèi)沒有從?Channel?讀取到數(shù)據(jù)時, 會觸發(fā)一個?READER_IDLE?的?IdleStateEvent?事件.
  • writerIdleTimeSeconds: 寫超時. 即當(dāng)在指定的時間間隔內(nèi)沒有數(shù)據(jù)寫入到?Channel?時, 會觸發(fā)一個?WRITER_IDLE?的?IdleStateEvent?事件.
  • allIdleTimeSeconds: 讀/寫超時. 即當(dāng)在指定的時間間隔內(nèi)沒有讀或?qū)懖僮鲿r, 會觸發(fā)一個?ALL_IDLE?的?IdleStateEvent?事件.

注:這三個參數(shù)默認(rèn)的時間單位是。若需要指定其他時間單位,可以使用另一個構(gòu)造方法:IdleStateHandler(boolean observeOutput, long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit)

在看下面的實現(xiàn)之前,建議先了解一下IdleStateHandler的實現(xiàn)原理。

下面直接上代碼,需要注意的地方,會在代碼中通過注釋進行說明。

使用IdleStateHandler實現(xiàn)心跳

下面將使用IdleStateHandler來實現(xiàn)心跳,Client端連接到Server端后,會循環(huán)執(zhí)行一個任務(wù):隨機等待幾秒,然后ping一下Server端,即發(fā)送一個心跳包。當(dāng)?shù)却臅r間超過規(guī)定時間,將會發(fā)送失敗,以為Server端在此之前已經(jīng)主動斷開連接了。代碼如下:

Client端

ClientIdleStateTrigger —— 心跳觸發(fā)器

ClientIdleStateTrigger也是一個Handler,只是重寫了userEventTriggered方法,用于捕獲IdleState.WRITER_IDLE事件(未在指定時間內(nèi)向服務(wù)器發(fā)送數(shù)據(jù)),然后向Server端發(fā)送一個心跳包。

/**
?*?


?*??用于捕獲{@link?IdleState#WRITER_IDLE}事件(未在指定時間內(nèi)向服務(wù)器發(fā)送數(shù)據(jù)),然后向Server端發(fā)送一個心跳包。
?*?


?*/

public?class?ClientIdleStateTrigger?extends?ChannelInboundHandlerAdapter?{

????public?static?final?String?HEART_BEAT?=?"heart?beat!";

????@Override
????public?void?userEventTriggered(ChannelHandlerContext?ctx,?Object?evt)?throws?Exception?{
????????if?(evt?instanceof?IdleStateEvent)?{
????????????IdleState?state?=?((IdleStateEvent)?evt).state();
????????????if?(state?==?IdleState.WRITER_IDLE)?{
????????????????//?write?heartbeat?to?server
????????????????ctx.writeAndFlush(HEART_BEAT);
????????????}
????????}?else?{
????????????super.userEventTriggered(ctx,?evt);
????????}
????}

}
Pinger —— 心跳發(fā)射器
/**
?*?

客戶端連接到服務(wù)器端后,會循環(huán)執(zhí)行一個任務(wù):隨機等待幾秒,然后ping一下Server端,即發(fā)送一個心跳包。


?*/

public?class?Pinger?extends?ChannelInboundHandlerAdapter?{

????private?Random?random?=?new?Random();
????private?int?baseRandom?=?8;

????private?Channel?channel;

????@Override
????public?void?channelActive(ChannelHandlerContext?ctx)?throws?Exception?{
????????super.channelActive(ctx);
????????this.channel?=?ctx.channel();

????????ping(ctx.channel());
????}

????private?void?ping(Channel?channel)?{
????????int?second?=?Math.max(1,?random.nextInt(baseRandom));
????????System.out.println("next?heart?beat?will?send?after?"?+?second?+?"s.");
????????ScheduledFuture?future?=?channel.eventLoop().schedule(new?Runnable()?{
????????????@Override
????????????public?void?run()?{
????????????????if?(channel.isActive())?{
????????????????????System.out.println("sending?heart?beat?to?the?server...");
????????????????????channel.writeAndFlush(ClientIdleStateTrigger.HEART_BEAT);
????????????????}?else?{
????????????????????System.err.println("The?connection?had?broken,?cancel?the?task?that?will?send?a?heart?beat.");
????????????????????channel.closeFuture();
????????????????????throw?new?RuntimeException();
????????????????}
????????????}
????????},?second,?TimeUnit.SECONDS);

????????future.addListener(new?GenericFutureListener()?{
????????????@Override
????????????public?void?operationComplete(Future?future)?throws?Exception?{
????????????????if?(future.isSuccess())?{
????????????????????ping(channel);
????????????????}
????????????}
????????});
????}

????@Override
????public?void?exceptionCaught(ChannelHandlerContext?ctx,?Throwable?cause)?throws?Exception?{
????????//?當(dāng)Channel已經(jīng)斷開的情況下,?仍然發(fā)送數(shù)據(jù),?會拋異常,?該方法會被調(diào)用.
????????cause.printStackTrace();
????????ctx.close();
????}
}
ClientHandlersInitializer —— 客戶端處理器集合的初始化類
public?class?ClientHandlersInitializer?extends?ChannelInitializer<SocketChannel>?{

????private?ReconnectHandler?reconnectHandler;
????private?EchoHandler?echoHandler;

????public?ClientHandlersInitializer(TcpClient?tcpClient)?{
????????Assert.notNull(tcpClient,?"TcpClient?can?not?be?null.");
????????this.reconnectHandler?=?new?ReconnectHandler(tcpClient);
????????this.echoHandler?=?new?EchoHandler();
????}

????@Override
????protected?void?initChannel(SocketChannel?ch)?throws?Exception?{
????????ChannelPipeline?pipeline?=?ch.pipeline();
????????pipeline.addLast(new?LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,?0,?4,?0,?4));
????????pipeline.addLast(new?LengthFieldPrepender(4));
????????pipeline.addLast(new?StringDecoder(CharsetUtil.UTF_8));
????????pipeline.addLast(new?StringEncoder(CharsetUtil.UTF_8));
????????pipeline.addLast(new?Pinger());
????}
}

注:上面的Handler集合,除了Pinger,其他都是編解碼器和解決粘包,可以忽略。

TcpClient —— TCP連接的客戶端
public?class?TcpClient?{

????private?String?host;
????private?int?port;
????private?Bootstrap?bootstrap;
????/**?將Channel保存起來,?可用于在其他非handler的地方發(fā)送數(shù)據(jù)?*/
????private?Channel?channel;

????public?TcpClient(String?host,?int?port)?{
????????this(host,?port,?new?ExponentialBackOffRetry(1000,?Integer.MAX_VALUE,?60?*?1000));
????}

????public?TcpClient(String?host,?int?port,?RetryPolicy?retryPolicy)?{
????????this.host?=?host;
????????this.port?=?port;
????????init();
????}

????/**
?????*?向遠(yuǎn)程TCP服務(wù)器請求連接
?????*/

????public?void?connect()?{
????????synchronized?(bootstrap)?{
????????????ChannelFuture?future?=?bootstrap.connect(host,?port);
????????????this.channel?=?future.channel();
????????}
????}

????private?void?init()?{
????????EventLoopGroup?group?=?new?NioEventLoopGroup();
????????//?bootstrap?可重用,?只需在TcpClient實例化的時候初始化即可.
????????bootstrap?=?new?Bootstrap();
????????bootstrap.group(group)
????????????????.channel(NioSocketChannel.class)
????????????????.handler(new?ClientHandlersInitializer(TcpClient.this))
;
????}

????public?static?void?main(String[]?args)?{
????????TcpClient?tcpClient?=?new?TcpClient("localhost",?2222);
????????tcpClient.connect();
????}

}

Server端

ServerIdleStateTrigger —— 斷連觸發(fā)器
/**
?*?

在規(guī)定時間內(nèi)未收到客戶端的任何數(shù)據(jù)包,?將主動斷開該連接


?*/

public?class?ServerIdleStateTrigger?extends?ChannelInboundHandlerAdapter?{
????@Override
????public?void?userEventTriggered(ChannelHandlerContext?ctx,?Object?evt)?throws?Exception?{
????????if?(evt?instanceof?IdleStateEvent)?{
????????????IdleState?state?=?((IdleStateEvent)?evt).state();
????????????if?(state?==?IdleState.READER_IDLE)?{
????????????????//?在規(guī)定時間內(nèi)沒有收到客戶端的上行數(shù)據(jù),?主動斷開連接
????????????????ctx.disconnect();
????????????}
????????}?else?{
????????????super.userEventTriggered(ctx,?evt);
????????}
????}
}
ServerBizHandler —— 服務(wù)器端的業(yè)務(wù)處理器
/**
?*?

收到來自客戶端的數(shù)據(jù)包后,?直接在控制臺打印出來.


?*/

@ChannelHandler.Sharable
public?class?ServerBizHandler?extends?SimpleChannelInboundHandler<String>?{

????private?final?String?REC_HEART_BEAT?=?"I?had?received?the?heart?beat!";

????@Override
????protected?void?channelRead0(ChannelHandlerContext?ctx,?String?data)?throws?Exception?{
????????try?{
????????????System.out.println("receive?data:?"?+?data);
//????????????ctx.writeAndFlush(REC_HEART_BEAT);
????????}?catch?(Exception?e)?{
????????????e.printStackTrace();
????????}
????}

????@Override
????public?void?channelActive(ChannelHandlerContext?ctx)?throws?Exception?{
????????System.out.println("Established?connection?with?the?remote?client.");

????????//?do?something

????????ctx.fireChannelActive();
????}

????@Override
????public?void?channelInactive(ChannelHandlerContext?ctx)?throws?Exception?{
????????System.out.println("Disconnected?with?the?remote?client.");

????????//?do?something

????????ctx.fireChannelInactive();
????}

????@Override
????public?void?exceptionCaught(ChannelHandlerContext?ctx,?Throwable?cause)?throws?Exception?{
????????cause.printStackTrace();
????????ctx.close();
????}
}
ServerHandlerInitializer —— 服務(wù)器端處理器集合的初始化類
/**
?*?

用于初始化服務(wù)器端涉及到的所有Handler


?*/

public?class?ServerHandlerInitializer?extends?ChannelInitializer<SocketChannel>?{

????protected?void?initChannel(SocketChannel?ch)?throws?Exception?{
????????ch.pipeline().addLast("idleStateHandler",?new?IdleStateHandler(5,?0,?0));
????????ch.pipeline().addLast("idleStateTrigger",?new?ServerIdleStateTrigger());
????????ch.pipeline().addLast("frameDecoder",?new?LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,?0,?4,?0,?4));
????????ch.pipeline().addLast("frameEncoder",?new?LengthFieldPrepender(4));
????????ch.pipeline().addLast("decoder",?new?StringDecoder());
????????ch.pipeline().addLast("encoder",?new?StringEncoder());
????????ch.pipeline().addLast("bizHandler",?new?ServerBizHandler());
????}

}

注:new IdleStateHandler(5, 0, 0)handler代表如果在5秒內(nèi)沒有收到來自客戶端的任何數(shù)據(jù)包(包括但不限于心跳包),將會主動斷開與該客戶端的連接。

TcpServer —— 服務(wù)器端
public?class?TcpServer?{
????private?int?port;
????private?ServerHandlerInitializer?serverHandlerInitializer;

????public?TcpServer(int?port)?{
????????this.port?=?port;
????????this.serverHandlerInitializer?=?new?ServerHandlerInitializer();
????}

????public?void?start()?{
????????EventLoopGroup?bossGroup?=?new?NioEventLoopGroup(1);
????????EventLoopGroup?workerGroup?=?new?NioEventLoopGroup();
????????try?{
????????????ServerBootstrap?bootstrap?=?new?ServerBootstrap();
????????????bootstrap.group(bossGroup,?workerGroup)
????????????????????.channel(NioServerSocketChannel.class)
????????????????????.childHandler(this.serverHandlerInitializer)
;
????????????//?綁定端口,開始接收進來的連接
????????????ChannelFuture?future?=?bootstrap.bind(port).sync();

????????????System.out.println("Server?start?listen?at?"?+?port);
????????????future.channel().closeFuture().sync();
????????}?catch?(Exception?e)?{
????????????bossGroup.shutdownGracefully();
????????????workerGroup.shutdownGracefully();
????????????e.printStackTrace();
????????}
????}

????public?static?void?main(String[]?args)?throws?Exception?{
????????int?port?=?2222;
????????new?TcpServer(port).start();
????}
}

至此,所有代碼已經(jīng)編寫完畢。

測試

首先啟動客戶端,再啟動服務(wù)器端。啟動完成后,在客戶端的控制臺上,可以看到打印如下類似日志:

客戶端控制臺輸出的日志

在服務(wù)器端可以看到控制臺輸出了類似如下的日志:

服務(wù)器端控制臺輸出的日志

可以看到,客戶端在發(fā)送4個心跳包后,第5個包因為等待時間較長,等到真正發(fā)送的時候,發(fā)現(xiàn)連接已斷開了;而服務(wù)器端收到客戶端的4個心跳數(shù)據(jù)包后,遲遲等不到下一個數(shù)據(jù)包,所以果斷斷開該連接。

在測試過程中,有可能會出現(xiàn)如下情況:

異常情況

出現(xiàn)這種情況的原因是:在連接已斷開的情況下,仍然向服務(wù)器端發(fā)送心跳包。雖然在發(fā)送心跳包之前會使用判斷連接是否可用,但也有可能上一刻判斷結(jié)果為可用,但下一刻發(fā)送數(shù)據(jù)包之前,連接就斷了。

目前尚未找到優(yōu)雅處理這種情況的方案,各位看官如果有好的解決方案,還望不吝賜教。拜謝?。?!

斷線重連

斷線重連這里就不過多介紹,相信各位都知道是怎么回事。這里只說大致思路,然后直接上代碼。

實現(xiàn)思路

客戶端在監(jiān)測到與服務(wù)器端的連接斷開后,或者一開始就無法連接的情況下,使用指定的重連策略進行重連操作,直到重新建立連接或重試次數(shù)耗盡。

對于如何監(jiān)測連接是否斷開,則是通過重寫ChannelInboundHandler#channelInactive來實現(xiàn),但連接不可用,該方法會被觸發(fā),所以只需要在該方法做好重連工作即可。

代碼實現(xiàn)

注:以下代碼都是在上面心跳機制的基礎(chǔ)上修改/添加的。

因為斷線重連是客戶端的工作,所以只需對客戶端代碼進行修改。

重試策略

RetryPolicy —— 重試策略接口

public?interface?RetryPolicy?{

????/**
?????*?Called?when?an?operation?has?failed?for?some?reason.?This?method?should?return
?????*?true?to?make?another?attempt.
?????*
?????*?@param?retryCount?the?number?of?times?retried?so?far?(0?the?first?time)
?????*?@return?true/false
?????*/

????boolean?allowRetry(int?retryCount);

????/**
?????*?get?sleep?time?in?ms?of?current?retry?count.
?????*
?????*?@param?retryCount?current?retry?count
?????*?@return?the?time?to?sleep
?????*/

????long?getSleepTimeMs(int?retryCount);
}

ExponentialBackOffRetry —— 重連策略的默認(rèn)實現(xiàn)

/**
?*?

Retry?policy?that?retries?a?set?number?of?times?with?increasing?sleep?time?between?retries


?*/

public?class?ExponentialBackOffRetry?implements?RetryPolicy?{

????private?static?final?int?MAX_RETRIES_LIMIT?=?29;
????private?static?final?int?DEFAULT_MAX_SLEEP_MS?=?Integer.MAX_VALUE;

????private?final?Random?random?=?new?Random();
????private?final?long?baseSleepTimeMs;
????private?final?int?maxRetries;
????private?final?int?maxSleepMs;

????public?ExponentialBackOffRetry(int?baseSleepTimeMs,?int?maxRetries)?{
????????this(baseSleepTimeMs,?maxRetries,?DEFAULT_MAX_SLEEP_MS);
????}

????public?ExponentialBackOffRetry(int?baseSleepTimeMs,?int?maxRetries,?int?maxSleepMs)?{
????????this.maxRetries?=?maxRetries;
????????this.baseSleepTimeMs?=?baseSleepTimeMs;
????????this.maxSleepMs?=?maxSleepMs;
????}

????@Override
????public?boolean?allowRetry(int?retryCount)?{
????????if?(retryCount?????????????return?true;
????????}
????????return?false;
????}

????@Override
????public?long?getSleepTimeMs(int?retryCount)?{
????????if?(retryCount?0)?{
????????????throw?new?IllegalArgumentException("retries?count?must?greater?than?0.");
????????}
????????if?(retryCount?>?MAX_RETRIES_LIMIT)?{
????????????System.out.println(String.format("maxRetries?too?large?(%d).?Pinning?to?%d",?maxRetries,?MAX_RETRIES_LIMIT));
????????????retryCount?=?MAX_RETRIES_LIMIT;
????????}
????????long?sleepMs?=?baseSleepTimeMs?*?Math.max(1,?random.nextInt(1?<????????if?(sleepMs?>?maxSleepMs)?{
????????????System.out.println(String.format("Sleep?extension?too?large?(%d).?Pinning?to?%d",?sleepMs,?maxSleepMs));
????????????sleepMs?=?maxSleepMs;
????????}
????????return?sleepMs;
????}
}

ReconnectHandler—— 重連處理器

@ChannelHandler.Sharable
public?class?ReconnectHandler?extends?ChannelInboundHandlerAdapter?{

????private?int?retries?=?0;
????private?RetryPolicy?retryPolicy;

????private?TcpClient?tcpClient;

????public?ReconnectHandler(TcpClient?tcpClient)?{
????????this.tcpClient?=?tcpClient;
????}

????@Override
????public?void?channelActive(ChannelHandlerContext?ctx)?throws?Exception?{
????????System.out.println("Successfully?established?a?connection?to?the?server.");
????????retries?=?0;
????????ctx.fireChannelActive();
????}

????@Override
????public?void?channelInactive(ChannelHandlerContext?ctx)?throws?Exception?{
????????if?(retries?==?0)?{
????????????System.err.println("Lost?the?TCP?connection?with?the?server.");
????????????ctx.close();
????????}

????????boolean?allowRetry?=?getRetryPolicy().allowRetry(retries);
????????if?(allowRetry)?{

????????????long?sleepTimeMs?=?getRetryPolicy().getSleepTimeMs(retries);

????????????System.out.println(String.format("Try?to?reconnect?to?the?server?after?%dms.?Retry?count:?%d.",?sleepTimeMs,?++retries));

????????????final?EventLoop?eventLoop?=?ctx.channel().eventLoop();
????????????eventLoop.schedule(()?->?{
????????????????System.out.println("Reconnecting?...");
????????????????tcpClient.connect();
????????????},?sleepTimeMs,?TimeUnit.MILLISECONDS);
????????}
????????ctx.fireChannelInactive();
????}


????private?RetryPolicy?getRetryPolicy()?{
????????if?(this.retryPolicy?==?null)?{
????????????this.retryPolicy?=?tcpClient.getRetryPolicy();
????????}
????????return?this.retryPolicy;
????}
}

ClientHandlersInitializer

在之前的基礎(chǔ)上,添加了重連處理器ReconnectHandler。

public?class?ClientHandlersInitializer?extends?ChannelInitializer<SocketChannel>?{

????private?ReconnectHandler?reconnectHandler;
????private?EchoHandler?echoHandler;

????public?ClientHandlersInitializer(TcpClient?tcpClient)?{
????????Assert.notNull(tcpClient,?"TcpClient?can?not?be?null.");
????????this.reconnectHandler?=?new?ReconnectHandler(tcpClient);
????????this.echoHandler?=?new?EchoHandler();
????}

????@Override
????protected?void?initChannel(SocketChannel?ch)?throws?Exception?{
????????ChannelPipeline?pipeline?=?ch.pipeline();
????????pipeline.addLast(this.reconnectHandler);
????????pipeline.addLast(new?LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,?0,?4,?0,?4));
????????pipeline.addLast(new?LengthFieldPrepender(4));
????????pipeline.addLast(new?StringDecoder(CharsetUtil.UTF_8));
????????pipeline.addLast(new?StringEncoder(CharsetUtil.UTF_8));
????????pipeline.addLast(new?Pinger());
????}
}

TcpClient

在之前的基礎(chǔ)上添加重連、重連策略的支持。

public?class?TcpClient?{

????private?String?host;
????private?int?port;
????private?Bootstrap?bootstrap;
????/**?重連策略?*/
????private?RetryPolicy?retryPolicy;
????/**?將Channel保存起來,?可用于在其他非handler的地方發(fā)送數(shù)據(jù)?*/
????private?Channel?channel;

????public?TcpClient(String?host,?int?port)?{
????????this(host,?port,?new?ExponentialBackOffRetry(1000,?Integer.MAX_VALUE,?60?*?1000));
????}

????public?TcpClient(String?host,?int?port,?RetryPolicy?retryPolicy)?{
????????this.host?=?host;
????????this.port?=?port;
????????this.retryPolicy?=?retryPolicy;
????????init();
????}

????/**
?????*?向遠(yuǎn)程TCP服務(wù)器請求連接
?????*/

????public?void?connect()?{
????????synchronized?(bootstrap)?{
????????????ChannelFuture?future?=?bootstrap.connect(host,?port);
????????????future.addListener(getConnectionListener());
????????????this.channel?=?future.channel();
????????}
????}

????public?RetryPolicy?getRetryPolicy()?{
????????return?retryPolicy;
????}

????private?void?init()?{
????????EventLoopGroup?group?=?new?NioEventLoopGroup();
????????//?bootstrap?可重用,?只需在TcpClient實例化的時候初始化即可.
????????bootstrap?=?new?Bootstrap();
????????bootstrap.group(group)
????????????????.channel(NioSocketChannel.class)
????????????????.handler(new?ClientHandlersInitializer(TcpClient.this))
;
????}

????private?ChannelFutureListener?getConnectionListener()?{
????????return?new?ChannelFutureListener()?{
????????????@Override
????????????public?void?operationComplete(ChannelFuture?future)?throws?Exception?{
????????????????if?(!future.isSuccess())?{
????????????????????future.channel().pipeline().fireChannelInactive();
????????????????}
????????????}
????????};
????}

????public?static?void?main(String[]?args)?{
????????TcpClient?tcpClient?=?new?TcpClient("localhost",?2222);
????????tcpClient.connect();
????}

}

測試

在測試之前,為了避開?Connection reset by peer?異常,可以稍微修改Pingerping()方法,添加if (second == 5)的條件判斷。如下:

private?void?ping(Channel?channel)?{
????????int?second?=?Math.max(1,?random.nextInt(baseRandom));
????????if?(second?==?5)?{
????????????second?=?6;
????????}
????????System.out.println("next?heart?beat?will?send?after?"?+?second?+?"s.");
????????ScheduledFuture?future?=?channel.eventLoop().schedule(new?Runnable()?{
????????????@Override
????????????public?void?run()?{
????????????????if?(channel.isActive())?{
????????????????????System.out.println("sending?heart?beat?to?the?server...");
????????????????????channel.writeAndFlush(ClientIdleStateTrigger.HEART_BEAT);
????????????????}?else?{
????????????????????System.err.println("The?connection?had?broken,?cancel?the?task?that?will?send?a?heart?beat.");
????????????????????channel.closeFuture();
????????????????????throw?new?RuntimeException();
????????????????}
????????????}
????????},?second,?TimeUnit.SECONDS);

????????future.addListener(new?GenericFutureListener()?{
????????????@Override
????????????public?void?operationComplete(Future?future)?throws?Exception?{
????????????????if?(future.isSuccess())?{
????????????????????ping(channel);
????????????????}
????????????}
????????});
????}

啟動客戶端

先只啟動客戶端,觀察控制臺輸出,可以看到類似如下日志:

斷線重連測試——客戶端控制臺輸出

可以看到,當(dāng)客戶端發(fā)現(xiàn)無法連接到服務(wù)器端,所以一直嘗試重連。隨著重試次數(shù)增加,重試時間間隔越大,但又不想無限增大下去,所以需要定一個閾值,比如60s。如上圖所示,當(dāng)下一次重試時間超過60s時,會打印Sleep extension too large(*). Pinning to 60000,單位為ms。出現(xiàn)這句話的意思是,計算出來的時間超過閾值(60s),所以把真正睡眠的時間重置為閾值(60s)。

啟動服務(wù)器端

接著啟動服務(wù)器端,然后繼續(xù)觀察客戶端控制臺輸出。

圖片

斷線重連測試——服務(wù)器端啟動后客戶端控制臺輸出

可以看到,在第9次重試失敗后,第10次重試之前,啟動的服務(wù)器,所以第10次重連的結(jié)果為,即成功連接到服務(wù)器。接下來因為還是不定時服務(wù)器,所以出現(xiàn)斷線重連、斷線重連的循環(huán)。

擴展

在不同環(huán)境,可能會有不同的重連需求。有不同的重連需求的,只需自己實現(xiàn)RetryPolicy接口,然后在創(chuàng)建TcpClient的時候覆蓋默認(rèn)的重連策略即可。

源:jianshu.com/p/1a28e48edd92

版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),我們都會標(biāo)明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!





感謝閱讀



瀏覽 52
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 色黄视频在线观看| 人妻少妇无码精品| 一级黄色录像视频| 国产女人高潮的AV毛片| 男人天堂手机视频| 欧美精品成人| 嫩BBB槡BBBB槡BBBB撒尿| 日本白浆| 青青青国产在线| 国产性爱电影网| 亚洲无码电影在线| 亚洲五月丁香| 九九视频免费观看| 成人午夜无码| 91porn国产| 亚洲香蕉av| 91免费视频网站| 一本色道久久88加勒比| 天堂网中文| 竹菊传媒一区二区三区| 色哟哟一区| 五月丁香综合久久| 国产免费无码一区二区| 一级黄色视频在线观看| 国产免费a片| 日韩激情av| 91亚洲国产成人精品一区二区三 | 伊人伊人网| 最新毛片网站〖网:.〗| 日韩字幕| 欧美性爱视频网站| 亚洲a在线观看| 四川少扫搡BBBBB搡B| 欧美日韩免费视频| 蜜臀久久99精品久久久| 伊人色综合网| 国精产品一区二区三区在线观看 | 久草在线| 强伦轩农村人妻| 一区二区三区高清| 欧美高清视频| 国产精品黄色片| 91视频网站免费| 麻豆熟妇乱妇熟色A片在线看| 久久久免费黄色视频| 日韩中文字幕在线观看| 免费看a| 久久人爽| 一本色道久久综合亚洲精品小说 | 日韩天堂在线观看| 91熊猫| 操穴网| 国产一级电影网站| 看国产毛片| 最新午夜综合福利视频| 樱桃码一区二区三区| 欧美成视频| 黄色大片免费观看| 天天视频黄色| 午夜福利大香蕉| 内射老熟女| 成人动漫| 韩国gogogo高清在线完整版| 国产无码电影网| 综合久久久久| 亚洲精品鲁一鲁一区二区三区| 欧美伊人网在线观看| wwwA片| 五月天婷婷视频| 无码精品人妻一区二区三区漫画| 成人网站毛片| 特级A级毛片| 免费av片| 日韩AV无码专区亚洲AV| 97视频国产| 五月大香蕉| 色射爱| 蜜桃91在线| 99热在线观看者| 久久yy| 97人妻人人操| 五月色视频| 91国产精品视频在线| 看一级黄色毛片| 久久偷拍视频| 国产内射视频| 中文字字幕在线中文乱码更新时间 | 老湿机福利视频| 安微妇搡BBBB搡BBBB| 不卡在线| 日韩高清无码片| 黄片中文字幕| 成人免费视频网| 亚洲另类自拍| 亚洲欧美视频一区| 欧美成年人视频| 俺去俺来也在线www色情网| 国产99页| 97精品人妻一区二区| 动漫精品一区二区| 天天综合在线观看| 五月丁香花视频| 另类老妇性BBwBBw图片| 99草在线视频| 人人上人人摸| 美日韩一区二区三区| 久久精品在线播放| 人妻制服丝袜| 国产第一精品| 亚洲美女在线观看| 欧美黄色成人网站| 天堂网2014| 视频一区二区三区在线观看| 伊人久久爱| 黄色三级毛片| 香蕉久久网| 国内精品久久久| av高清| 亚洲AV成人片无码网站网蜜柚| 色五月综合| 狠狠撸狠狠干| 亚洲AV免费在线观看| 亚洲无码高清在线观看| 91综合网| gogogo高清在线观看免费直播中国| 丹麦电影《下午》| 日韩午夜欧美精品一二三区| 日韩一级电影在线| 欧美男人天堂网| 国产精品色婷婷| 中文字幕成人在线播放| 18禁无码网站| 蜜芽成人精品久久久视频| 国产乱╳╳AⅤ毛片| 亚洲人妻有码| 91精品国产一区二区| 精品无码人妻一区二区三区| 五月丁香狠狠爱| xxxxx日韩| 日韩一区二区免费视频| 在线免费观看黄色电影| 91中文字幕在线| 久久久影院| 午夜毛片| 无套进入无套内谢| 94精品人人人| 日韩一区二区三区四区久久久精品有吗 | 色吟av| 按摩性高湖婬AAA片A片中国| 丰满大爆乳波霸奶| 国语精品自拍| 鸡巴操骚逼视频| 日皮视频在线免费观看| 婷婷色色网| 99久久久久久久| 精品国产三级| 三级视频在线播放| 污污的网站18| 熟女人妻一区二区三区免费看| 大香蕉九九| 丁香六月色| 人妻无码久久精品| 911精品人妻一区二区三区A片 | 69AV在线| 青青草无码在线视频| 99久久久久久久无码| 成人一级黄色电影| 呦小性Free小U女HD| 国产第56页| 亚洲高清无码在线视频| 91人妻人人爽人人爽| A无码| 人人妻人人澡人人爽久久con | 无码在线免费视频| 国产十八岁在线观看| 久久久一区二区| 中文字幕在线观看a| 日韩免费在线观看| 亚洲国产成人无码a在线播放| 亚洲乱伦网站| 另类老妇奶BBBBwBB| 久久午夜无码鲁丝片| 无码免费看| 高清无码学生妹| 久草在线资源| 粉嫩99精品99久久久久久特污| 黄片无码视频| 成人av中文字幕| 国内成人精品| 国产一区二区三区在线| 91精品国产闺蜜国产在线闺蜜| 国产精品2| 在线播放国产精品| 国产三级AV在线| 大香蕉官网| 日韩黄色一级片| 伊人五月婷婷| 欧美成人综合色| 欧美亚洲日韩在线观看| 亚洲福利在线观看视频| 国产黄色精品| 五月天激情爱爱| 一本色道久久综合狠狠躁| 亚洲欧洲高清无码| 人人操人人摸人人看| 亚洲做爱视频| 欧美激情视频一区二区三区不卡| 日韩aaaa| 五月婷在线视频| 在线观看中文字幕AV| 一级日逼| 国产AV影院| 人人操人人透| 成人黄色录像| 亚洲人成免费| 国产91在线播放| www.国产豆花精品区| 69性影院| 熟妇熟女一区二区三区| 99精品视频国产| 91狠狠色丁香婷婷综合久久精品| 西西西444www无码视| 亚洲无码视频免费观看| AV影音在线| 有码视频在线观看| 三级网站免费观看| 蜜臀久久99精品久久久老牛影视| 亚洲乱码国产乱码精品天美传媒| 91久久久久久久久久| 热99在线| 不卡视频在线| 国产美女一级特黄大片| 91.n| 骚五月| 香蕉一区| 亚洲精品三级在线观看| 亚洲AV成人一区二区三区不卡| 簧片网站在线观看| 日韩乱伦小说| 亚洲精品无码在线播放| 日韩一级免费在线观看| 人成视频在线免费观看| 中文字幕视频一区| 起碰在线视频| 国产成人精品一区| 成人网| 懂色av一区蜜桃| 9一区二区三区| 国产成人无码AⅤ片免费播放| 成人自拍网| 国产在线成人视频| 中文字幕第一页av| AV一区二区三区四区| 黄色成人视频在线观看| 91人人妻人人做人人爽| 亚洲无码精品一区二区三区| 一级A片60分钟免费看| 美女视频黄a视频全免费不卡 | 国产精品免费一区二区三区四区视频 | www.777av| 在线看A片| 成人才看的在线视频| 综合久久中文字幕| 久久久久久久国产精品| 超碰在线日韩| 日韩夜夜操| 欧美性爱在线视频| 中文字幕视频在线直播| 激情免费网站| 中文日韩欧美| 日本少妇高清视频| 天天操天天日天天射| 成全在线观看高清的| 操东北老女人| 大香蕉电影网站| 日韩无码五月天| 免费无码视频在线观看| 国产卡一卡二在线观看| 97视频国产| 国产一级特黄A片| 麻豆一区视频| 91熟女偷情| 亚洲人体视频| 夜色福利网| 蜜桃av无码一区三区| 国模私拍视频| 亚洲无码p| 亚洲无码av在线观看| 黄色小视频在线免费观看| 2015中文字幕黄色视频| 国产亲子乱婬一级A片借种| 国产黄色视频免费| 2016av天堂网| 久草在| 久久嫩草精品久久久久| 亚洲一级免费在线观看| 亚洲AV秘成人久久无码海归| 国产靠逼| 骚视频网站| 亚洲小视频在线播放| 91无码精品一区二区| 怡红院成人AV| 在线A视频| 亚洲欧美中文字幕| 99精品国产热久久91色欲 | 三级片一区| 欧美一区二区无码视频| 九九九九九九精品视频| 色老板最新网址| 国产无码AV大片| 国产又粗又黄| 九九精品热| 北条麻妃二区三区| 热久在线| 国产97热人人| 亚洲激色| 俺来也AV| 免费黄色小视频在线观看| 豆花在线视频| 国产精品黄色| 亚洲AV无码久久久| 五月婷婷丁香综合| 麻豆精品在线播放| 毛片操逼视频| 国产主播在线观看| 黄色电影av| 熟女人妻人妻HD| 国产精品欧美性爱| 成人在线不卡| 欧美国产日韩欧美亚洲国产| 国产在线播放91| 91天堂| 日韩二级片| 粉嫩小泬BBBBBB免费| 大奶一区二区| 亚洲电影在线| 99热在线免费观看| 猛男大粗猛爽H男人味| 一级a片在线观看| 伊人三级网| 成人亚洲A片V一区二区三区蜜月| 91少妇精品| 人人摸人人操人人干| 亚洲天堂在线免费观看| 国产精品被狂躁到高潮| 成人第一页| 操B视频在线| 亚欧免费视频| 精品少妇3p| 国产在线视频91| 天天干天天日天天操| 色悠悠国产| 日韩欧美高清视频| 国内超碰| 大香蕉91| 欧美性综合网| 亚洲第一av| 欧美老女人的逼| 一本色道久久综合无码欧美| 亚洲日韩精品在线视频| 日韩AV中文字幕在线| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV | 麻豆免费成人视频| 天天干在线观看视频| 手机看片1024旧版| 日产精品久久| 九九国产| 香蕉成人视频| 欧美A片在线| 亚洲天堂天天| 澳门四虎影院| 日韩av中文在线| 69国产在线| 美女黄色视频永费在线观看网站| 四虎AV在线| www.国产豆花精品区| 一区二区入口| 人人妻人人澡人人爽久久con | 性爱精品视频| 国产熟女| 人人操人人爽人人爱| 三区在线| 操逼第二页| 午夜福利久久| 岛国av无码免费| 日本爽妇网| 国产第八页| 人人色在线| 国内精品人妻无码久久久影院蜜桃 | 国产精品无码成人AV电影| 亚洲第1页| 西西444WWW无码大胆在线观看| 中文无码日韩欧美久久| 最美人妖系列国产Ts涵涵| 中文字幕精品亚洲熟女| 日逼高清视频| 成人第一页| 精品三级在线观看| 国产高清视频在线观看| av牛牛| 一区二区高清无码| 日韩免费黄色视频| 九九r在线精品观看视频| 日本老熟妇| 中文字幕的色| 大香蕉超碰在线| 国产免看一级a一片成人aⅴ| 777免费视频| 国产精品免费一区二区三区四区视频 | 在线观看黄色小视频| 伊人久久香蕉网| 亚洲黄色在线| 婷色五月天| 亚洲美女网站在线观看| www.99精品| 亚洲无码人妻在线| 动漫3d啪啪成人h动漫| 日韩AV电影网站| 欧美黄色小说| 开心色情| 五月婷婷六月激情| 好看的中文字幕av| 高H视频在线观看| 国产精品一区一区三区| 欧美成人三级在线| 亚洲黄片在线| 亚洲视频欧美视频| 做爱激情视频网站| 国产精品久久久久久久久久久久久久久久 | 美腿丝袜中文字幕精品| 99久久精品一区二区成人| 精品av| 日本色天堂| 天天操操操| 91jiujiu| 青青国产在线观看| 超碰在线观看97| 青在线视频| 这里视频很精彩免费观看电视剧最新| 亚洲无aV在线中文字幕| 国产三级一区二区| 日本高清一区二区高清免费视频| 亚洲午夜福利在线| 亚洲综合另类| 强伦人妻一区二区三区视频| 国产操| 久久久WWW成人免费精品| 日本黄色视频。| 视频一区中文字幕| 日韩AV无码一区二区三区| 国产精品成人3p一区二区三区| 淫揉BBB揉揉揉BBBBB| 日韩爆乳一区二区三区| 久久精品视频在线免费观看| 特黄毛片| 成人在线免费电影| 无码人妻一区二区三区三| 51乱伦| 中文字幕av一区二区| 国产精品999999| 中文字幕你懂的在线三级| 色婷婷AV一区二区三区软件| 动漫啪啪视频| 亚洲色图在线观看| 99视频久久| 囯产精品一区二区三区AV做线 | 99re视频在线| www.俺去| 少妇的屄| 国产婷婷色一区二区| 国产性爱在线观看| 天天看片天天爽| 婷婷久久久久久| 成人激情视频A极| 精品毛片| 亚洲精品女人久久久| 国产精品伦子伦免费视频| AV一区二区三区| 小视频+福利| av网站在线免费观看| 人妻中文字幕久久| 亚洲高清国产欧美综合s8| 亚洲日本欧美| 丁香五月五月婷婷| 中文字幕免费无码| 欧美一区电影| 亚洲男人天堂网| 天天日天天射天天干| 国产口爆在线观看| 男女拍拍拍拍| 精品人妻一区二区三区日产乱码 | 成人做爰黄A片免费看直播室动漫| 狠狠躁日日躁夜夜躁2022麻豆| 无码视频中文字幕| 精品人妻无码一区二区三区| 熟女探花精选| 爱爱视频日本| 亚洲综合视频在线| 内射无码视频| 蜜桃人妻无码AV天堂三区| 欧美XXXXBBBB| 羞羞色院91蜜桃| 成人网站在线免费看| 欧美黄色三级片| 色综合久久久无码中文字幕999| 爱爱爱网址| 在线视频三区| 午夜福利手机在线| 青青草手机视频| 影音av资源| 99草在线视频| 琪琪久久| 日韩色图在线观看| 欧美精品xxx| www.99热| 狠狠躁日日躁夜夜躁A片无码视频| 一本一道久久| 亚洲黄色小视频| 啪一啪操一操| 四川BBB嫩BBBB爽BBBB| 亚洲天堂一区在线观看| 大香焦伊人国产| 国产免费一区二区在线A片视频| 99热在线看| 国产精品二区高清在线苍井空| 欧美日韩成人片| 性爱日韩| 五月激情丁香婷婷| 夜夜嗨AⅤ一区二区三区| 人人av在线| 久久久久三级| 成人视频91| 日本高清一区二区高清免费视频| 日韩A| 91免费在线| 色婷婷精品| 亚洲欧美另类在线| 狠狠穞A片一區二區三區| 国产A片免费| 日本AⅤ在线观看| 在线无码电影| 国产办公室丝袜人妖| 亚洲天堂高清| 十八禁无码| 日韩欧美成人在线观看| 五月激情六月| 少妇搡BBBB搡BBB搡HD(| 色欲AV网站| 91黑人丨人妻丨国产丨| 日韩动态视频| 久久久69| 黄片国产| 国产黄色视频免费看| 亚洲男女网站| 影音先锋男人资源网| 91人人妻人人操| 99久久精品国产一区二区三区| 国产在线一| 天天干人人干| 日韩精品人妻中文字幕有| 人人鲁人人操| 亚洲天堂精品视频| 国产v在线| 日韩a级片| 亚洲一级黄色视频| 黄色成人在线免费观看| 色婷婷一区二区| 国精产品一区一区三区| 免费性爱视频网站| 黄色成人18| 亚洲色婷婷| www伦理片-韩国三级三级三级a三级-成人AV| 三级片AAA成人免费| 久久成人综合网| 久久系列观看完整指南| 国产在线观看mv免费全集电视剧大全 | 国产中文人人国际| 777欧美| 牛牛影视一区二区| 五月婷婷免费视频| 精品人妻无码| 无码高清视频| 一级A片视频免费看| 先锋影音男人| 国产高清无码网站| 中文字幕日韩有码| 一本加勒比HEZYO东京热无码| 秘亚洲国产精品成人网站| 四虎成人精品在永久免费| 日韩欧美国产精品| 丁香花小说完整视频免费观看| 欧美一级特黄A片免费看视频小说| 激情视频网站| 男人天堂AV片| 成人午夜视频精品一区| 久久久在线视频| 国产精品秘ThePorn| 2026国产精品视频| 精品1区| 北条麻妃无码观看| 黄色在线免费看| 久久免费操| 五月婷婷俺也去| 中文字幕av网| 国产精品污www在线观看| 成人无码交配视频国产网站| 91做爱视频| 亚洲免费播放| 蜜桃视频网| 99热中文字幕在线观看| 天天添夜夜添| 狠狠色噜噜狠狠狠888| 久久成人网豆花视频| 青春草在线观看国产| 亚洲中文字幕免费观看| 91青青草| 日韩精品黄片| 欧美mv日韩mv国产| 欧洲成人在线观看| 香蕉毛片| 在线日韩中文字幕| 91大神在线免费观看| 综合网插菊花| 91久久婷婷国产| 亚洲天堂在线免费观看| 激情久久五月天| 国产精品被狂躁到高潮| JlZZJLZZ亚洲美女18| 青草青草| 中文字幕乱伦日本| 国产91嫩草乱婬A片2蜜臀| 无码人妻熟妇| 天天撸天天射| 亚洲一级电影| 密臀91| 人人干日日干| 精东影业秘国产传媒| 国产一级片| 亚洲无码久久网| 日韩综合在线视频| 热久久久久| 色图在线观看| 日本中文字幕视频| 亚洲黄色视频在线| 香蕉福利视频| 波多野结衣99| 亚洲少妇熟女| 国产一级片在线播放| 国产亚洲午夜久久久成人电影 | 免费三区| 在线男人天堂| 91av在线免费观看| 久草黄色电影在线观看| 欧美+日韩+国产+成人+在线| 日本天天操| 青青久草| 一级A片黃色A片| 嫩BX区二区三区的区别| 婷婷日韩中文字幕| 北条麻妃精品青青久久价格| 精品码A片18| 色婷婷亚洲综合| 蜜桃久久久久久久| 国产成人影视在线观看| 亚洲欧美在线观看视频| 欧美日本色| 婷婷国产精品视频| 日本大香蕉视频| 91香蕉国产成人App| 伊人综合大香蕉| 日本一区二区三区免费视频| 免费观看日韩无码视频| 日本中文在线观看| 99热这里只有精品9| 中国操B视频| 69成人无码| 美日韩视频欧美一区二区视频| 久久视频在线| 国产色无码网站www色视频| 人人舔| 国产精品美女久久久久久久久| 999国产精品| 99久久国内精品成人免费| 黄色国产网站| 免费日逼| 国产女人高潮的AV毛片| 国产一级A片免费视频| 成人片成人网久久蜜桃臀| 国产免费www| 五月天激情电影| 国产aaaaaaaaaaaaa| 风流老熟女一区二区三区| 欧美日韩一级视频| 国产久久精品视频| 免费在线观看无码视频| 国产精品9| 国产乱色精品成人免费视频| 熟妇熟女一区二区三区| 日韩精品无码一区二区| 国产精品资源在线观看| 成人网| 成人中文字幕网站| 亚洲人免费视频| 日韩一级a| 友田真希一级婬片A片| 99久久久无码国产精品性波多 | 思思热在线观看视频| 波多野结衣无码流出| 午夜在线观看视频| 操逼视频在线观看| 久久精品一二三| 亚洲精品一区二区三区在线观看| 午夜成人网站在线观看| 午夜电影无码| 免费无码成人| 人妻无码高清| 中文字幕成人av| 免费无码婬片AAAA片直播| 北条麻妃视频在线播放| AV无码在线免费观看| 竹菊影视一区二区三区| 亚州中文字幕| 久久久18禁一区二区三区精品| 天堂俺去俺来也www久久婷婷| 亚洲欧美在线综合| 99成人免费视频| 黄色亚洲无码| 囯产精品久久久久久久久久辛辛| 亚洲第一香蕉视频| 欧美日韩国产在线播放| 亚洲一级av无码毛片精品| www.狠狠干| 亚洲视频三区| 成人无码区免费A片| 99精品亚洲| 欧美三级在线视频| 嫩BBB槡BBBB槡BBBB免费视频| www.蜜桃| 69精品在线| 蜜臀AV一区二区三区免费看| 一区二区无码区| 亚洲av小电影| 无码人妻一区二区三区免费n狂飙 性猛交AAAA片免费看蜜桃视频 | 国产av综合网| 国产在线拍揄自揄拍无码网站新闻 | 亲子乱婬-一级A片| 青青操B| 亚洲秘无码一区二区三区电影| 在线观看免费黄色视频| 欧洲精品视频在线观看| 苍井空无码一区二区三区| 精品人妻| 一级真人毛片| 久热综合| 一级操逼毛片| 麻豆传媒一区| 免费一级a片| 二区精品| 亚洲va综合va国产va中文| 欧美一级A片免费看| 久操麻豆| 日韩性视频| 亚洲一级免费视频| 嫩草A片www在线观看| 韩日毛片| 三级片亚洲| 特黄A级毛片| 99这里只有精品视频| 日本电影一区二区三区| 蜜桃久久久久久久| 亚洲黄色录像| 性综合网| 亚洲人视频| 欧美成人精品一区二区三区| 国产日韩一区二区三区| 亚洲高清视频一区| 最近最好的2019中文| 免费日韩无码| 久久久精品久久| 国产精品久久久久久久久久王安宇| aaaaaa在线观看免费高清| A片欧美| 婷婷激情四射| 极品久久| 一本之道DVD不卡视频| 国产精品国产精品国产| 爱爱爱免费视频| 色视频免费在线观看| 亚洲精品国产精品乱玛不99| 在线观看黄片视频| 欧美中文字幕| 日韩av一级| 大香蕉毛片| 欧美AA片| 五月丁香六月激情综合| 香蕉A片| 日韩AV电影在线观看| 超碰97在线免费| AAA片视频| 国产美女一级特黄大片| 大香蕉91| 午夜性爱AV| 这里精品| 97人人干| 成人免费黄色| 天堂一区二区18| 日韩无码你懂的| 在线观看高清无码中文字幕| 色婷五月天| 免费AV毛片| 香蕉午夜视频| 欧美XXXXBBBB| 色九九| 无码一区二区三区四| 欧美深夜福利| 无码在线专区| 嫩BBB槡BBBB槡BBB小号| 97人人操| 人人色人人干| 男女日皮的视频| 日韩在线网址| 艹逼视频免费观看| 色色加勒比综合| 精品国产91乱码一区二区三区| 欧美一区二区三区精品| 狠狠干综合网| 91色图| 国产女人18毛片水真多18| 一区二区三区四区在线| 欧美精品综合| 影音先锋国产精品| 91人人操人人爽| 亚洲成年人在线| 蜜臀成人片| 成人免费区一区二区三区| 亚洲色情视频| 国产www在线观看| 99人人操| 国产高清A片| 一级少女免费播放电视剧韩剧TV| 九九成人免费视频| 日本黄色的视频| 日韩成人网站| 欧一美一婬一伦一区二区三区自慰| www.99视频| 波多野结衣无码一区二区| 亚洲视频,中文字幕| 色在线视频| 无码一区二区三区免费看| 天天亚洲| 吴梦梦md0069| 欧美成人视频18| 国产精品毛片久久久久久久| 日本无码专区| AV网站在线播放| 一本色道久久综合狠狠躁的推荐| 亚洲性爱在线播放| 成人性爱视频在线播放| 天堂性爱AV| 亚洲精品日韩综合观看成人91 | 日本欧美久久久久免费播放网| 成人久久电影| 少妇特黄A一区二区三区| 91日逼视频| 在线免费看a| 成人性爱在线| 91老熟女视频| 日韩aaaaaa| 婷婷久久网| 一级Aa视频免费看| 日韩AV无码专区亚洲AV| 黄色视频网站在线看| 日本乱伦网站| www久久99| 日本色网址| 刘玥精品国产一区二区三区| 影音先锋无码专区| 欧美亚洲视频在线观看| 人妻毛片| 日韩第五页| 国产黄片一区二区三区| 久久视频在线| 欧美成在线视频| 日本aaaa片| 影音先锋av在线资源| 中文字幕在线观看有码| 色噜噜人妻av中文字幕| 大香蕉亚洲在线| 亚洲群交视频| 一级黄色片网站| 国产美女精品视频| 亚洲欧美日韩另类| 国产精品国产三级国产专区53 | 欧美一级一级| 午夜激情视频在线观看| 欧美成人小视频| 草逼免费视频| 99热9| 一级做a爰片毛片A片| 亚洲无码电影视频|