关于使用TelnetClient实现Telnet通信的问题

是一格啊 2014-03-11 04:06:50
最近开发一个项目,用的java,有个上下位机通信的功能,也就是在客户端发送telnet命令到下位机,我用的是apache的开源包commons-net-3.2.jar里面的TelentClient,业务类代码类似下面
import java.io.InputStream;  
import java.io.PrintStream;
import org.apache.commons.net.telnet.TelnetClient;

public class NetTelnet {
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
private char prompt = '$';

// 普通用户结束
public NetTelnet(String ip, int port, String user, String password) {
try {
telnet.connect(ip, port);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
// 根据root用户设置结束符
this.prompt = user.equals("root") ? '#' : '$';
login(user, password);
} catch (Exception e) {
e.printStackTrace();
}
}

/** * 登录 * * @param user * @param password */
public void login(String user, String password) {
readUntil("login:");
write(user);
readUntil("Password:");
write(password);
readUntil(prompt + " ");
}

/** * 读取分析结果 * * @param pattern * @return */
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
char ch = (char) in.read();
while (true) {
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/** * 写操作 * * @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() {
try {
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
System.out.println("启动Telnet...");
String ip = "192.168.0.11";
int port = 23;
String user = "user";
String password = "111111";
NetTelnet telnet = new NetTelnet(ip, port, user, password);
telnet.sendCommand("export LANG=en");
String r1 = telnet.sendCommand("cd /home/project/");
String r2 = telnet.sendCommand("pwd");
String r3 = telnet.sendCommand("sh a.sh");
System.out.println("显示结果");
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}


readUntil方法中,用while循环去读取下位机返回的数据,当读取到结束符时跳出循环,目前我们下位机的系统是vxworks,如果发送像“i”这样一次性的命令可以正常得到结果,但是如果发送像“spy”这样用来循环读取的命令就不行了,这个命令是用来检测下位机状况的,使用这个命令时每隔几秒就会获取一次数据,但是结果里面有结束符,读到结束符时就跳出循环了,也就没办法继续监测下去了。所以去想请教各位,这里怎么设置return条件才能实现我想要的功能。
...全文
866 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
是一格啊 2014-07-21
  • 打赏
  • 举报
回复
引用 3 楼 jacky4631 的回复:
注册这个监听器,试试看,不确定能不能用
telnetClient.registerInputListener(new TelnetInputListener() {
				
				@Override
				public void telnetInputAvailable() {
					// TODO Auto-generated method stub
					//这里读流
				}
			});
能说详细点吗
忘了隐藏 2014-06-06
  • 打赏
  • 举报
回复
注册这个监听器,试试看,不确定能不能用
telnetClient.registerInputListener(new TelnetInputListener() {
				
				@Override
				public void telnetInputAvailable() {
					// TODO Auto-generated method stub
					//这里读流
				}
			});
yyfcsu 2014-06-02
  • 打赏
  • 举报
回复
很不错,可以更详细点吗?能不能提供完整的代码学习一下?
u010283208 2014-05-25
  • 打赏
  • 举报
回复
不错 看看。。。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧