问题:我似乎无法从缓冲的reader.readline()中脱离“无限循环/块”。它传递一次,然后在第二次来自while循环后挂在那里。
这是我的代码:
public void sendCommand(String command){
{
String line;
try{
while((line = consoleOutput.readLine())!= null)
{
System.out.println(line);
if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){
pin.write((command + "\n\r").getBytes());
}
}
}
我正在使用nilbot使用的方法:Here 我正在做这个,我试图通过shell发送命令。
问题:
我想要完成的是让程序等到服务器准备好接收更多命令(等待提示“rkscli”,因为某些命令需要更多时间)。我该怎么做才能做到这一点?我目前正在使用pipedinput / output方法。
其他信息:
服务器会在提示符之前给我“”(带换行符的空字符串)。经过一些,它会给我提示。我也注意到,如果我改变了代码,它看起来像这样:
public void sendCommand(String command){
{
String line;
try{
while((line = consoleOutput.readLine())!= null)
{
System.out.println(line);
pin.write("\r\n".getBytes());//Added line
if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){
pin.write((command + "\n\r").getBytes());
}
}
}
它不会挂起在bufferedReader.readline()但是会经历并跳过写入(它似乎没有向shell写入任何内容,有时会出现并且不可预测)
关于我能做什么的任何想法?
答案 0 :(得分:0)
好吧,我相信我通过读取每个字符(逐字符)而不是读取行来解决问题,因为它是一个shell,它永远不会给出终止(null)字符“/ 00”,如果我是没错,读取行会查找并继续等待,直到找到阻塞而不继续。
这是修改后的代码:
line = new StringBuilder();
boolean ready = false;
int c = 0;
Thread.sleep(1000);//needs to sleep, it isnt ready :(
while((ready = consoleOutput.ready()) == true){
ready = consoleOutput.ready();
c = consoleOutput.read();//read char by char
line.append((char)c);
if((char)c == ':' && (c=consoleOutput.read()) == 0x20 && (consoleOutput.ready()!= true)){
pin.write((command + "\n\r").getBytes());//writing after ready
pin.flush();
System.out.println(line.toString() + command);
line = null;
break;
}
我在第一个问题中向shell写了一些奇怪的问题,当我向shell写入任何内容时,它会继续读取行并且不会阻塞,因为它正在读取并读取该行。