本例子使用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();
}
}
}
网上例子虽然很多,但是都是简单的实现一个连接,如果我同时建立多个服务器连接,或一个服务器建立多个会话,都不行,感觉一个进程只能建立一个会话,要是继续建立会话,必须保证其它会话正确中断,但是即使调用了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();
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货