2013-05-01 173 views
1

我正在尝试创建一个简单的库(希望与全世界共享),它允许通过telnet发送和接收远程设备的命令。Telnet基本IO操作

我试图保持代码尽可能简单,它已经工作,但我似乎无法理解输入流如何工作;

我正在单独阅读每一行,通常输入应停止在输入“用户名:”之后,我应该键入我的用户名。

实际发生的事情是,在检测到我已收到此行并发送响应之后,它已经太晚了(已收到新输入)。 是否知道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){} 
} 
} 

回答

1

远程登录服务器和远程登录客户端不仅仅来回发送纯文本。 There is a telnet protocol,并且客户端和服务器都可以向对方发送命令。您正在连接的telnet服务器可能正试图与您的程序协商一些设置更改,并且您的程序可能会将字节流解释为文本行。

标准的Unix远程登录客户端程序将在不与实际的远程登录服务器通话时使用远程登录协议进行压缩。相反,它将回退到逐行发送文本并打印从服务器收到的任何内容。这允许程序用于与SMTP服务器,HTTP服务器等进行通信。 Telnet服务器不一定具有此回退行为;它可能总是假设客户端实现协议。