2016-03-01 44 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