Надежный способ чтения данных сокета - PullRequest
0 голосов
/ 24 февраля 2012

Приложение, над которым я работаю, состоит из двух частей.Серверная часть работает на компьютере с Linux.Клиентская часть, приложение Android, запрашивает сервер и получает необходимый ответ.Обе части написаны на Java, используют коммуникацию на основе сокетов и передают текстовые данные.

Сразу после отправки запроса клиент получает ответ следующим образом:

public static String ReadAvailableTextFromSocket(BufferedReader input) throws IOException {
  if (input.ready() == false) {
    return null;
  }
  StringBuilder retVal = new StringBuilder();
  while(input.ready()) {
    char ch = (char) input.read();
    retVal.append(ch);
  }
  return retVal.toString();
}

Однакокажется, это не так уж и надежно.Ввод не всегда готов из-за времени отклика сервера или задержек передачи.

Похоже, что input.ready () - неправильный способ ожидания получения данных.

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

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

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

Надеюсь, это поможет другим.

С уважением,Питер

0 голосов
/ 24 февраля 2012

Возможно, вам следует использовать Threads .Держите поток слушателя в цикле while(true), который читает больше данных по мере их поступления и просто буферизует данные в структуре данных (скажем, в очереди), совместно используемой основным потоком.Таким образом, основной поток может просто удалять данные по мере необходимости.Если очередь пуста, это может означать, что новые данные не были получены.

Редактировать: см. Этот код многопоточного сервера / клиента в качестве примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...