我正在尝试通过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
命令时,我会收到完整的电子邮件列表。所以我应该从套接字得到相同的响应,但我不是。我该如何从服务器逐行读取整个响应?
答案 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对象