2016-04-11 47 views
0

Benim gereksinimim, bir java programı kullanarak telnet aracılığıyla bazı sunucuya bağlanmak ve birkaç komut çalıştırmak ve yanıtları okumaktır.commons-net kullanarak otomatik Telnet istemcisi

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(); 
     } 
    } 
} 

İşte birbirinden telnet bağlantısını meydana: Bu cevaplara dayanarak ben https://stackoverflow.com/a/1213188/1025328

ile strated bazı operasyon

Ben Commons-net kullanarak değilim ve benim program böyle bir şeydir gerçekleştirmek için gereken Yanıt, her diğer sendCommand için boş bir yanıt alıyorum. Biri bana sorunun ne olabileceğini gösterir.

Benim çıkış Veri aslında döndürülür önce mümkün read2 giriş akımından geri boş değer elde mi bu

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 
========================================================== 

cevap

0

gibi bir şeydir. Böyle bir şey deneyin:

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

Bu kod birkaç sorunu var:

  • ilk sayısı readResponse yöntemindedir. readLine()'u kullandığınızda, kodunuzu kolayca engelleyebilir ve sonsuza kadar bekleyebilirsiniz. Lütfen herhangi bir CR/LF karakterini göndermediğiniz ikinciye bakınız: How to determine the exact state of a BufferedReader?
  • . Sunucu isteklerinizi tek bir satır gibi aldı. Ör:

mail from: [email protected] için:

size birkaç yol seçebilir ilk sorunu gidermek için diş açma modeli NIO API'yi kullanın. Bunun için Netty tavsiye ederim. Özellikle de gördüğünüz gibi, Telnet protokolünü hiç kullanmadıysanız SMTP sunucusuna bağlandınız.

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(); 
} 

ikincisi düzeltmek için::

Hızlı çözüm ama en kötü, sunucudan ilk satırı bekleyin ve devam

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");