Я использую 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- существует какой-либо тип терминаторов, которые могли бы вызвать такое поведение.
Проблема в том, что я не могу получить полный ответ от сервера, а вместо этого получаю половину, а затем ответ после этого получаю вторую половину.
Да. Это то, как работают протоколы потоков. Вы не должны предполагать, что вы получите все данные в одном вызове для read()
.
Если у вас несколько сообщений в одном потоке, вам понадобится способ сообщить, где закончится сообщение. Вы не должны полагаться на read()
считывая все одно сообщение, но не читаете какое-либо из следующего сообщения.
Три общих подхода:
Если у вас нет какой-либо из этих схем на месте, но вы хотите поместить несколько сообщений на провод и обрабатывать их отдельно, ваш протокол принципиально нарушен, и вы должны его пересмотреть.
Кроме того, вы должны указать кодировку, применяемую при построении InputStreamReader
. Не используйте платформу по умолчанию.
a
) пробелами.input.read(a)
возвращает количествоchar
которые были прочитаны. Если вы сохраните это число в переменной, вы можете использоватьString.valueOf(char[], int, int)
для преобразования данных буфера в строку. Это должно повысить производительность.