2016-03-01 2 views
0

Я пытаюсь использовать SSL с IMAP в java. Я не хочу использовать класс 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 Один из моих целей - также для undesrtand socket и, в частности, для безопасного сокета –

ответ

0

IMAP не является протоколом пинг-понга. Сервер не отправляет одну строку в ответ на один из ваших.

Скорее вы отправляете команды, и сервер отправляет информацию. Серверу разрешено отправлять вам больше информации, чем вы просили, поэтому вы можете получить семь ответов на одну команду, и вы даже можете получить ответ без отправки команды вообще, которая затем называется незапрашиваемым ответом. Странная фраза. Незатребованные ответы используются некоторыми серверами для уведомления о новой почте, чтобы уведомить вас об изменениях флага в сообщениях и (почти?), Чтобы уведомить вас о том, что они собираются закрыть ваше соединение.

+0

Я знаю все это. Моя проблема заключается не в том, что я получаю больше, это то, что я получаю недостаточно. То есть, когда-то я просто не получаю ответа на свою команду перед отправкой новой команды на сервер, в другое время (с большими примерами), я получаю первую часть ответа, а затем ничего, пока ответ не заканчивается , –

+0

IMAP действительно не протокол pingpong. Попробуйте запустить другой поток и вызывать функцию read() там, вы увидите, что я имею в виду: сервер отправляет вам ответы, когда вам есть что сказать, не проверяя, есть ли у вас или мяч для пинг-понга. Просто создавайте поток и читайте ответы все время в этом чтении. – arnt

Смежные вопросы