не может получить полный ответ сервера

1

Я использую Java Socket Programming для получения ответов сервера, я использую char array и читаю каждый ответ в нем с помощью метода read():

InputStream stream = null;
try{
    stream = socket.getInputStream();
}catch(Exception e){
    conn_lost();
}

if(stream != null){
    input = new BufferedReader(new InputStreamReader(
                    stream));

Looper.prepare();
char a[] = new char[1000];
for(int i =0; i < a.length; i++){
      a[i] = ' ';
   }

while (true){

   input.read(a);

   String response = String.valueOf(a);

   process_server_response(response);

   for(int i =0; i < a.length; i++){
         a[i] = ' ';
      }
}

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

Стоит упомянуть:

1- затронутый ответ немного больше, чем другие ответы, но я уверен, что он не превышает 1000 литров.

2- Я уверен, что серверная часть работает отлично, и она отправляет ответы завершенными.

3- существует какой-либо тип терминаторов, которые могли бы вызвать такое поведение.

  • 1
    Вам не нужно заполнять буфер ( a ) пробелами. input.read(a) возвращает количество char которые были прочитаны. Если вы сохраните это число в переменной, вы можете использовать String.valueOf(char[], int, int) для преобразования данных буфера в строку. Это должно повысить производительность.
  • 0
    @fabian fabian хорошо, большое спасибо, это действительно беспокоило меня, и я раньше не думал об использовании найденного числа символов. веселит.
Теги:
inputstream
bufferedreader

1 ответ

2
Лучший ответ

Проблема в том, что я не могу получить полный ответ от сервера, а вместо этого получаю половину, а затем ответ после этого получаю вторую половину.

Да. Это то, как работают протоколы потоков. Вы не должны предполагать, что вы получите все данные в одном вызове для read().

Если у вас несколько сообщений в одном потоке, вам понадобится способ сообщить, где закончится сообщение. Вы не должны полагаться на read() считывая все одно сообщение, но не читаете какое-либо из следующего сообщения.

Три общих подхода:

  • Префикс длины для каждого сообщения
  • Разделитель между сообщениями
  • Самоограничивающиеся сообщения (например, XML, где вы можете сообщить конец документа, достигнув его закрывающего тега)

Если у вас нет какой-либо из этих схем на месте, но вы хотите поместить несколько сообщений на провод и обрабатывать их отдельно, ваш протокол принципиально нарушен, и вы должны его пересмотреть.

Кроме того, вы должны указать кодировку, применяемую при построении InputStreamReader. Не используйте платформу по умолчанию.

  • 0
    кстати, по вашему мнению, какую кодировку лучше всего применять при получении ответов Json?
  • 1
    @MuhammedRefaat: Если бы вы могли работать в двоичном формате с текстом внутри, я бы в кодировке UTF-8 кодировал JSON и имел простой префикс длины. Я большой поклонник префиксов длины, с точки зрения предоставления клиенту точной информации о том, сколько данных нужно прочитать, без учета зависимости от содержимого. Это зависит от того, как вы контролируете клиента и сервер.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню