2011-10-13 200 views
1

我试图通过Java中的套接字连接到POP服务器。我做了下面的代码来运行LIST命令来列出来自服务器的所有电子邮件。但我不知道为什么在第二行readLine()读取第二行和之后,我的应用程序挂在那里。套接字在执行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

好了,你的第一个的readLine()会给欢迎信息。所以readLine()似乎可能被阻塞,因为LIST无法正常工作。也许你的POP服务器严格遵守RFC? out.print(“LIST \ r \ n”)是否改变了行为? –

+0

不幸的是,添加\ r \ n仍然不起作用。 LIST命令可以工作。我可以看到答复的第一行。但在此之后,当我想要阅读第二行和之后的应用程序时,应用程序会挂起。 – Carven

+0

发送'LIST'后,您作为第一行收到了什么? –

回答

5

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

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

+0

似乎readLine()仍在等待来自服务器的响应,因此挂在那里。 'while(String tmp = in.readLine())!= null)'检查不起作用。它仍然超出了回应的范围。为什么while循环中的检查不起作用? – Carven

1

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

0

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

0

您可以尝试following--

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

     } 
     inn.close(); 


    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

其中客栈是您的BufferedReader对象whih存储inputstreamdata