【问题标题】:Uable to connect to telnet socket properly无法正确连接到 telnet 套接字
【发布时间】:2016-09-12 23:12:47
【问题描述】:

我正在尝试连接到远程登录服务器,但是当我连接到在端口 9999 上运行的远程登录服务器时。但是当我运行此代码时。它显示欢迎消息,但没有命令起作用。

public static void main(String[] args) {
    FileOutputStream fos = null;
    final String server = "erdos.dsm.fordham.edu";
    final int port = 9999;

    Socket sock = null;
     PrintWriter out = null;
    BufferedReader in = null;
    try {
        sock = new Socket(server,port);
        sock.setKeepAlive(true);

        out = new PrintWriter(sock.getOutputStream(),true);
        in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    } catch (IOException ex) {
        Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {

        System.out.println(in.readLine());

        Scanner scanner = new Scanner(System.in);
        String s =  scanner.nextLine();
        s = s.toUpperCase();
    while(!s.equals("QUIT"))
    {

        out.print(s);
        out.flush();
        System.out.println(in.read());
         s =  scanner.nextLine();
    }   
        System.out.println("Thanks for playing bye");

    } catch (IOException ex) {
        Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE,null, ex);
    }
}

【问题讨论】:

    标签: java telnet


    【解决方案1】:

    已编辑:通过回答以前的版本查看第一个版本

    这很令人毛骨悚然,但它确实有效。因为我无法在命令后找到传入数据的终端,所以我决定添加一个可读取的 Runnable+Thread 和一个方法,在考虑之前等待 100 毫秒(或更多,如果需要)来读取已读取的内容已收到全部数据。

    package base_test;
    
    import java.io.BufferedReader;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            FileOutputStream fos = null;
            final String server = "erdos.dsm.fordham.edu";
            final int port = 9999;
    
            Socket sock = null;
            PrintWriter out = null;
            BufferedReader in = null;
            try {
                sock = new Socket(server, port);
                sock.setKeepAlive(true);
    
                out = new PrintWriter(sock.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            } catch (IOException ex) {
                ex.printStackTrace();
                // Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE, null,
                // ex);
            }
    
            //Start a different that listen to incoming data
            DataReader dr = new DataReader(in);
            Thread dataThread = new Thread(dr);
            dataThread.start();
    
    
            try {
    
                Scanner scanner = new Scanner(System.in);
                String s = "";
                do {
                    System.out.println(dr.getLastData());
    
                    s = scanner.nextLine();
                    s = s.toUpperCase();
                    if (s.isEmpty())
                        continue;
    
                    out.println(s);
                } while (!s.equals("QUIT"));
                System.out.println("Thanks for playing bye");
    
            } catch (Exception ex) {
                ex.printStackTrace();
                // Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE,null,
                // ex);
            }
        }
    }
    

    DataReader 类:

    package base_test;
    
    import java.io.BufferedReader;
    import java.util.LinkedList;
    
    public class DataReader implements Runnable {
    
        private final int MAX_WAITING_LOOPS = 100;
    
        private LinkedList<StringBuilder> receivedData = new LinkedList<>();
        private BufferedReader in;
        private boolean isWaiting = true;
        private boolean isReceiving = false;
    
        public DataReader(BufferedReader in) {
            this.in = in;
            receivedData.push(new StringBuilder());
        }
    
        @Override
        public void run() {
            do {
                try {
                    isWaiting = true;
    
                    char last = (char)in.read();
                    StringBuilder sb = receivedData.peek();
                    sb.append(last);
    
                    isWaiting = false;
                    isReceiving = true;
                } catch(Exception e) {
                    e.printStackTrace();
                }
    
            } while (true);
        }
    
        public String getLastData() throws InterruptedException {
            int loopCount = 0;
    
            while (loopCount < MAX_WAITING_LOOPS) {
                if (isReceiving == false || isWaiting == false) {
                    //System.out.println("===RESET");
                    loopCount = 0;
                } else {
                    loopCount++;
                }
                Thread.sleep(1);
            }
    
            isReceiving = false;
    
            receivedData.push(new StringBuilder());
            StringBuilder sb = receivedData.pollLast();
            return sb.toString();
        }
    }
    

    【讨论】:

    • 感谢它工作得很好,但不会读取整行,例如,如果我输入帮助它只会返回第一行
    • 是的。我知道,因为在第一行和其他行之间跳过了一行。您是否编写了服务器部分的代码?
    • Telnet 中的行终止符是\r\n,而不是\n。您没有测试 readLine() 返回 null,而测试空行似乎毫无意义。
    • 我同意!这就是为什么我当前的版本(未发布)是通过逐个字符读取字符,但从未发生过返回 \r\n 的情况。我不认为它可以返回null。我不认为它是一个正确定义的 TELNET 服务器。在命令末尾使用\r\n 根本不起作用。
    • 因为我知道转义字符串是 C-] 或 Ctrl ]
    猜你喜欢
    • 2012-04-03
    • 2012-02-27
    • 2018-03-12
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多