【问题标题】:Java, Telnet, check for String in an InputStreamJava,Telnet,检查 InputStream 中的字符串
【发布时间】:2011-12-28 23:37:13
【问题描述】:

我很原始。我正在尝试编写一个 Java 类来与 Telnet 交互。我看到 Apache Commons 和 Jsacpe 有 API。我正在使用 Jscape 的 Sinetfactory。一旦 telnet.connect() 发生,我正在连接的 Telnet 会立即发送输入“用户名?:”的提示。我需要验证这个提示是否真的发生了,所以我不只是在可能发生其他事情时写下答案。我对此缺乏经验,并且确信有一个简单的答案,只是想知道是否有人可以提供帮助。

这就是我所拥有的,它有点草率,因为我已经玩了一段时间了,不知道如何真正从流中读取最后一个字符。

import com.jscape.inet.telnet.*;

public class TelnetTest extends TelnetAdapter {

    private final static String USER = "xxx\r";
    private final static String PWORD = "yyy\r";
    private final static String COMMAND = "zzz\r";
    private final static byte[] USER_BYTE = USER.getBytes();
    private final static byte[] PWORD_BYTE = PWORD.getBytes();
    private final static byte[] COMMAND_BYTE = COMMAND.getBytes();
    private Telnet telnet = null;
    private OutputStream output = null;
    private static BufferedReader reader = null;
    private boolean connected = false;
    private String hostname = "qqq";
    //TelnetInputStream tis = null; NOT IN USE AS OF NOW

    public TelnetTest() throws IOException, TelnetException {

        // create new Telnet instance
        telnet = new Telnet(hostname);

        // register this class as TelnetListener
        telnet.addTelnetListener(this);

        // establish Telnet connection
        telnet.connect();
        connected = true;
        output = telnet.getOutputStream();

// HERE IS WHERE I NEED HELP, NOT SURE HOW TO CHECK STREAM
        String str = null;
        if ((str = reader.readline()).equals("User name?:")) {
            telnet.getOutputStream().write(USER_BYTE);
        }
// SAME CHECK WOULD HAPPEN HERE FOR "Password"
        telnet.getOutputStream().write(PWORD_BYTE);
//  ANOTHER SIMILAR CHECK HERE
        telnet.getOutputStream().write(COMMAND_BYTE);

        // sends all data entered at console to Telnet server
        String input = null;
        while ((input = reader.readLine()) != null) {
            if (connected) {
                ((TelnetOutputStream) output).println(input);
            } else {
                break;
            }
        }
    }

    public boolean streamContainsString(Reader reader, String searchString)
            throws IOException {
        Scanner streamScanner = new Scanner(reader);
        if (streamScanner.findWithinHorizon(searchString, 0) != null) {
            return true;
        } else {
            return false;
        }
    }

    // Invoked when Telnet socked is connected.
    public void connected(TelnetConnectedEvent event) {
        System.out.println("Connected");
    }

    // Invoked when Telnet socket is disconnected. Disconnect can
    public void disconnected(TelnetDisconnectedEvent event) {
        connected = false;
        System.out.print("Disconnected.  Press enter key to quit.");
    }

    // Invoked when Telnet server requests that the Telnet client begin performing               specified TelnetOption.
    public void doOption(DoOptionEvent event) {
        // refuse any options requested by Telnet server
        telnet.sendWontOption(event.getOption());
    }

    // Invoked when Telnet server offers to begin performing specified TelnetOption.
    public void willOption(WillOptionEvent event) {
        // refuse any options offered by Telnet server
        telnet.sendDontOption(event.getOption());
    }

    // Invoked when data is received from Telnet server.
    public void dataReceived(TelnetDataReceivedEvent event) {
        // print data recevied from Telnet server to console
        System.out.print(event.getData());
    }

    public Telnet getTelnet() {
        return telnet;
    }

    // starts console program
    public static void main(String[] args) {
        try {
            // create BufferedReader to read data from console
            reader = new BufferedReader(new InputStreamReader(System.in));

            // create new TelnetExample instance
            TelnetTest example = new TelnetTest();

        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

【问题讨论】:

  • 我不明白您所说的“验证此提示是否实际发生”是什么意思。这是否需要在连接后显示用户名或检查用户是否实际输入了某些内容而不是将其留空?
  • 我的意思是确保 telnet 实际上是在询问“用户名?”、“密码:”和“计算机名:/h0>”,而不是 telnet 可能正在等待的其他文本。这不太可能,但似乎是一种很好的做法,如果事情进展得太慢并且在代码检查时提示不在流中,这有助于避免 sleep()。这有意义吗?
  • 我的回答对@MikeNick 有帮助吗?如果是,请接受。

标签: java inputstream telnet outputstream


【解决方案1】:

如果您正在读/写字符串,那么您应该始终使用ReaderWriterBufferedReader 允许您进行线路操作。因此,包裹在 Reader 周围的 BufferedReader(围绕 InputStreamReader)将允许您执行 readLine() 调用以从连接中获取输入行:

 BufferedReader reader =
     new BufferedReader(new InputStreamReader(telnet.getInputStream()));

要写入连接,您可以在 OutputStreamWriter 周围使用 Writer

 Writer writer = new OutputStreamWriter(telnet.getOutputStream()));

我不确定这是否适用于来自Telnet 的流,但它适用于原始Socket。然后,您可以执行类似以下伪代码的操作:

 while (true) {
     read a line from the server
     some sort of if/then/else to test for the output
     write your username/password or whatever is appropriate for the connection
     repeat until some logout or IOException...
 }

Apache Telnet 类有许多有趣的侦听器和其他处理程序,如果您愿意,可以使用它们,但学习曲线可能更多。这是一个使用 TelnetClient 的很好的示例应用程序:

http://www.java2s.com/Code/Java/Network-Protocol/ExampleofuseofTelnetClient.htm

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2013-10-29
    • 2014-11-03
    • 2017-12-04
    • 1970-01-01
    • 2012-07-14
    • 2016-01-14
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多