我在telnet会话中遇到一些InputStream问题。我已经建立了连接,我可以通过telnet成功发送命令,使用System.out.println,我可以看到我收到了正确的响应。
我需要以会话形式返回会话中的响应,因为我需要对其执行正则表达式以验证测试的值。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.SocketException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.telnet.TelnetClient;
public class TelnetService {
private final String server;
private final int port;
private TelnetClient telnet = new TelnetClient();
private InputStream dataIn;
private PrintStream dataOut;
private String prompt = "~$";
public TelnetService(String server, int port) {
this.server = server.replace("http://", "");
this.port = port;
}
private void startTelnetSession() throws SocketException, IOException {
telnet.connect(server, port);
dataIn = telnet.getInputStream();
dataOut = new PrintStream(telnet.getOutputStream());
}
public String getTelnetSessionAsString() {
try {
startTelnetSession();
loginUser();
readUntil(prompt);
write("this_command");
readUntil(prompt);
StringWriter writer = new StringWriter();
IOUtils.copy(dataIn, writer, "UTF-8");
dataOut.flush();
dataIn.close();
dataOut.close();
String received = writer.toString();
telnet.disconnect();
return received;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private void loginUser() {
readUntil("login:");
write("foo");
readUntil("Password:");
write("bar");
}
private void write(String value) {
try {
dataOut.println(value);
dataOut.flush();
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
private String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer buffer = new StringBuffer();
char ch = (char) dataIn.read();
while (true) {
System.out.print(ch);
buffer.append(ch);
if (ch == lastChar) {
if (buffer.toString().endsWith(pattern)) {
return buffer.toString();
}
}
ch = (char) dataIn.read();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
实际上,无论何时运行调用此类的测试,它都会在
期间显示为“挂起”IOUtils.copy(dataIn, writer, "UTF-8");
我确信有一些非常简单的东西让我失踪。有人能帮忙吗?非常感谢!
答案 0 :(得分:1)
碰巧我能够解决这个问题 - 不完全是我想要的,但它足够适合简单的测试功能。
我将telnet inputStream写入文件而不是System.out.print。这使我可以从文件中读回字符串。
我仍然希望解决这个问题 - 我想这是一个线程问题,我仍然是一个从不开始的人,所以没有解决过这样的问题。