Java Telnet Socket: BufferedReader/BufferedWriter Java中的Telnet Socket:BufferedReader / BufferedWriter

5
我的服务器在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)时,你也会关闭套接字输出流。另外,当你执行这个操作时,stdout上会输出什么? - CodeMonkey
@Jason - 在readFir = bwin.readLine();行出现了SocketClosed异常。 - VJS
1个回答

3

只需要一次获取socket的输入流和输出流(在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();处等待) - VJS
可能需要在输入密码后换行。 - CodeMonkey
是的...添加换行符后,程序正常运行。我有两个问题:1)为什么需要换行符。2)在哪些情况下bwin.readLine()会返回null。 - VJS
如果通过命令行输入,您需要输入密码,然后按Enter键,这本身就是输入字符串的一部分。当输入流没有更多内容可读取时,Readline()将返回null。 - CodeMonkey
Oracle的示例是使用两次来实现的。 - Thufir
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接