日期:2014-05-19  浏览次数:20805 次

怎么添加一个线程,在发送信息的同时,接受信息?
下面的代码能Telnet到远程主机,并执行脚本。但是在执行write(command)时,如果不用for(int i=0;i<800000000;i++);那么程序等不到接收到的数据就退出了。怎么添加个线程,可以在发送信息(out.println)的时候,可以同步接受信息(printresponse)呢?

Java code

import org.apache.commons.net.telnet.*;
import java.io.*;

public class TmhTelnet {
    private static TelnetClient tc = null;
    private InputStream in;
    private PrintStream out;

    public static void main(String args[]) {
        new TmhTelnet("192.168.5.55",23,"root","1234");
    }

    public TmhTelnet(String host, int port, String username, String password) {
        byte[] a = new byte[1024];
        if (intconnect(host, port)) {
            write(username);
            write(password);
            write("test.bat");
            closeconnect();
        }
    }

    private void writescript(String filename) {
        try {
            if (new File(filename).exists()) {
                FileReader f = new FileReader(filename);
                BufferedReader reader = new BufferedReader(f);
                String command = "";
                while (command != null) {
                    command = reader.readLine();
                    write(command);
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void write(String command) {
        try {
            //System.out.println("command:>>>>>>>>>" + command);
            out.println(command);
            out.flush();

[color=#FF0000]            // for(int i=0;i<800000000;i++);
            // 应该使用线程同步使程序在接受到对方相应后再执行下一条命令这里使用for循环来模拟对方的相应时间[/color]
            printresponse();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean intconnect(String host, int port) {
        try {
            tc = new TelnetClient();
            TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
                    "VT220", false, false, true, false);
            EchoOptionHandler echoopt = new EchoOptionHandler(true, false,
                    true, false);
            SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true,
                    true, true, true);
            tc.addOptionHandler(ttopt);
            tc.addOptionHandler(echoopt);
            tc.addOptionHandler(gaopt);
            tc.connect(host, port);
            in = tc.getInputStream();
            out = new PrintStream(tc.getOutputStream());
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            try {
                tc.disconnect();
                in.close();
                out.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            return false;
        }
    }

    private void closeconnect() {
        try {
            tc.disconnect();
            in.close();
            // out.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

    private String printresponse() {
        try {
            byte[] buff = new byte[1024];
            int ret_read = 0;
            do {
                ret_read = in.read(buff);
                String a = new String(buff, 0, ret_read);
                if (a.endsWith(": ") | a.endsWith(">") | a.endsWith("]")) {