私はかなり生である。私は、Telnetと対話するJavaクラスを作成しようとしています。 Apache CommonsとJsacpeにAPIがあることがわかりました。私はJscapeのSinetfactoryを使用しています。私が接続しようとしているTelnetは、telnet.connect()が発生するとすぐに「User name ?:」と入力するよう促します。私はこのプロンプトが実際に起こっていることを確認する必要がありますので、何か他のことが起こったときに答えを書くだけではありません。私はこれを経験しておらず、簡単な答えがあると確信しています。Java、Telnet、InputStreamで文字列をチェックする
これは私が持っているものです。ストリームから最後の文字を実際に読み取る方法がわからないからです。
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が実際に "ユーザ名?"、 "パスワード:"、 "ComputerName:/ h0>"を要求していることを確認しています。これは可能ではありませんが、良い習慣であるようで、物事があまりにもゆっくりと動き、コードがそれをチェックするまでにプロンプトが流れていなければ、sleep()を避けるのに役立ちます。それは理にかなっていますか? –
私の答えは、まったく役に立ちました@MikeNickですか?もしそうなら、受け入れてください。 – Gray