2012-03-13 9 views
2

私はある方向を必要としています。私が正しい道にいるかどうかは分かりませんが、私はそう考えています。私は、クライアントマシンに接続し、単一のコマンドを実行して切断するTelnet Javaプログラムを作成しようとしています。私は、Linuxマシンやルータに接続するときにプログラムを動作させ、InputStreamをテキストフィールドに読み出すことができます(テスト目的のために)。しかし、Windowsマシンや他のクライアントコンピュータに接続すると、動作しません。それはいくつかのランダムな文字を読んだ後、ロックアップします。Telnet Javaソケットテスト

以下は私のコードです。 ApacheのAPIと同様に、他のコードの例も見てきました。私は本当にこれをJavaソケットだけで動作させることができるかどうか確認したいと思います。

public class TestSockets extends JFrame implements ActionListener { 

/** 
* @param args 
*/ 
private String USER = "User"; 
private String PASS = "Password01"; 
private final static String CMD = "exit\r\n"; 
private static Socket telnet = null; 
private PrintWriter writer = null; 
private static InputStream reader = null; 
private String host = "192.168.1.1"; 
private int port = 23; 
TextArea javatext; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    new TestSockets().setVisible(true); 
} 

private TestSockets() { 
    super("Testing Buttons"); 

    //Set JFrame size 
    setSize(500, 600); 

    //Gives JFrame a location 
    setLocation(100, 100); 

    //set layout 
    setLayout(new FlowLayout()); 

    javatext = new TextArea(25, 65); 

    add(javatext); 

    //Ask for window decorations provided by the look and feel. 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    JButton button3 = new JButton("Run Program"); 
    button3.addActionListener(this); 
    add(button3); 
} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 
    try { 
     telnet = new Socket(host, port); 
     telnet.setKeepAlive(true); 
     //reader = telnet.getInputStream(); 
     writer = new PrintWriter(telnet.getOutputStream()); 
     reader = telnet.getInputStream(); 
     //out = telnet.getOutputStream(); 
     //Process p = Runtime.getRuntime().exec("telnet " + server.toString(), null, null); 
     //DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
     //DataInputStream in = new DataInputStream(p.getInputStream()); 

     StringBuilder sb = new StringBuilder(); 
     byte[] buffer = new byte[4096]; // Read 4K characters at a time 
     int len; // How many chars read each time 
      while ((len = reader.read(buffer)) != -1) { 
      String readchar = new String(buffer, 0, len); 
      sb.append(readchar + "\n"); 
      System.out.println(readchar); 
      javatext.append(readchar); 
      if (readchar.endsWith("login: ")) { 
       writer.print(USER + "\r\n"); 
       writer.flush(); 
      } 
      if (readchar.endsWith("Password: ")) { 
       writer.print(PASS + "\r\n"); 
       writer.flush(); 
      } 
      if (readchar.endsWith("password: ")) { 
       writer.print(PASS + "\r\n"); 
       writer.flush(); 
      } 
      if (readchar.endsWith("# ")) { 
       writer.print(CMD); 
       writer.flush(); 
      } 
      if (readchar.endsWith("# ")) { 
       writer.print(CMD); 
       writer.flush(); 
      } 

     }   
} catch (SocketException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace();  
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 

    } 
+0

実際には悪いデータであることをどのように知っていますか?何らかの認証データを取得している可能性があります。出力を教えてください。また、何を試しましたか? –

+0

私が読んだところから、あなたは正しいです。これは認証データです。私の問題は、Windowsのボックスに接続しようとすると、それ以上のことはしないということです。このプログラムは、Linuxと私のルータでうまく動作します。 – itgeek25

答えて

3

ご協力ありがとうございます。私はAndroid上でこれを動作させることを実際に試みていましたが、まさにJavaアプリケーションでの原案を作成していました。私は大まかなアイデアを得て、それは動作します。出力を読むと、StringBuilderのすべての文字が何度も繰り返されます。大きな懸念ではなく、とにかく出力を実際に表示しようとしていません。ここで私は何を終えたのですか?必要ならば、これは他の誰にも役立ちます。

public class AndroidSocket extends Activity implements OnClickListener { 

TextView text; 
EditText edit1, edit2, edit3, edit4; 
private String USER = null; 
private String PASS = null; 
Editable server, username, password, command; 
private String CMD = null; 
private PrintStream writer = null; 
private static BufferedReader reader = null; 
private String host = null; 
private int port = 23; 
private TelnetClient telnet = new TelnetClient(); 
private InputStream in; 
private PrintStream out; 
StringBuffer sb; 
Handler mHandler = new Handler(); 
int len; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    text = (TextView)findViewById(R.id.text); 
    edit1 = (EditText)findViewById(R.id.edit1); 
    edit2 = (EditText)findViewById(R.id.edit2); 
    edit3 = (EditText)findViewById(R.id.edit3); 
    edit4 = (EditText)findViewById(R.id.edit4); 

    server = edit1.getEditableText(); 
    username = edit2.getEditableText(); 
    password = edit3.getEditableText(); 
    command = edit4.getEditableText(); 

    Button button = (Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 
    text.setText("Android Socket" + "\n"); 
    } 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    text.setText("Android Socket" + "\n"); 
    try { 
     telnet.connect(server.toString(), 23); 
     in = telnet.getInputStream(); 
     out = new PrintStream(telnet.getOutputStream()); 
     reader = new BufferedReader(new InputStreamReader(telnet.getInputStream())); 
     writer = new PrintStream(telnet.getOutputStream()); 
    telnet.setKeepAlive(true); 
    Thread mThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       sb = new StringBuffer(); 
       //char[] buffer = new char[1024]; 
        while (true) 
        { 
          len = in.read(); 
          String s = Character.toString((char)len); 
          sb.append(s); 
          AndroidSocket.this.mHandler.post(new Runnable(){ 

           @Override 
           public void run() { 
            // TODO Auto-generated method stub 
            AndroidSocket.this.text.getText(); 
            AndroidSocket.this.text.append(sb.toString()); 
           } 

          }); 
          System.out.println(sb); 
          mylogin(); 
          mypass(); 
          mycommand(); 
         } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 

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

    private void mycommand() throws IOException { 
      // TODO Auto-generated method stub 
if (sb.toString().endsWith("> ")) { 
    out.println(command.toString() + "\r\n"); 
    out.flush(); 
    out.println("exit\r\n"); 
    out.flush(); 
    try { 
     TimeUnit.SECONDS.sleep(10); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    disconnect(); 
} else 
if (sb.toString().endsWith("# ")) { 
    out.println(command.toString() + "\r\n"); 
    out.flush(); 
    out.println("exit\r\n"); 
    out.flush(); 
    try { 
     TimeUnit.SECONDS.sleep(10); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    disconnect(); 
} 
} 

    private void mypass() { 
    // TODO Auto-generated method stub 
if (sb.toString().endsWith("Password: ")) { 
    out.println(password.toString() + "\r\n"); 
    out.flush(); 
} else 
if (sb.toString().endsWith("password: ")) { 
    out.println(password.toString() + "\r\n"); 
    out.flush(); 
} 
} 

    private void mylogin() { 
    // TODO Auto-generated method stub 
if (sb.toString().endsWith("login: ")) { 
    out.println(username.toString() + "\r"); 
    out.flush(); 
} 
} 

     public void disconnect() { 
    try { 
in.close(); 
out.close(); 
telnet.disconnect(); 

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

修正のおめでとうございます。あなたができるときは、他の人があなたの解決策を見つけるのを助けるためにあなたの答えを「受け入れられた」とマークしてください。乾杯〜 –

1

「ランダムな文字」が0xFFバイトで始まる場合は、Telnetプロトコルコマンドです。

しかし、別の問題があります。イベント・スレッドで長期実行またはブロッキング操作を実行しないでください。別のスレッドを使用します。

+0

私は新しいスレッドを作成し、別々のプロセスで書き込みコードと読み取りコードを実行しようとしました。まだ同じ問題です。これが私の心を揺さぶるものです。私はドン; tは、ウィンドウに接続しようとすると、何かエラーや問題が、それだけでハングアップします。 Telnetは私が試しているWindowsマシンで動作します。 – itgeek25

+0

@ itgeek25あなたのコードでは、各読み取りが一行全体であると仮定しています。 readLine()を使用してください。 – EJP

+0

@ itgeek25別スレッドを使用することは間違いありませんが、「ランダム」文字の問題は解決しません。 – EJP

2

Telnetは単なるrawソケットではなく、解釈する必要のある(各方向の)制御コードがあります。

あなた自身でやろうとするのではなく、Apache Commons Netのような既存のJava Telnetクライアントライブラリを使用する方がよいでしょう。

+0

私はWindowsのボックスでもApacheコードを使用しようとしました。同じ問題、Linuxで動作しますが、Windowsマシンでは動作しません。私はJavaで書かれた誰かのelsesアプリケーションを使用しましたが、これは素晴らしいです。私は自分のコードを自分のものと比較しましたが、少し異なりますが、入力を読み込んで同じものを出力します。彼らの作品は動作しますが、私はしません。これが私の髪の残りを引き出している理由です。 – itgeek25

+0

"それ自身で使用されるTelnetClientクラスは、主にインタラクティブな使用ではなく、telnetリソースへのアクセスの自動化を目的としています。 http://svn.apache.org/repos/asf/commons/proper/net/tags/NET_1_0_0/src/java/examples/weatherTelnet.javaは有用なライブラリではありません、IMHO – Thufir