Telnet Java Socket Test - PullRequest
       8

Telnet Java Socket Test

2 голосов
/ 14 марта 2012

Мне нужно какое-то направление.Не уверен, что я на правильном пути, но я так думаю.Я пытаюсь создать Java-программу telnet, которая будет подключаться к клиентскому компьютеру, выполнить одну команду, а затем отключиться.Я могу заставить программу работать и считывать InputStream в текстовое поле (для целей тестирования), когда я подключаюсь к машине linux или моему маршрутизатору.Но когда я подключаюсь к машине с Windows или другому клиентскому компьютеру, это не работает.Он считывает некоторые случайные символы, затем блокируется.

Ниже приведен мой код.Я видел примеры другого кода, а также API от Apache, например.Мне бы очень хотелось посмотреть, смогу ли я заставить это работать только с Java Sockets.

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

    }

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Спасибо всем за помощь.Я действительно пытался заставить это работать в 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();
    }
    }
    }
2 голосов
/ 14 марта 2012

Telnet - это не просто необработанный сокет, есть контрольные коды, которые отправляются (в каждом направлении), которые вам нужно интерпретировать.

Вместо того, чтобы пытаться сделать это самостоятельно, вам лучше использоватьсуществующая клиентская библиотека Java Telnet, такая как в Apache Commons Net .

1 голос
/ 14 марта 2012

Если «случайные символы», которые вы видите, начинаются с байта 0xFF, это команды протокола Telnet.

Но у вас есть другая проблема. Не выполняйте длительные или блокирующие операции в потоке событий. Используйте отдельную тему.

...