【问题标题】:java telnet socket : BufferedReader / BufferedWriterjava telnet 套接字:BufferedReader / BufferedWriter
【发布时间】:2013-12-07 00:42:39
【问题描述】:

我的服务器在 23999 上打开了一个 telnet 端口,当我给 telnet localhost 23999 时,它显示如下:

< BP-SAS ==> bplin19 !>telnet 0 23999
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
Please enter password to authenticate:
(here i give password for example abc123)   
Enter 'help' at any point to get a listing of all registered commands...
BAS> log set-info 1 ( commad i have entered and it does somthing )

现在我不必像这样打开,我必须编写执行此操作的 java 代码。

  1. 连接主机23999端口
  2. 输入密码
  3. 输入逗号

Socket soc=new Socket("192.168.9.7",23999);
  while(true){
  //create buffered writer
  BufferedReader bwin = new BufferedReader(new InputStreamReader(soc.getInputStream()));
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
  BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
  String readFir = bwin.readLine();
  System.out.println(readFir);
        if(readFir.startsWith("Please")){
            System.out.println("Password Entered");
            bw.write("abc123");
            bw.flush();
            bw.close();  //close buffered Reader 
        }

        readFir = bwin.readLine();
        if(readFir.startsWith("Enter")){
            System.out.println("Enter command");
            bw1.write("log set-info 1");
            bw1.flush();
            bw1.close();  //close buffered Reader 
        }
        //readFir = bwin.readLine();
    }

这不起作用。实际上,我有点困惑我应该遵循什么方法。读者/作者之间非常困惑。

请帮忙。

【问题讨论】:

  • 你试过一个OutputStreamWriter吗?当您关闭第一个 BufferedWriter (bw) 时,您将关闭套接字输出流。此外,当您执行此操作时,写入标准输出的内容是什么?
  • @Jason - readFir = bwin.readLine() 处的 SocketClosed 异常;行

标签: java jakarta-ee bufferedreader


【解决方案1】:

只需要获取套接字输入流和输出流一次(在while循环之外执行此操作)。试试这样的:

Socket soc = new Socket("192.168.9.7",23999);
//create buffered writer
BufferedReader bwin = new BufferedReader(new InputStreamReader(soc.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
while (true) {
        String readFir = bwin.readLine();
        if (readFir == nul) break;
        System.out.println(readFir);
        if(readFir.startsWith("Please")){
            System.out.println("Password Entered");
            bw.write("abc123");
            bw.newLine();
            // instead might have to explicitly write "\r\n"
            // depending platform you're connecting from.
            bw.flush();
        }
        else if(readFir.startsWith("Enter")){
            System.out.println("Enter command");
            bw.write("log set-info 1");
            bw.newLine();
            bw.flush();
            bw.close();  //close buffered Writer
            break;
        } else System.out.println("Skip: " + readFir);
  }

要访问 Telnet 协议,最好使用 Apache Commons Net 之类的库,而不是自己动手。

【讨论】:

  • 执行后我得到:请输入密码进行身份验证:输入密码(在此行等待readFir = bwin.readLine();)
  • 为了调试添加 else 以打印任何意外的输入。
  • 使用您的代码,我又观察到了一件事。我的服务器正在读取这样的密码... reader = new BufferedReader(new InputStreamReader(in));密码 = reader.readLine(); // 这里它挂起,它无法读取密码。(如果我执行 bw.write("abc123"); bw.flush();bw.close(); 那么它能够读取密码...想知道为什么??)
  • 可能需要在密码后输入换行符。
  • 是的......添加换行符后......它运行良好。我有两个问题:1)为什么需要换行符。 2) 在哪些情况下 bwin.readLine();将返回 null。
猜你喜欢
  • 2012-02-27
  • 2018-10-07
  • 2015-07-07
  • 2014-06-06
  • 2012-03-30
  • 2011-10-28
  • 2011-04-03
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多