Java 和 telnet - java.net.SocketException:管道损坏

Java and telnet - java.net.SocketException: Broken pipe

我有一个 osgi 框架,我想通过 telnet 连接到它,以便只发送一个命令 - 关机。这就是为什么我不想使用像 apache commons telnet 这样的 telnet 库。 我的代码:

System.out.println("I am stopping....");
Socket socket=new Socket("localhost",6666);
String command="shutdown";
PrintWriter pw = new PrintWriter( socket.getOutputStream(), true);
pw.print(command);
pw.flush();
socket.close();
pw.close();

它关闭了 osgi 但在 osgi 框架方面我得到:

org.apache.felix.shell.remote [27] TerminalPrintStream::print()
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at org.apache.felix.shell.remote.TerminalPrintStream.print(TerminalPrintStream.java:48)
    at org.apache.felix.shell.remote.TerminalPrintStream.println(TerminalPrintStream.java:63)
    at org.apache.felix.shell.remote.Shell.startFelixShell(Shell.java:130)
    at org.apache.felix.shell.remote.Shell.run(Shell.java:86)
    at java.lang.Thread.run(Thread.java:745)

如何解决?

编辑 1:
然而,以下代码毫无例外地工作(apache commons net)。

TelnetClient telnet=new TelnetClient();
        try {
            telnet.connect("localhost", 6666);
            BufferedInputStream input = new BufferedInputStream(telnet.getInputStream());  
            PrintStream output = new PrintStream(telnet.getOutputStream());  
            output.println("shutdown");
            output.flush();
        } catch (IOException ex) {
            Logger.getLogger(ProgramManager.class.getName()).log(Level.SEVERE, null, ex);
        }

您不应在发送命令后立即关闭流,因为在这种情况下服务器无法响应并抛出异常。您应该读取套接字的流,直到它被服务器关闭。一旦远程 shell 模块停止,它将立即关闭。

根据您的代码:

System.out.println("I am stopping....");
String command="shutdown";
try (Socket socket=new Socket("localhost",6666)) {
  OutputStream out = socket.getOutputStream();
  InputStream in = socket.getInputStream();
  out.write(command.getBytes(Charset.defaultCharset()));

  // Wait until server closes the stream. Could be enhanced with some timeout
  BufferedReader reader = new BufferedReader(new InputStreamReader(in, 
      Charset.defaultCharset())));
  String line = reader.readLine();
  while (line != null) {
    System.out.println(line);
  }
}