Mam do napisania program który powiadamia o nowych wiadomościach w skrzynce emailowej bez korzystania z gotowych do tego klas. Program ma być na socketach. Aplikacja nie musi korzystać z szyfrowania itd. Napisałem aplikację i bez problemu się loguje, nie ma też problemu z pobieraniem listy wiadomości za pomocą komendy LIST. Ale mam problemy przy wydawaniu następnych komend. Chciałem pobrać UID każdej wiadomości. Próbowałem już pobierać oddzielnie uid dla każdej wiadomości ale na wyświetlenie czekał po około 10 sekund na każdą odpowiedź. To zbiorczo zacząłem pobierać UIDL dla wszystkich na raz(metoda getUidsRecentMails()). No to po tym długim czasie dostałem wszystkie UIDL, to ok poczekam te około 10 sekund. Ale potem chciałem pobrać zawartość każdej wiadomości wydaje komendę np RETR 1 dla pierwszej wiadomości. To wątek się wykonuje i wykonuje aż się wywala Exception in thread "Thread-0" java.lang.NullPointerException. Nie wiem dlaczego nie działa i tak długo muszę czkać na odpowiedzi. Gdy analogiczne komendy wydaje przez telnet to odpowiedzi mam natychmiastowo nawet jak są bardzo długie. A dla tych samych komend już w aplikacji są problemy. To myślałem że może coś jest problem z wysyłaniem komend. Ale odpaliłem wiresharka i odfiltrowywałem pakiety. Komendy wychodzą poprawnie. Te pierwsze też wracają. Ale po komendzie UIDL nie dostaje żadnych pakietów zwrotnych przez długi czas (około tych 10s albo i wcale). Dziwie się dlaczego po telnecie działa wszystko jak powinno a gdy aplikacja wysyła komendy to są takie opóźnienia. Wygląda na to że po komendzie LIST pakiety wracają coraz dłużej aż w końcu przestają dochodzić. Mam coś źle w kodzie? Czy to jest wina połączenia? Dodam że próbowałem dla poczty WP i o2 i dla obu jest tak samo.

@Override
    public void run() {
        System.out.println(TAG + ": Starting thread");
        //while (!Thread.currentThread().isInterrupted()) {
            try {
                beginConnection();
                logIn();
                getListMails();
                getUidsRecentMails();
                checkNewMails();
                getNewMailSubject();

                thisThread.sleep(10000);
                System.out.println(TAG + " REFRESHING MAILBOX");


            } catch (InterruptedException | IOException e) {
                System.err.println(TAG + " ERROR: Conection failed");
                e.printStackTrace();
            } finally {
                try {
                    System.out.println("quit");
                    dout.writeBytes("QUIT");
                    socket.close();  //close port
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
       //}

private void beginConnection() throws IOException{
        System.out.println(TAG+" beginConnection()");
        socket = new Socket(AppConfig.getServerName(), AppConfig.getPort());
        socket.setKeepAlive(true);

        din = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        dout = new DataOutputStream(socket.getOutputStream());

        //Odpowiedź na połączenie
        String resp2Connect = din.readLine();
        if (!resp2Connect.contains("+OK"))
            throw new ConnectException("Connection failed");

    }
....
//Tutaj działa ok
private void getListMails() throws IOException{
        System.out.println(TAG+" getListMails()");
        dout.writeBytes("LIST\n");
        dout.flush();
        String stringMessage;
        while((stringMessage=din.readLine()).length()>1){
            if(stringMessage.contains("+OK")){
                System.out.println(TAG+" get list of mails success");
            }else{
            //if(stringMessage.matches("\\d+\\s\\d+")) {
                String[] splited = stringMessage.split("\\s+");
                Mail mail = new Mail(Integer.parseInt(splited[0]), Integer.parseInt(splited[1]));
                recentMailbox.add(mail);
                //System.out.println(TAG+" nr:" + mail.getNumber() + " size:"+ mail.getSizeBytes());
            }
        }
    }
//Tutaj już nie działa.
    private void getUidsRecentMails() throws IOException {
        System.out.println(TAG+" getUidsRecentMails()");
        dout.writeBytes("UIDL");
        dout.flush();
        String uid="";

        while((uid=din.readLine()).length()>1) {
            System.out.println("Server:" + uid);
            if(uid.contains("+OK")) {
                System.out.println(uid);
            }else{
            //if(uid.matches("\\d+\\s\\d+[.]\\d+[.]\\d+")){
                String[] sp = uid.split("\\s");
                recentMailbox.get(Integer.parseInt(sp[0])-1).setUid(sp[1]);
            }
        }
    }