我正在尝试创建一个简单的库(希望与世界共享),它允许通过telnet向远程设备发送和接收命令。
我正在努力保持代码尽可能简单并且它已经正常工作,但我似乎无法理解输入流是如何工作的;
我正在单独阅读每一行,通常输入应该在输入“Username:”处停止,之后我应该输入我的用户名。
实际发生的是,在我检测到我收到此行并发送响应后,已经太晚了(已收到新输入)。 知道telnet会话是如何工作的以及最后一个命令(远程设备等待之后)是如何收到的?
import java.util.*;
import java.io.*;
import java.net.*;
public class telnet {
public static void main(String[] args){
try{
//socket and buffer allocation
Scanner scan = new Scanner (System.in);
Socket socket = null;
PrintWriter out;
BufferedReader in;
String input; // temp input
String input1="";
String buff = ""; // holds all the input
//socket and IO initialization
socket = new Socket("10.10.10.2", 23);
out = new PrintWriter(socket.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int i=0;
int j=0;
while(true){
input = in.readLine(); //printout given line
System.out.println("line "+i+":\n"+input);
if (input.contains("Username")){ //if reading 'username' send response
System.out.println("!got Username");
out.println("user");
continue;
}
if (input1.contentEquals(input)){ //if input is the same wait once then send ENTER
if (j==0){
System.out.println("!read same line. wait for new");
i++; j++;
continue;
}
else{
System.out.println("!no new line. sending ENTER");
out.println("\r");
i++;j=0;
}
} else {j=0;}
input1=""; //copy input to temp string to check if same line or new
input1.concat(input);
i++;
if (i==20) break;
}
//CLOSE
out.close();
in.close();
socket.close();
} catch(IOException e){}
}
}
答案 0 :(得分:1)
telnet服务器和telnet客户端不只是来回发送纯文本。 There is a telnet protocol,客户端和服务器都可以相互发送命令。您要连接的telnet服务器可能正在尝试与您的程序协商某些设置更改,并且您的程序可能会将字节流解释为文本行。
标准的Unix telnet客户端程序在不与实际的telnet服务器通信时将禁止使用telnet协议。相反,它将回退到逐行发送文本并打印从服务器接收的任何内容。这允许程序用于与SMTP服务器,HTTP服务器等通信。 telnet服务器不一定具有此回退行为;它可能总是假设客户端实现协议。