2014-01-08 2 views
5

Что означает SO_TIMEOUT и CONNECT_TIMEOUT_MILLIS, а в чем разница между ними?Что означает SO_TIMEOUT и CONNECT_TIMEOUT_MILLIS в канале ChannelOption netty?

Я обнаружил, что: многие запрашивают стоимость 3.004s и мой обработчик всегда стоят 0.003s или 0.004s, и я установил SO_TIMEOUT в 3000, есть ли между ними отношения?

Я думаю, что SO_TIMEOUT означает, что когда ответ не отправляется в SO_TIMEOUT time, пришлите этот ответ немедленно. Это верно?

+0

спасибо @noloader для форматирования моего вопроса. – BabyDuncan

ответ

0

SO_TIMEOUT устанавливается java.net.ServerSocket (OIO/BIO) CONNECT_TIMEOUT_MILLIS устанавливается с помощью Netty (NIO)

io.netty.channel.nio.AbstractNioChannel @Override общественного недействительными соединить ( окончательным SocketAddress remoteAddress, окончательный SocketAddress localAddress, окончательное ChannelPromise обещание) {// ...

 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); 
       } 

       // ... 
    } 
+3

Что означает SO_TIMEOUT и CONNECT_TIMEOUT_MILLIS? – BabyDuncan

4

CONNECT_TIMEOUT_MILLIS означает значение тайм-аута, чтобы установить соединение, этот таймаут поддерживается Ne TTY.
SO_TIMEOUT опция для сокета, это повлияет: ServerSocket.accept(); SocketInputStream.read() DatagramSocket.receive()

Деталь Пожалуйста, проверьте: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/SocketOptions.html#SO_TIMEOUT

Если вы просто хотите контролировать тайм-аут запроса, вы можете попробовать ReadTimeoutHandler или IdleTimeoutHandler Нетти в.

+0

Знаете ли вы, как использовать ReadTimeoutHandler WriteTimeoutHandler и IdleTimeoutHandler, я озадачен ими. вы можете дать мне пример кода? – BabyDuncan

Смежные вопросы