执行readLine()时套接字卡住了

时间:2011-10-13 16:49:36

标签: java sockets

我正在尝试通过Java中的套接字连接到POP服务器。我做了以下代码来运行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()上,应用程序停留在此处,并且不会从此处继续。当我在telnet上运行LIST命令时,我会收到完整的电子邮件列表。所以我应该从套接字得到相同的响应,但我不是。我该如何从服务器逐行读取整个响应?

4 个答案:

答案 0 :(得分:5)

readLine()在读取回车符或换行符之前不会返回,这是您从终端或文本文件中读取时通常会得到的。

如果POP服务器实际上没有在其消息的末尾添加\ r \ n,我不会感到惊讶。请尝试使用read()。

答案 1 :(得分:1)

你应该在每个命令之后发送\ r \ n,同时,尝试不使用BufferedInputStream,尝试直接从InputStream逐字节读取,以查看它实际挂起的位置。在返回已经读取的内容之前,BufferedInputStream可能会挂起等待阅读更多内容。

答案 2 :(得分:0)

尝试使用in.read一次读取一个字符并打印它。也许,服务器发送的换行符存在问题。

答案 3 :(得分:0)

您可以尝试以下操作 -

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

        }
        inn.close();


    } catch (IOException e) {

        e.printStackTrace();
    }

其中in是存储输入流数据的bufferedReader对象