Время ожидания соединения SSL и время чтения - PullRequest
2 голосов
/ 12 октября 2011

У меня есть сомнения относительно того, где установить тайм-аут сокета в моем коде. Я пытаюсь добиться того, чтобы время создания сокета составляло 10 секунд. Так что я устанавливаю это перед рукопожатием. Теперь ошибки, которые я вижу в журналах, бывают двух видов. 1) Ошибка тайм-аута соединения и 2) Ошибка тайм-аута чтения. Поэтому мне было интересно, если кто-нибудь может объяснить мне больше о том, где установить время ожидания. У меня есть следующий код:

try{
  SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
  socket = (SSLSocket)factory.createSocket(host,port);
  socket.setSoTimeout(10000);
  socket.startHandshake();

  OutputStream socketOut =( socket.getOutputStream() );

  String command = method+" "+path+" HTTP/1.0\n";
  //command+="Host: "+host+"\nConnection: close\n";

  if (data!=null) {
command+="Content-Length: " + data.length +"\n\n";
    sendBytes.write(command.getBytes(),0,command.length());
    sendBytes.write(data,0,data.length);
  } else {
    // if data == null then we are most likely doing a GET request
    sendBytes.write(command.getBytes(),0,command.length());
  }

  sendBytes.write("\n".getBytes(),0,"\n".length());

  temp = sendBytes.toByteArray();
  socketOut.write(temp,0,temp.length);
  socketOut.flush();

  /* read response */
  BufferedInputStream socketIn = 
    new BufferedInputStream( socket.getInputStream() );

  byte[] inputData = new byte[READSIZE];
  while ((bytesRead=socketIn.read(inputData,0,READSIZE)) > -1) {
      receiveBytes.write(inputData,0,bytesRead);
  }
  result=receiveBytes.toByteArray();

  //receiveBytes.close();
  //sendBytes.close();
  //socket.close();

} catch (Exception e) {
  throw e;
}finally {
try { receiveBytes.close(); sendBytes.close(); socket.close(); } catch (Exception ee) {}
}     
return result;
} // end submit

} // end class

Пожалуйста, дайте мне знать, как я могу получить тайм-аут по крайней мере на работу. В журналах ошибки происходят в 18 сек (что не должно быть) вместо 10 сек.

Спасибо

1 Ответ

2 голосов
/ 12 октября 2011

Скорее всего, проблема заключается в том, что тайм-аут уже возникает при подключении при создании сокета. Попробуйте создать экземпляр неподключенного сокета с помощью метода фабрики без аргументов, а затем используйте Socket # connect с параметром timeout в дополнение к Socket#setSoTimeout. Последний только включается для этих операций

ServerSocket.accept ()

SocketInputStream.read ()

DatagramSocket.receive ()

но не обрабатывает таймауты при попытках подключения.

Дополнительную информацию см. Также в технической статье о сетевых таймаутах .

...