#java #sockets
#java #сокеты
Вопрос:
Я пытаюсь подключиться к POP-серверу через сокеты на Java. Я выполнил следующий код, чтобы запустить команду LIST, чтобы перечислить все электронные письма с сервера. Но я не знаю, почему при втором readLine () для чтения второй строки и далее мое приложение зависает там.
popSock = new Socket(mailHost, pop_PORT);
inn = popSock.getInputStream();
outt = popSock.getOutputStream();
in = new BufferedReader(new InputStreamReader(inn));
out = new PrintWriter(new OutputStreamWriter(outt), true);
//USER and PASS commands to auth the server are ok
out.println("LIST");
String response = in.readLine();
System.out.println(response);
//Attempt to read the second line from the buffer but it hangs at here.
response = in.readLine();
System.out.println(response);
Во-вторых in.readLine()
, приложение застревает здесь и не переходит отсюда. Когда я запускаю LIST
команду в telnet, я получаю весь список электронных писем. Поэтому я должен получить тот же ответ от сокета, но это не так. Как я должен прочитать весь ответ построчно с сервера?
Комментарии:
1. Что ж, ваш первый readLine() выдаст приветственное сообщение. Поэтому кажется вероятным, что readLine() блокируется, потому что СПИСОК не работал правильно. Может быть, ваш POP-сервер строго соответствует RFC? Изменяет ли out.print(«LIST r n») поведение?
2. К сожалению, добавление rn по-прежнему не работает. Команда LIST действительно работает. Я мог видеть первую строку ответа. Но после этого приложение зависает, когда я хочу прочитать вторую строку и далее.
3. что вы получили в качестве первой строки после отправки
LIST
?4. Я получаю это: OK 3545 62967125. Таким образом, это означает, что
LIST
работает. Но после этой строки должно быть больше строк, то есть весь список электронных писем.5. есть ли причина не использовать библиотеку java pop3?
Ответ №1:
readLine() не вернется, пока не будет прочитан возврат каретки или перевод строки, что обычно получается при чтении с терминала или текстового файла.
Я не удивлюсь, если POP-сервер на самом деле не привязывает r n к концу своих сообщений. Вместо этого попробуйте read() .
Комментарии:
1. Похоже, что readLine() все еще ожидает ответа от сервера и поэтому зависает там. Проверка с
while (String tmp = in.readLine()) != null)
помощью не работает. Он по-прежнему выходит за рамки строк ответа. Почему проверка в цикле while не работает?2. пожалуйста, какой-нибудь пример для реализации вызовов read() вместо readLine() ?
Ответ №2:
Вы должны отправлять rn после каждой команды, кроме того, попробуйте не использовать BufferedInputStream, попробуйте читать непосредственно из InputStream байт за байтом, чтобы увидеть, в какой момент он действительно зависает. BufferedInputStream может зависать, ожидая продолжения чтения, прежде чем возвращать то, что он уже прочитал.
Комментарии:
1. Только первое отправление правильное, остальное не так.che даже не использует a
BufferedInputStream
.
Ответ №3:
Попробуйте прочитать его по одному символу за раз, используя in.read
и распечатывая его. Возможно, проблема с символом новой строки, который отправляет сервер.
Ответ №4:
Вы можете попробовать следующее—
try {
String line = inn.readLine();
while(***input.ready()***)
{
System.out.println(line);
line=inn.readLine();
}
inn.close();
} catch (IOException e) {
e.printStackTrace();
}
где inn — это ваш объект BufferedReader, в котором хранятся данные входного потока
Комментарии:
1. Это так же подвержено зависанию, как и исходный код. Классическое неправильное использование
ready()
.