2012-03-13 3 views
2

나는 어떤 방향이 필요합니다. 내가 올바른 길을 가고 있는지 잘 모르겠지만 그렇게 생각합니다. 클라이언트 시스템에 연결하고 단일 명령을 실행 한 후 연결을 끊는 텔넷 java 프로그램을 작성하려고합니다. 나는 작동하도록 프로그램을 가져올 수 있고 InputStream을 텍스트 필드 (테스트 용)로 읽을 때 리눅스 머신이나 라우터에 연결할 수있다. 그러나 Windows 컴퓨터 나 다른 클라이언트 컴퓨터에 연결하면 작동하지 않습니다. 임의의 문자를 읽은 다음 잠급니다.텔넷 Java 소켓 테스트

아래 코드는 제 코드입니다. 아파치의 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 상자에 연결하려고 할 때 더 이상 나아지지 않는다는 것입니다. 이 프로그램은 리눅스와 라우터에서 잘 작동합니다. – itgeek25

답변

3

감사합니다 everyones 도움. 나는 이것을 안드로이드에서 작동 시키려고 정말로 노력했지만, 곧바로 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 바이트로 시작하는 경우 텔넷 프로토콜 명령입니다.

하지만 다른 문제가 있습니다. 이벤트 스레드에서 장기 실행 또는 블로킹 조작을 실행하지 마십시오. 별도의 스레드를 사용하십시오.

+0

새로운 스레드를 만들고 별도의 프로세스에서 쓰기 및 읽기 코드를 실행하려고했습니다. 여전히 같은 문제입니다. 이것이 내 마음을 괴롭히는 것입니다. 나는 아무런 오류나 문제가 발생하지 않으면 창문에 연결하려고 할 때 멈춰 버린다. 텔넷은 내가 시도하고있는 윈도우 머신에서 작동한다. – itgeek25

+0

@ itgeek25 코드는 각 읽기가 전체 행이라고 가정합니다. readLine()을 사용하십시오. – EJP

+0

@ itgeek25 별도의 스레드를 사용해야하는 것은 분명하지만 '임의의'문자 문제는 해결되지 않습니다. – EJP

2

텔넷은 단순히 원시 소켓이 아니며 해석해야하는 (각 방향으로) 보내지는 제어 코드가 있습니다.

너 자신을하려고하는 것이 아니라에있는 것과 같은 기존 Java 텔넷 클라이언트 라이브러리를 사용하는 것이 좋습니다.

+0

Windows 상자에서도 Apache 코드를 사용하려고했습니다. 같은 문제, 리눅스와 함께 작동하지만 내 Windows 컴퓨터가 아닙니다. 나는 자바로 작성된 누군가의 elses 응용 프로그램을 사용했다. 내 코드를 코드와 비교했다. 약간 다르지만 입력 및 출력을 똑같이 읽는다. 그들의 작품은 작동하지만 내 것은 그렇지 않습니다. 이것이 내 머리카락을 꺼내는 이유입니다. – itgeek25

+0

"자체적으로 사용되는 TelnetClient 클래스는 대개 대화식 사용이 아닌 텔넷 리소스에 대한 액세스 자동화를위한 것입니다." http://svn.apache.org/repos/asf/commons/proper/net/tags/NET_1_0_0/src/java/examples/weatherTelnet.java 유용한 라이브러리가 아닙니다. IMHO – Thufir