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

用Netty擼一個(gè)心跳機(jī)制和斷線重連!

共 38019字,需瀏覽 77分鐘

 ·

2021-03-29 04:09

來(lái)源:www.jianshu.com/p/1a28e48edd92

心跳機(jī)制

何為心跳

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

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

如何實(shí)現(xiàn)

核心Handler —— IdleStateHandler

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

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

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

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

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

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

下面直接上代碼,需要注意的地方,會(huì)在代碼中通過(guò)注釋進(jìn)行說(shuō)明。

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

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

Client端

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

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

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

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ā)射器
/**
 * <p>客戶端連接到服務(wù)器端后,會(huì)循環(huán)執(zhí)行一個(gè)任務(wù):隨機(jī)等待幾秒,然后ping一下Server端,即發(fā)送一個(gè)心跳包。</p>
 */

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ù), 會(huì)拋異常, 該方法會(huì)被調(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, 0404));
        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;
    /** 將<code>Channel</code>保存起來(lái), 可用于在其他非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ù)器請(qǐng)求連接
     */

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

    private void init() {
        EventLoopGroup group = new NioEventLoopGroup();
        // bootstrap 可重用, 只需在TcpClient實(shí)例化的時(shí)候初始化即可.
        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ā)器
/**
 * <p>在規(guī)定時(shí)間內(nèi)未收到客戶端的任何數(shù)據(jù)包, 將主動(dòng)斷開該連接</p>
 */

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ī)定時(shí)間內(nèi)沒有收到客戶端的上行數(shù)據(jù), 主動(dòng)斷開連接
                ctx.disconnect();
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}
ServerBizHandler —— 服務(wù)器端的業(yè)務(wù)處理器
/**
 * <p>收到來(lái)自客戶端的數(shù)據(jù)包后, 直接在控制臺(tái)打印出來(lái).</p>
 */

@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ù)器端處理器集合的初始化類
/**
 * <p>用于初始化服務(wù)器端涉及到的所有<code>Handler</code></p>
 */

public class ServerHandlerInitializer extends ChannelInitializer<SocketChannel{

    protected void initChannel(SocketChannel ch) throws Exception {
        ch.pipeline().addLast("idleStateHandler"new IdleStateHandler(500));
        ch.pipeline().addLast("idleStateTrigger"new ServerIdleStateTrigger());
        ch.pipeline().addLast("frameDecoder"new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0404));
        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)沒有收到來(lái)自客戶端的任何數(shù)據(jù)包(包括但不限于心跳包),將會(huì)主動(dòng)斷開與該客戶端的連接。

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)
;
            // 綁定端口,開始接收進(jìn)來(lái)的連接
            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)編寫完畢。

測(cè)試

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

客戶端控制臺(tái)輸出的日志

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

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

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

在測(cè)試過(guò)程中,有可能會(huì)出現(xiàn)如下情況:

異常情況

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

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

斷線重連

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

實(shí)現(xiàn)思路

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

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

代碼實(shí)現(xiàn)

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

因?yàn)閿嗑€重連是客戶端的工作,所以只需對(duì)客戶端代碼進(jìn)行修改。

重試策略

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)實(shí)現(xiàn)

/**
 * <p>Retry policy that retries a set number of times with increasing sleep time between retries</p>
 */

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 < maxRetries) {
            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 << retryCount));
        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, 0404));
        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;
    /** 將<code>Channel</code>保存起來(lái), 可用于在其他非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ù)器請(qǐng)求連接
     */

    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實(shí)例化的時(shí)候初始化即可.
        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();
    }

}

測(cè)試

在測(cè)試之前,為了避開 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)客戶端

先只啟動(dòng)客戶端,觀察控制臺(tái)輸出,可以看到類似如下日志:

斷線重連測(cè)試——客戶端控制臺(tái)輸出

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

啟動(dòng)服務(wù)器端

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

圖片

斷線重連測(cè)試——服務(wù)器端啟動(dòng)后客戶端控制臺(tái)輸出

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

擴(kuò)展

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


瀏覽 48
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲天堂视频在线| 中国老女人日逼| 国产香蕉视频免费| 亚洲福利视频电影精| 免费黄色在线| 91日韩欧美| 91人妻人人爽人人爽| 毛片3| 中文字幕2025年最好看电视剧| 九九中文字幕| 亚洲色欲色欲www在线成人网| 国产乱子伦一区二区三区免看 | 亚洲精品国产精品国自产| 69亚洲视频| 日本操逼视频| 国产无码激情| 熟女人妻在线| 影音先锋资源| 亚洲色图图片| 国产成人精品一区二区三区在线| 一区二区色| 午夜久久久久久久久久久久91 | 免费网站观看www在线观看| 国产色视频一区二区三区QQ号| 69Av视频| 亚洲v欧美v| 91性爱嫩逼视频| 麻豆传媒嫂子| 亚洲二区后入极品| AⅤ中文字幕在线免费观看| 91成人免费视频| 91传媒在线观看| 亚洲精品秘一区二区三线观看 | 婷婷九月色| 插插插插网| 青青草五月天色婷婷丁香| 欧美日韩三级| 久久三级片| 一本一道久久综合狠狠躁牛牛影视| 久久久亚洲无码| 日本人妻中文字幕| www深夜成人a√在线| 香蕉视频国产| 大香蕉操逼| 嫩草视频| 欧美三级片在线| 亚洲中文无码在线| 亚洲AV无码国产精品| 国产精品秘久久久久久久久| 五月婷婷激情| 国产成人一区| 日韩中文字幕在线| 超碰自拍私拍二区三区区| 日本处女性高潮喷水视频| 日韩23岁观看| 短发妹子双人啪啪秀| 国精产品一区一区三区四区| www.操操网| 99re视频播放| 成人AV在线一区二区| 熟女少妇网站| 日韩无码人妻系列| 成人黄网站免费观看| 成人做爰黄级A片免费看土方| 麻豆911精一区二区| 噼里啪啦免费观看视频大全| 好好日视频| 青娱乐国产av| 國產精品777777777| 国产色色网| www狠狠| 一本到在线视频| 欧美老妇操逼视频| 999久久| 日本三区| 国产成人自拍在线| av水果派| 黄色在线免费观看| 91AV在线播放| 日韩人妻无码一区二区三区七区| 国产成人一级| 91操视频| 国产免费啪啪视频| 一级a免一级a做免费线看内裤| 在桌下含她的花蒂和舌头H视频| 久久久久久伊人| 亚洲色婷婷五月天| 青青草成人网站| 啪啪啪免费| 北京熟妇槡BBBB槡BBBB| 亚洲黄片免费看| 中文字幕福利| 青娱乐av| 亚洲日韩免费在线观看| 成人网站视频| 亚洲香蕉视频网站| 国产黄片一区二区三区| 迷情校园综合| 特級西西444WWw高清大膽| 人妻超碰| 久热精品视频在线观看| 九九久久精品| 成人国产欧美日韩在线视频| 97福利导航| 亚洲精品美女视频| 日无码视频| 欧一美一婬一伦一区二区三区自慰,| 蜜臀网在线| 中文在线高清字幕| 亚洲www.| 欧美成人午夜无码A片秀色直播| 欧美大吊在线| 亚洲精品少妇| 91AV在线免费观看| 黄色国产AV| 无码一区二区视频| www.高清无码| 亚洲天堂在线视频| 豆花无码视频一区二区| 亚洲午夜久久| 亚洲精品国产AV婷婷| 日韩黄网| 黄色影片在线观看| 九色91视频| 偷偷操穴| 操日韩美女| 艹逼视频| 伊人精品A片一区二区三区| 亚洲性爱影院| 成人性爱在线观看| 日本三级片视频不卡| 国产精品久久久久的角色| 国产美女在线观看| 久久学生妹| 国产中文视频| 九哥操逼视频| 人妻无码| www.seses| 91无码影院| 日日骚av一区二区三区| 亚洲小说区图片区| 婷婷日韩| 在线观看免费黄| 9999re| 农村三级片| 国产精品乱| 山东wBBBB搡wBBBB| 就去色色五月丁香婷婷久久久| 亚洲天堂美女| 免费版成人久久幺| 一区二区三区色| 成人无码免费| 五月色婷婷撸| 午夜亚洲视频| 亚洲无码蜜桃| 正在播放JUQ-878木下凛凛子 | 亚洲第一视频| 黄色成人视频网站在线观看 | 久久久人妻熟妇精品无码蜜桃| 国产h在线观看| 国产欧美日韩| 五月丁香在线播放| 一级黄色片网站| 少妇搡BBBB搡BBB搡造水多| 欧美日本黄色| 免费成人AV| 羞羞涩漫无码免费网站入口| 国产精品第一| 免费网站观看www在线观看| 中文字幕A片无码免费看| 边吃奶边做爱| 四川少BBB搡BBB爽爽爽| 高潮国产视频| 日本欧美在线| 自拍偷拍一区二区三区| 在线无码中文字幕| 久久永久视频| 91精品福利| 蜜芽人妻在线| 伊人黄色电影| 高清日韩无码视频| 国产久久视频| 91久久精品一区二区三区| 亚洲操逼电影| 97A片在线观看播放| 丁香六月婷婷| 少妇性受XXXX黑人XYX性爽 | 中文字幕成人在线播放| 91麻豆精品国产91久久久久久| 激情视频在线免费观看| 亚洲精品三级| 全部在线A片免费播放| 无码人妻熟妇| 国产成人av在线| 国产系列每日更新| AV成人无码| 亚洲精品乱码久久久久久| 日韩福利在线观看| 久久人精品| 91无码一区二区| 99久久99久久精品免费看小说。 | 99久久精| 中文字幕一级A片免费看| 少妇搡BBBB搡BBB搡造水多,| 一本色道久久综合无码| 亚洲精品在线视频| 免费看特别黄色视频| 九色PORNY国产成人| 六月婷婷激情| 国产操逼网站| 国产精品久久一区二区三区影音先锋 | 亚洲国产av电影| 黑人AV在线观看| 九九热热| 人妻少妇91精品一区黑人| 天堂中文在线播放| 亚洲欧美国产日韩字幕| 日韩成人网站| 丰满人妻-区二区三区| 欧美黄色免费网站| 国产aa| 亚洲精品无码中文| 麻豆传媒电影| 97在线观看视频| 亚洲中文AV在线| 国产99久久九九精品无码免费| 国产免费一区二区三区最新不卡| 色色色免费视频| 伊人综合视频| 亚洲无线观看| a免费视频在线观看| 国产成人无码免费| 亚洲三级网站| 曰曰干| 婷婷国产AV| www.cao| 黄色国产视频在线观看| 亚洲无码大全| 韩国AV三级| 中文字幕在线码| 亚洲av电影网| 性欧美成人播放77777| 国产99精品视频| av一级片| 337P大胆粉嫩噜噜噜| 中文字幕日本无码| 久久五月婷| 亚洲精品乱码在线| 婷婷五月丁香色| 91五月天| 国产欧美综合一区二区| 色欲一区| 日韩插插| 成人做爰黄A片免费视频网站野外| 大香蕉久久草| 人人摸人人操人人爱| avwww| 激情男人网| 欧美操逼在线观看| 91无码电影| 精品人妻一区二区三区日产乱码| 嫩苞又嫩又紧AV无码| 黄片av| a片在线观看免费| 97人妻一区二区三区| 18成人毛片| 琪琪av| 熟女无码| 午夜亚洲无码| 在线激情| 精品交换一区二区三区无码| 中文一区| 亚洲熟女一区二区三区妖精 | 国产精品欧美精品| 免费的黄色录像| 一级午夜福利| 91精品久久久久| 午夜尤物| 国产成人精品一区二区三区| 日皮视频网站| 伊人影院在线观看| 杨晨晨不雅视频| 成人亚洲综合| 亚洲www啪成人一区二区麻豆| 91国在线视频| 中文在线字幕免费观看电视剧大全 | 99re99| 91麻花| 五月天婷婷视频| 一道本无码视频| 欧美日韩成人视频| 激情黄色毛片| 亚洲秘无码一区二区三区蜜桃中文 | 成人黄色视频免费| 色94色.欧美.setu| 国产精品国产三级国产专区53| 综合网伊人| 国产成人综合电影| 婷婷五月天激情小说| 中文字幕无码一区二区三区一本久 | AV无码一区二区| 欧美福利导航| 中文字幕巨肉乱码中文乱码| 国产福利网| 成人网站大香蕉| 欧美性爱在线视频| 大香蕉久在线| 三级片无码视频| 十八禁福利网站| 免费看黄片的网站| 激情网婷婷| 91色在线| 精品伊人大香蕉| 可以在线观看的av| 无码一区二区av| 午夜性爱AV| 11孩岁女精品A片BBB| 强伦轩人妻一区二区三区四区| 日本三级片在线动| 五月天乱伦小说| 免费看欧美日黄片| 不卡无线在一区| 国产黄色电影| 精品蜜桃秘一区二区三区在线播放| 欧美精品在线观看| BBB搡BBB搡BBB搡BBB| 大鸡巴网站| 97AV人妻无码视频二区| 久色视频福利| 四个熟妇搡BBBB搡BBBB| 亚洲中文无码第一页| 欧美色噜噜| 国产一级精品视频| 国产jk在线| 操逼基地| 久久久久久高清毛片一级| 先锋影音亚洲AV每日资源网站 | 午夜蜜桃人妻一区二区| 天天综合字幕一区二区| 精品一区二区ww| 十八禁网站在线观看| 人妻少妇无码精品| 亚洲国产高清国产精品| 91成人视频在线播放| 亚洲一二三四区| 成人免费版欧美州| 亚洲成人在线观看视频| 欧美一区二区三区在线| 亚洲三级片无码| 欧美曰皮免费看| 操屄网| 麻豆疯狂做受XXXX高潮视频| 亚洲内射视频| 嗯啊在线视频| 免费看黃色AAAAAA片| 国产免费AV在线观看| 嫩BBB嫩BBB嫩BBB| 在线观看视频国产| 久久精彩偷拍视频| 成年女人免费视频| 自拍视频在线| 操碰人人| 久久福利视频导航| 老司机一区二区三区| 天天噜噜色| 午夜福利影视| 嫩BBB槡BBBB槡BBB小号| 伊人免费成人视频| 性爱免费视频| 丁香五月天社区| 99成人电影| 天天插天天射| 99热99re6国产线播放| 天天爽天天操| 中文不卡在线| 日韩中文字幕一区二区三区| 无码一道本一区二区无码| 欧美男女操逼视频| 成人无码中文字幕| 无码水蜜桃一区二区| 亚洲无码视频在线观看高清| 国产成人va| 成人国产无码| 特级WWW444至码| 操鸡巴网站| 国产香蕉视频免费| 躁BBB躁BBB添BBBBBB| 最近中文字幕在线观看| 国产精品久久久久久久久| 亚洲日韩视频在线播放| 欧美综合视频在线观看| 色色热| 18啪啪网站| 日本天堂Tv视频在线观看| 无码国产一区二区三区四区五区 | 九九精品99| 麻豆疯狂做受XXXX高潮视频| 91精品国自产在线观看| 69国产成人综合久久精品欧美| 99视频在线| 91丨九色丨老农村| 蜜桃性视频| 鸡巴网站| 日韩美女在线| 干妞网免费视频| 免费a网站| 66久久| 人人爱人人爽人人操| 婷婷五月精品中文字幕| 国产精品宾馆在线| 久久精品综合| 婷婷免费视频| 狠狠躁日日躁夜夜躁A片男男视频| 男人天堂99| 99精品免费| 91影音先锋| 欧美国产在线观看综合| 欧美一级黃色A片免费看小优视频 无码人妻精品一区二区三千菊电影 | 欧美怕怕| 特级西西人体WWWww| 久久学生妹| 91蝌蚪视频在线| 自拍偷拍国产| 大香蕉大香蕉视频网| 日本不卡在线观看| 午夜国产在线观看| 无码人妻丰满熟妇区蜜桃| 大香蕉88| 国产综合视频| 国产第一页在线播放| 日韩无码三级视频| 天天干天天爽| jk在线观看| 无套内射在线| 国产欧美综合在线三区| 一区二区三区四区免费观看| 黄色成人在线观看视频| 无码免费中文字幕| www.偷拍| 国产精品不卡一区二区三区| 夜夜bb| 波多野结衣高清无码| 国产毛片一区二区| a片在线观看免费| 久草社区在线| 欧美成人a| 免费成人视频| 日韩三级视频在线观看| 欧美黄片网站| 欧美成人手机在线| 人人操超碰在线观看| 日韩无码高清免费视频| 黄色成人在线视频| AV网站免费在线观看| 人人操日本| 亚洲日韩中文字幕| 黄色日逼片| 国产探花在线观看| 亚洲无码一区二区三区蜜桃| 另类一区| 国产一级婬片A片AAA樱花| 欧美内射在线| 欧美成人一区二区三区片| 日韩黄色三级片| 午夜骚影| 日韩三级片在线播放| 亚洲AV无码乱码AV| 国产成人AⅤ| 色射网| 免费在线观看AV片| 成人女人18女人毛片| 五月天丁香| 东方AV在线免费观看| 亚洲黄色小电影| 麻豆MD传媒MD0071| 麻豆啪啪| 97精品视频在线观看| 91在线一区| 少妇白浆| 亚洲视频一区二区三区| www.熟女| 一级黄色片网站| 亚洲女人天堂AV| 蜜桃av| 黄色一级片网站| 精品一区二区三区免费| 久一在线| 欧美激情无码炮击| 国产中文字幕在线播放| 日本A片在线播放| 97国产精品视频人人做人人爱| 大香蕉精品一区| 日比视频| 91色噜噜狠狠色婷婷| 国产精品乱子伦一区二区三区视频 | 波多野结衣无码网站| 欧美成人视频电影无码高清| 中文字幕一区二区三区四区50岁 | 五月激情丁香婷婷| 欧美老妇XX| 国产无码AV| 欧美性爱视频免费看| 色呦呦在线| 日韩免费成人视频| 久久久久亚洲AV成人片乱码| 中文字幕无码视频| 国精产品一区一区三区| 尤物视频官网| 亚洲一区久久| 人妻少妇精品视频一区二区三区| 午夜无码鲁丝片午夜精品| 日韩精品人妻中文字幕蜜乳| 日韩一区二区在线视频| 大炕上公让我高潮了六次| 午夜无码精品| 天天射夜夜骑| 大香蕉国产精品| 久久午夜无码鲁丝片午夜精| 99ri精品| 国产中文字幕波多| 永久免费叼嘿| 成人AV在线一区二区| 国产av大全| 男人天堂V| 免费色片| 九色首页| 99精品国产热久久91色欲| 摸BBB槡BBBB搡BBB,,,,,| 欧美色综合| 久草综合视频| 丁香五月激情小说| 亚洲区中文字幕| 另类BBwBBw| 91av在线免费播放| 性爱AV在线观看| 超碰在线99| 在线视频一区二区三区| 亚洲AV无码一区东京热久久| 日本免费爱爱| 欧美国产操逼| 岛国免费视频| 两根茎一起进去好爽A片在线观看| 亚洲成人无码视频| 99re久久| 国产最新视频| 亚洲AV无码精品成人| 中文字幕av免费观看| 国产无码自拍偷拍| 国产精品色婷婷| 久久99久久99久久| 国产操| 18禁网站在线| 99爱在线观看| 精品无码人妻一区二区| 亚洲无码蜜桃| 欧美69p| 偷拍亚洲综合| 人人爽爽人人| 女人自慰在线观看| 日韩黄色视频| 国产精品毛片久久久久久久| 高清无码电影| 97人妻精品一区二区三区视频| 黄色免费观看网站| 91精品久| 老汉av| 中文字幕精品三区无码| 日韩潮喷| 成人网一区二区| 成人做爰100片免费看| 日韩一区二区三区视频| 2021无码| 丰满少妇一区二区三区| 日本99热| 91无码AⅤ在线| www俺来也com| 国产成人无码一区二区在线播放 | а√最新版天堂中文在线| 九九热国产视频| 久操欧美| 夜夜操夜夜骑| 人妻av中文无码| 无码一区二区黑人猛烈视频网站 | 日本黄色高清视频| 日韩无码福利| 亚洲国产精品成人综合色在线婷婷 | 韩国无码成人电影啊荒| 欧美V视频| 99精品视频北条麻妃国产版| 国产操逼免费| 看国产AA免费| 日本无码在线| 成人精品在线| 亚洲综合中文| 亚洲免费成人| 91av成人| 自拍偷拍成人视频| 国产无码区| 国产一级片视频| 亚洲va中文字幕| 激情综合婷婷久久| 免费欧美A片| 国产TS变态重口人妖| 国产手机精品视频| 国产毛片久久久久久久| 一区免费在线| 欧美黄色免费在线观看| 欧美激情国产精品| 91视频在线观看免费大全| 国产激情综合在线| 伊人免费视频在线观看| 91在线观看免费视频| 人妻懂色av粉嫩av浪潮av| 777偷窥盗摄00000| 伊人性视频| 暴操美女网站| 六月婷婷在线观看| 热无码av| 啪啪人妻| 久久九九免费视频| 欧美日韩精品一区二区三区| 91无码视频在线观看| 免费成人AV| 国产精品乱码毛片在线人与| 日韩在线观看网站| 三级AV在线免费观看| 三级片青青草| 久久99久久99久久| 2014亚洲天堂| 99成人乱码一区二区三区在线| 男女啪网| 日本一区二区三区免费看| 青青草无码在线视频| 一区二区三区国产视频| 精品久久久久久AV2025| 88海外华人免费一区| 久久青青婷婷| 18SAV| 久久午夜福利视频| 熟妇人妻久久中文字幕| 蜜桃网站视频| 大香蕉伊人影视| 色图插插插| 特级西西444www高清大胆免费看 | 国产中文字幕在线免费观看| 国产精品国产三级囯产普通话2| 人妻HDHDHD96XXXX| 91热爆TS人妖系列| 日韩一区二区三区无码| 成人免费在线网站| 国产高清无码在线观看视频| 一级黄影| 久久黄色大片| 国产真实露脸乱子伦对白高清视频| 波多野结衣高清无码视频| 国产一级A片久久久免费看快餐 | 夸克看成人片一级A片| 青青草公开视频| 69av在线观看视频| 日韩免费视频观看| 老妇槡BBBB槡BBBB槡| 在线成人av| 狠狠婷婷| 人人摸人人干人人操| 99热精品在线播放| 国产在线观看免费视频| AV免费网站| 狠狠的操| 午夜无码鲁丝片午夜精品一区二区| 黄色激情AV| 青青操人人操| 黄色av网| 91社区成人影院| 午夜乱伦福利| 中文字幕黄色片| 黄色视频在线观看免费网站| 操逼网国产| a在线观看视频| 久久AV片| 性爱视频网址| 成人精品视频| 亚洲精品国产成人无码区在线| 中文字幕在线欧美| 成人免费高清| 成人理论片| 色婷婷18正码国产| 青青草精品在线视频| 欧美成人在线视频网站| 搡bbb| 特极西西444WWW大胆无码| 国产午夜无码福利视频| 欧美干| 大香蕉最新国产2025| 欧美东京热视频| 在线不卡中文字幕| 色婷久久| 中文字幕一区二区三区在线观看| 日韩毛片一级| 欧美性爱小说网| 免费一级黄色视频| 草草网| 久久任你操| 翔田千里在线一区二区三区| 伊人日逼| 中文字幕亚洲天堂| 一级a免一级a做免费线看内祥 | 一级黄色录像片| 永久免费看A人片无码精| 欧美在线看片| 亚洲美女网站免费观看网址| 成人黄色无码视频| 亚洲天堂网在线视频| 欧美日韩在线视频播放| 97人妻人人澡人人爽人人精品| 国产AV天堂| 丰满人妻一区二区三区视频在线不卡| 在线成人视频网站大香蕉在线网站 | 久久久久亚洲AV无码成人片 | 成人亚洲视频| 麻豆91在线| 亚洲中文字幕av| www.色在线观看| 亚洲无码AV免费观看| 成功精品影院| 国产一区二区三区四区五区在线| 免费v片在线观看| 亚洲一区在线视频| 看国产AA免费| 国产高清精品在线| 国产AV直播| 一本色道久久综合| 国产一区二区成人久久919色| 熟女一区二区| 91精品在线播放| 日无码在线| 2018天天日天天操| 高清无码免费不卡| jizz在线观看| 人妻熟女字幕一区二区| 黄片免费视频| 天堂无码视频在线播放| www.豆花社区成人| 一级a免一级a做免费线看内祥| 国产精品国产三级国产专业不| 97超碰在线免费观看| 苗条一区小视频| 天天干在线观看视频| 影音先锋无码专区| 欧美午夜成人一区二区三区| 久操视频在线免费观看| 在线观看中文字幕av| 婷婷黄色电影| 麻豆午夜福利视频| 日韩中文字幕精品| 无码爱爱视频| 免费成人黄色| 爱视频福利网| 久久人体视频| 国产三级片在线观看视频| 亚洲无码网址| 久久久三级片| 正在播放无码| 欧美综合自拍| 久久久黄色视频| 成年人黄色网址| 木下凛凛子AV888AV在线观看 | 午夜啊啊啊| 97超碰人人操| 亚洲免费观看| 手机看片1024久久| 婷婷丁香色五月| 国产插逼视频| 中文字幕在线观看视频www| 水果派成人播放无码| 亚洲AV无码成人H动漫| 一区二区三区四区在线看| 亚洲青青草| 丁香婷婷五月| 特一级黄A片| 亚洲网站免费观看| 尹人成人| 久久久一区二区| 小黄片在线免费观看| 久久国产乱子伦精品免费午夜...| 三级免费| AV电影在线观看| 91久久久裸身美女| 影音先锋成人在线视频| 新妺妺窝窝777777野外| 五月激情综合网| 日逼网站国产| a免费在线| 欧美亚洲一区二区三区| 日韩成人视频在线观看| 蜜臀久久99精品久久一区二区| av福利在线| 丁香五月欧美激情| 99re这里只有| 黄频在线免费观看| 噜噜噜在线视频| 特级西西44www无码| 久久久婷婷| 豆花视频在线播放| 亚洲熟妇在线| 黄片免费看| 人妻少妇被猛烈进入中文字幕| 99久久精品国产成人一区二区| 午夜性爱AV| 高潮视频在线观看| 久久婷婷精品| 色噜噜一区二区三区| 人人看人人做| 欧美伊人网在线观看| 欧美色色综合| 91精品国产综合久久久蜜臀主演| 91香蕉在线| 91久久久久久久久久久| 欧美成人高清无码| 日日摸日日碰| 好吊视频一区二区三区红桃视频you | 天堂а√在线中文在线新版| 天天做天天爱天天高潮| 国产香蕉在线播放| 玖玖爱在线精品视频| 久久夜色精品国产欧美乱极品| 天天玩夜夜玩天天玩国产99| 免费黄色a片| 国产亲子乱XXXXinin| 在线观看无码视频| 欧美色图自拍| 欧美性性生交XXXXX无码| 色播五月丁香| 丁香花免费高清视频小说完整 | 欧美黄片在线免费看| 精品一区二区三区免费| 久久国产av| 蜜桃视频网站在线观看| 18精品爽国产冫绿帽社| 亚洲无码专区在线| 水果派成人播放无码| 91无码人妻精品1国产四虎| 天天操免费视频| 国产操逼免费| 免费自拍视频| 国产高清免费| 日韩免费在线视频观看| 男人的天堂青青草| 91福利导航| 日本午夜三级视频| 丰满人妻一区二区三区四区53 | 四虎色情| 草逼视频免费看| 色婷婷视频在线| 国内综合久久| 欧美日韩小电影| 亚洲精品高清无码| 日韩高清无码成人| 国产aa片| 免费黄色在线视频| 宅男噜| 日韩欧美精品一区二区| 成人视频免费观看18| 九九99精品视频| 亚洲AV成人无码精品直播在线| 懂色中国闺密偷情懂色AV| 波多野结衣久久精品| 嫩草在线视频| 久久久久久麻豆| 国产l精品久久久久久久久久| 国产精品一二区| 伊人黄色网| 中文有码在线观看| 欧美日韩成人| 国产亚洲无码激情| 中文字幕人妻丰满熟妇| 仙踪林777777野大粗| 久久成人无码| 国产又爽又黄免费网站校园里| 色色在线观看| 国产做爱| 成人视频18| 免费三级片网址| 久久精品视频免费观看| 少妇熟女视频一区二区三区| 国产免费av片| 国产人人操| 免费看黄色的网站| 99热这里只有精品1| A片在线免费播放| 午夜啪啪视频| 奇米色色| 特级特黄AAAA免费看| 国产精品成人无码a无码| 淫荡97| 国产伦子伦一级A片在线| 国产人人干| 日韩不卡一区二区三区| 一级黄色电影在线观看| 岛国av片| 先锋成人在线|