Я читаю символ за символом ответа сокета в BufferedReader, записанном из сокета, который я подключаю к SMTP и POP-серверу. Но как мне узнать, прочитал ли я до конца ответа, чтобы избежать зависания read()
для чтения сверх того, что ответил сервер? Следующий код показывает, как я читаю из BufferedReader:
boolean endOfResponse = false;
while(!endOfResponse) {
c = in.read();
if ((c >= 32 && c < 127) || c == '\t' || c == '\r' || c == '\n') {
response.append((char)c);
//The following check has a problem: If the response has multiple lines, the other lines will not be read.
if(c == '\n') endOfResponse = true;
}
}
Например, в POP, когда я делаю LIST
, ответ заканчивается .
. Но в SMTP, когда я делаю EHLO
, он не дает четкого указания, когда закончился ответ.
Использование in.read() == -1
, к сожалению, не работает, так как оно все равно будет пытаться прочитать данные, оставшиеся без ответа, и приведет к зависанию сокета.
Итак, как мне определить окончание ответа SMTP и POP? Более того, возможно ли даже узнать заранее, сколько байтов я должен прочитать из буфера, чтобы мне даже не пришлось проверять конец ответа?