1

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

我试图使代码尽可能简单并且它已经在工作,但我似乎无法理解输入流是如何工作的;

我正在分别阅读每一行,通常输入应该在输入“用户名:”处停止,然后我应该输入我的用户名。

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

1 回答 1

1

telnet 服务器和 telnet 客户端不只是来回发送纯文本。有一个 telnet 协议,客户端和服务器都可以互相发送命令。您正在连接的 telnet 服务器可能正在尝试与您的程序协商某些设置更改,并且您的程序可能会将字节流解释为文本行。

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

于 2013-05-01T21:22:32.840 回答