本例子使用aparch 基金的commons-net-3.1.jar包
网上例子虽然很多,但是都是简单的实现一个连接,如果我同时建立多个服务器连接,或一个服务器建立多个会话,都不行,感觉一个进程只能建立一个会话,要是继续建立会话,必须保证其它会话正确中断,但是即使调用了telnet.disconnect()方法,也没有真正关闭,我反编辑过commons-net-3.1.jar,里面没有看到单例对象或静态对象。我最大的怀疑对象是向服务器读取服务器返回报文的方法 /**
     * 读取分析结果
     *
     * @param pattern
     * @return
     */
    public String readUntil(String pattern) {
        StringBuffer sb = new StringBuffer();
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            char ch = 0;
            while ((ch = (char) in.read()) != -1) {
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        break;
                    }
                }
                            
            }
        } catch (Exception e) {
        }
        return sb.toString();
    }
由于上面代码的结束标识是操作系统的提示符做为中断标识,否则就进入死循环了。
还有就是in.read())方法可能一直等待服务器请求,而服务器没有请求,它就处于等待状态,然后程序就卡在这里了
下面是我程序的完整代码,请高手指点!
/**
 *
 * @author black
 */
public class SrvPropertiyBean {
    
    private String name;    
    private int port;
    private int protocol;
    private String username;
    private String password;
    private String hostname;
    public static final int TELNET_TYPE = 0;
    public static final int SSH_TYPE = 1;
    
    private SrvPropertiyBean() {
    }
    
    public SrvPropertiyBean(String name,  String hostname, int protocol, int port, String username, String password) {        
        this.setName(name);
        this.setHostname(hostname);
        this.setPassword(password);
        this.setPort(port);
        this.setProtocol(protocol);
        this.setUsername(username);
    }
    
    public String getHostname() {
        return hostname;
    }
    
    public void setHostname(String hostname) {
        this.hostname = hostname;
    }    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    public int getPort() {
        return port;
    }
    
    public void setPort(int port) {
        this.port = port;
    }
    
    public int getProtocol() {
        return protocol;
    }
    
    public void setProtocol(int protocol) {
        this.protocol = protocol;
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
}
**************************************************************************************/**
 *
 * @author black
 */
 class T extends Thread {    SrvPropertiyBean bean;    public T(SrvPropertiyBean bean) {
        this.bean = bean;
    }    public void run() {
        System.out.println("启动Telnet...");
        TelnetConnect telnet = new TelnetConnect(bean);
        String r1 = telnet.sendCommand("df -k");
        System.out.println(r1);
        telnet.disconnect();
    }
}
*********************************************************************************************import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.net.telnet.TelnetClient;/**
 * @descript TelnetConnect
 *
 * @author huang.yueyong @date Jun 10, 2010
 */
public class TelnetConnect {
//synchronized    private TelnetClient telnet = new TelnetClient();
    private InputStream in;
    private PrintStream out;
    private char prompt = '$';// 普通用户结束        public TelnetConnect(SrvPropertiyBean bean) {
        try {
            telnet.connect(bean.getHostname(), bean.getPort());
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
            // 根据root用户设置结束符    
            this.prompt = bean.getUsername().equals("root") ? '#' : '$';
            login(bean.getUsername(), bean.getPassword());
            System.out.println("登录成功....................");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 登录
     *
     * @param user
     * @param password
     */
    public void login(String user, String password) {
        System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        readUntil("login:");
        System.out.println("bbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
        write(user);
        System.out.println("ccccccccccccccccccccccccccccccccccc");
        readUntil("Password:");
        System.out.println("ddddddddddddddddddddddddddddddddd");
        write(password);
        System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
        readUntil(prompt + " ");
        System.out.println("ffffffffffffffffffffffffffffffffffff");
    }    /**
     * 读取分析结果
     *
     * @param pattern
     * @return
     */
    public String readUntil(String pattern) {
        StringBuffer sb = new StringBuffer();
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            char ch = 0;
            int index = 0;
            while ((ch = (char) in.read()) != -1) {
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        break;
                    }
                }
                if (index > 1024) {
                    break;
                }
                index++;
            }
        } catch (Exception e) {
        }
        return sb.toString();
    }    /**
     * 写操作
     *
     * @param value
     */
    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 向目标发送命令字符串
     *
     * @param command
     * @return
     */
    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }    /**
     * 关闭连接
     */
    public void disconnect() {
//        if (in != null) {
//            try {
//                in.close();
//            } catch (IOException ex) {
//               
//            }
//        }
//        if (out != null) {
//            out.close();
//        }
        if (telnet.isConnected()) {
            try {
                telnet.disconnect();
            } catch (IOException ex) {
            }
        }    }    public boolean testConnection() {
        boolean flag = false;
        String r1 = sendCommand("echo my_name_is_black");
        if (r1.split("\n")[0].trim().equals("my_name_is_black")) {
            flag = true;
        }
        //System.out.println(r1);
        this.disconnect();
        return flag;
    }    public static void main(String[] args) {
        try {
            SrvPropertiyBean bean = new SrvPropertiyBean("name", "192.168.1.1", 0, 23, "app", "app");
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();
            new T(bean).start();        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}