2016-04-11 6 views
0

Мое требование - подключиться к некоторому серверу через telnet с помощью java-программы и выполнить несколько команд и прочитать ответы. На основе этих ответов я должен выполнить какую-то операциюАвтоматический клиент Telnet с использованием commons-net

Я strated с https://stackoverflow.com/a/1213188/1025328

Я использую Викискладу сеть и моя программа что-то вроде этого:

public class TelnetSample { 
    private TelnetClient telnet; 
    private InputStream in; 
    private PrintStream out; 

    public TelnetSample(String server, int port) { 
     try { 
      // Connect to the specified server 
      telnet = new TelnetClient(); 
      telnet.connect(server, port); 

      in = telnet.getInputStream(); 
      out = new PrintStream(telnet.getOutputStream()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String readResponse() { 
     System.out.println("TelnetSample.readResponse()"); 

     StringBuilder out = new StringBuilder(); 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       out.append(line); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println(out.toString()); 
     System.out.println("=========================================================="); 

     return out.toString(); 
    } 

    public String read2() { 
     System.out.println("TelnetSample.read()"); 

     StringBuffer sb = new StringBuffer(); 

     try { 
      int available = in.available(); 

      for (int index = 0; index < available; index++) { 
       char ch = (char) in.read(); 
       System.out.print(ch); 
       sb.append(ch); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 

    public String sendCommand(String command) { 
     try { 
      InputStream is = new ByteArrayInputStream(command.getBytes()); 

      int ch; 

      while ((ch = is.read()) != -1) { 
       out.write(ch); 
       out.flush(); 
      } 

      System.out.println(command); 

      String output = read2(); 

      if (output.trim().isEmpty()) { 
       System.out.println("output empty"); 
      } else { 
       System.out.println(output); 
      } 

      System.out.println("=========================================================="); 

      return output; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public void disconnect() { 
     try { 
      telnet.disconnect(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     try { 
      TelnetSample telnet = new TelnetSample("aspmx2.xxxxxx.com", 25); 
      telnet.readResponse(); 

      telnet.sendCommand("Helo hi"); 
      telnet.sendCommand("mail from:[email protected]"); 
      telnet.sendCommand("rcpt to:[email protected]"); 
      telnet.sendCommand("quit"); 

      telnet.disconnect(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Здесь обособленно формы соединения телнета ответ, для всех остальных sendCommand Я получаю пустой ответ. Может кто-нибудь указать мне, что может быть проблемой.

Мой вывод что-то вроде этого

TelnetSample.readResponse() 
220 mx.xxxxxx.com ESMTP o86si4086625pfi.217 - gsmtp 
========================================================== 
Helo hi 
TelnetSample.read() 
output empty 
========================================================== 
mail from:[email protected] 
TelnetSample.read() 
output empty 
========================================================== 
rcpt to:[email protected] 
TelnetSample.read() 
output empty 
========================================================== 
quit 
TelnetSample.read() 
output empty 
========================================================== 

ответ

0

Возможно read2 получает нулевое значение обратно из входного потока, прежде чем данные на самом деле вернулся. Попробуйте что-то вроде этого:

private String read2() { 

    StringBuffer sb = new StringBuffer(); 

    try { 
     do { 
      if (in.available() > 0) { 
       char ch = (char) in.read(); 
       sb.append(ch); 
      } else { 
       Thread.sleep(1000); 
      } 
     } while (in.available()>0); 

     String output = new String(sb); 
     return output; 

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

    return null; 

} 
0

Этот код имеет несколько вопрос:

  • первый выпуск в readResponse метода. Когда вы используете readLine(), вы можете легко заблокировать свой код и будете ждать всегда. Пожалуйста, ознакомьтесь с обсуждением How to determine the exact state of a BufferedReader?
  • второе, вы не отправляете CR/LF-символы. Сервер получил ваши запросы как одну строку. Пример:

почта от: [email protected] до: [email protected]

Чтобы исправить первый вопрос вы можете выбрать несколько способов:

  • использования мульти- резьба модель
  • использование NIO API. Я бы порекомендовал для этого Netty. В частности, для вашего случая, поскольку я вижу, что вы вообще не использовали протокол Telnet, вы подключились к SMTP-серверу.

Быстрое решение, но самое худшее, ждать первой линии от сервера и перейти на:

public String readResponse() { 
    System.out.println("TelnetSmtpSample.readResponse()"); 
    StringBuilder out = new StringBuilder(); 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     out.append(reader.readLine()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.out.println(out.toString()); 
    System.out.println("====================="); 

    return out.toString(); 
} 

Чтобы исправить второй один:

telnet.sendCommand("Helo hi\r\n"); 
    telnet.sendCommand("mail from:[email protected]\r\n"); 
    telnet.sendCommand("rcpt to:[email protected]\r\n"); 
    telnet.sendCommand("quit\r\n"); 
Смежные вопросы