Apache TelnetClient,InputStream无法使用Apache IOUtils转换为String

时间:2013-04-18 16:36:09

标签: java telnet

我在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");

我确信有一些非常简单的东西让我失踪。有人能帮忙吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

碰巧我能够解决这个问题 - 不完全是我想要的,但它足够适合简单的测试功能。

我将telnet inputStream写入文件而不是System.out.print。这使我可以从文件中读回字符串。

我仍然希望解决这个问题 - 我想这是一个线程问题,我仍然是一个从不开始的人,所以没有解决过这样的问题。