Java DataInputStream чтение не возвращает - PullRequest
0 голосов
/ 15 сентября 2018

Я реализую простое средство чтения клиент / сервер и использую DataInputStream для чтения всего в байтах, а затем позабочусь о разборе.

Так вот мой код чтения:

String line;
String requestString = "";

//client is a Socket that is initialized elsewhere
DataInputStream inputData = new DataInputStream(client.getInputStream());
byte [] messageByte = new byte[1024];
int counter = 0;
  while(true) {  
    int bytesRead = inputData.read(messageByte, counter, 1024-counter);
    counter = (counter + bytesRead)%1024;
    if(bytesRead == -1) {
      System.out.println("Breaking out of loop");
      break;
    }
    line = new String(messageByte, 0, bytesRead);
    System.out.println( "GOT > " + line );
  }

Он может читать сообщения, но не может выйти из цикла, потому что последний вызов для чтения не возвращается.

1 Ответ

0 голосов
/ 15 сентября 2018

Сокеты будут блокироваться до тех пор, пока не прекратится ввод. InputStream - это просто интерфейс, точное поведение которого зависит от реализации его провайдера. Установите тайм-аут для вашего сокета, чтобы генерировалось исключение, если в течение определенного периода нет ввода.

Вот цитата из javadoc на сокете , обратите внимание, что она описывает поведение чтения из сокета как операции блокировки до истечения времени ожидания:

public void setSoTimeout(int timeout)
                  throws SocketException

Включить / отключить SO_TIMEOUT с указанным тайм-аутом в миллисекундах. С этой опцией установлено ненулевое время ожидания, вызов read () для InputStream, связанный с этот сокет будет блокироваться только на это время. Если тайм-аут истекает, java.net.SocketTimeoutException повышается, хотя Сокет все еще в силе. Опция должна быть включена до входа операция блокировки, чтобы иметь эффект. Тайм-аут должен быть> 0. A тайм-аут нуля интерпретируется как бесконечный тайм-аут.

Решение:

Помимо проверки -1, что в порядке. Установите тайм-аут на сокет и убедитесь, что исключение при правильной обработке.

...