【问题标题】:What does SO_TIMEOUT and CONNECT_TIMEOUT_MILLIS means in netty's ChannelOption?SO_TIMEOUT 和 CONNECT_TIMEOUT_MILLIS 在 netty 的 ChannelOption 中是什么意思?
【发布时间】:2014-01-26 00:17:21
【问题描述】:

SO_TIMEOUTCONNECT_TIMEOUT_MILLIS 是什么意思,它们之间有什么区别?

我发现:许多请求花费 3.004s 而我的处理程序总是花费 0.003s 或 0.004s 并且我将 SO_TIMEOUT 设置为 3000 ,它们之间有关系吗?

我认为SO_TIMEOUT 的意思是当SO_TIMEOUT time 没有发送响应时,立即发送此响应。它是否正确?

【问题讨论】:

    标签: java sockets timeout netty


    【解决方案1】:

    SO_TIMEOUT 由 java.net.ServerSocket (OIO/BIO) 设置 CONNECT_TIMEOUT_MILLIS 由 Netty(NIO) 设置

    io.netty.channel.nio.AbstractNioChannel:

            @Override
            public void connect(
                    final SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) {
                // ...
    
                try {
                    // ...
                    if (doConnect(remoteAddress, localAddress)) {
                        fulfillConnectPromise(promise, wasActive);
                    } else {
                        // ...
                        int connectTimeoutMillis = config().getConnectTimeoutMillis();
                        if (connectTimeoutMillis > 0) {
                            connectTimeoutFuture = eventLoop().schedule(new Runnable() {
                                @Override
                                public void run() {
                                    ChannelPromise connectPromise = AbstractNioChannel.this.connectPromise;
                                    ConnectTimeoutException cause =
                                            new ConnectTimeoutException("connection timed out: " + remoteAddress);
                                    if (connectPromise != null && connectPromise.tryFailure(cause)) {
                                        close(voidPromise());
                                    }
                                }
                            }, connectTimeoutMillis, TimeUnit.MILLISECONDS);
                        }
    
                        // ...
            }
    

    【讨论】:

    • SO_TIMEOUT 和 CONNECT_TIMEOUT_MILLIS 是什么意思?
    【解决方案2】:

    CONNECT_TIMEOUT_MILLIS 表示建立连接的超时值,Netty 支持这个超时值。
    SO_TIMEOUT 是套接字的选项,它将影响: ServerSocket.accept(); SocketInputStream.read() DatagramSocket.receive()

    详情请查收:http://docs.oracle.com/javase/1.5.0/docs/api/java/net/SocketOptions.html#SO_TIMEOUT

    如果你只是想控制请求超时,你可以试试 Netty 的 ReadTimeoutHandler 或 IdleTimeoutHandler。

    【讨论】:

    • 你知道ReadTimeoutHandler、WriteTimeoutHandler和IdleTimeoutHandler怎么用吗,我很疑惑。你能给我一个代码示例吗?
    猜你喜欢
    • 2011-03-15
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 2020-12-06
    • 2016-08-17
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多