2015-12-10 3 views
1

Этот фрагмент кода из TCP вспомогательной функции я сделал в Android Java:Почему это использование Socket.setSoTimeout() не работает?

  socket.setSoTimeout(2000); 
      InputStream inStream = socket.getInputStream(); 
      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), 
      true); 

      out.println(message); 

      BufferedReader input = new BufferedReader(new InputStreamReader(inStream)); 

      String tcpResult = ""; 

      if(lastCallMillis >= System.currentTimeMillis() - 100) 
       Thread.sleep(100); 

      tcpResult = input.readLine(); 

Когда очень первая линия там, один с «setSoTimeout», метод терпит неудачу с исключением. Когда я НЕ устанавливаю таймаут, он работает без заминки.

Ну .. почти мне пришлось вставить эту часть, потому что, если сокет быстро используется в строке это не удалось:

  if(lastCallMillis >= System.currentTimeMillis() - 100) 
      Thread.sleep(100); 

Во всяком случае я-то недоразумение об использовании Java сокетов или это просто ужасно поддерживается?

+1

Знаете ли вы, что время ожидания подключения отличается от setSoTimeout? setSoTimeout будет блокировать вызов read() для данной миллисекунды. если истечение таймаута истекает, возникает исключение java.net.SocketTimeoutException, хотя Socket все еще действует. –

+0

Спасибо, что я установил таймаут соединения на создание сокета тоже сейчас. –

ответ

1

Если вы не хотите, чтобы тайм-аут чтения не устанавливал короткий тайм-аут чтения. Добавление сон в сетевой код никогда не решает ничего. Это просто пустая трата времени. То, что вы должны были сделать, добавило время сна к таймауту. Но даже 2,1 секунды смехотворно коротки для таймаута чтения. Попробуйте десять или тридцать.

+0

Странное увеличение времени ожидания. Я говорю странно, потому что с тайм-аутом или без него операция занимает меньше секунды. –

+0

Err, no. Если у вас есть тайм-аут, истекает период ожидания. Если вы увеличили таймаут и таймаут не состоялся, таймаут был слишком коротким изначально. – EJP

+0

Я подсчитал около 0,5-1 секунды для двух операций. Я не ошибаюсь в 4-8 раз, и проблема из-за этого, вызвав ее дважды подряд, исчезла, так что что-то странно, но теперь это работает, и мне все равно :) –