2016-03-01 63 views
0

我正在尝试在java中使用带有IMAP的SSL。我不想使用IMAP类。 出于某种原因,当我发送第n条消息时,我收到消息n-2的答案,而不是消息n-1。这意味着在发送第二条消息之前,我没有收到任何第一条消息的答复。任何人都可以发现以下最小代码中的错误吗? (除了println之外,它确实是最小的,我想帮助调试)Java,SSLSocket,未接收到任何答案

import java.io.*; 
import javax.net.ssl.*; 
public class Mail{ 
    static String server = "imap.gmail.com"; 
    static String user = "[email protected]"; 
    static String pass = "azerty75"; 
    public static void print (PrintWriter to, String text){ 
     System.out.println("sent : "+text); 
     to.println(text+ "\r"); 
     to.flush(); 
    } 

    public static void read (BufferedReader from) throws InterruptedException, IOException { 
     do { 
      String line = from.readLine(); 
      System.out.println("received: "+line); 
     } while (from.ready()); 
    } 

    public static void main(String[] args){ 
     try{ 
      SSLSocket sslsocket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(server, 993); 
      System.out.println("Start connexion"); 

      BufferedReader from = new BufferedReader(new InputStreamReader(sslsocket.getInputStream())); 
      //    read(from); 

      PrintWriter to = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sslsocket.getOutputStream())), true); 
      print(to,"a1 login "+user+" "+pass); 
      read(from);/*exepcted: 
         OK gimap ready 
         a1 OK [email protected] authenticated (Success)*/ 

      sslsocket.close(); 
      System.out.println("End connexion"); 
     } 

     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

你为什么不使用JavaMail呢? – EJP

+0

您确定要发送CRLF对吗?而不只是换行? – Max

+0

@EJP我的目标之一就是不需要套接字,特别是安全套接字 –

回答

0

IMAP不是乒乓协议。服务器不会响应您的一条线发送一行。

相反,您发送命令并且服务器发送信息。服务器被允许向你发送比你所要求的更多的信息,所以你可以得到7条命令的响应,你甚至可以在不发送命令的情况下得到响应,然后被称为主动响应。奇怪的短语。一些服务器使用未经请求的响应来通知您有关新邮件的更多信息,以通知您有关邮件的标志更改,并且(几乎?)通知您他们即将关闭连接。

+0

我知道所有这一切。我的麻烦不是我收到更多,是我收到的不够。也就是说,有时候,在向服务器发送新命令之前,我只是没有得到任何回应,而Othertime(更大的例子),我收到响应的第一部分,然后什么都没有,而响应没有结束。 –

+0

IMAP确实不是乒乓协议。尝试启动另一个线程并在那里调用read(),你会明白我的意思:服务器在你有回应的时候向你发送回应,而不检查你是否拥有乒乓球。在阅读过程中,只需制作一个线索并阅读答案。 – arnt