Сокет застревает при выполнении readLine () - PullRequest
1 голос
/ 13 октября 2011

Я пытаюсь подключиться к серверу 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, я получаю полный список писем.Таким образом, я должен получить тот же ответ из сокета, но это не так.Как я должен читать всю ответную строку построчно с сервера?

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

readLine () не вернется, пока не прочитает возврат каретки или перевод строки, что вы обычно получаете при чтении из терминала или текстового файла.

Я не удивлюсьесли POP-сервер на самом деле не прикрепляет \ r \ n к концу своих сообщений.Попробуйте вместо этого прочитать ().

1 голос
/ 13 октября 2011

Вы должны посылать \ r \ n после каждой команды, также попробуйте не использовать BufferedInputStream, попробуйте читать напрямую из байта InputStream, чтобы увидеть, в какой момент он фактически зависает.BufferedInputStream может зависать, ожидая, чтобы прочитать больше, прежде чем вернуть то, что он уже прочитал.

0 голосов
/ 25 сентября 2013

Вы можете попробовать следующее -

    try {
        String line = inn.readLine();
        while(***input.ready()***)
        {
            System.out.println(line);
            line=inn.readLine();

        }
        inn.close();


    } catch (IOException e) {

        e.printStackTrace();
    }

, где inn - это ваш объект bufferedReader, который хранит входные данныеtreamdata

0 голосов
/ 13 октября 2011

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

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