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

标签 java osgi telnet

我有一个 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);
  }
}

关于Java 和 telnet - java.net.SocketException : Broken pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413298/

相关文章:

java - 最快的双向 java prolog 实现

重载方法时Java方法继承问题

java - OSGI web 包出现奇怪的问题,现在完全丢失了

c++ - 通过网络发送 CTRL-C

java - 如何检测用户输入什么 URL 来连接到您的服务器?

java - @Size hibernate注解可以继承吗?

java - Apache Camel 缓存配置不起作用

maven - OSGi Maven 依赖项 vs import-packge vs embed-dependency

osgi - 查找特定 event.topic 的 EventHandler

linux - 从一个文件测试多个服务器的 telnet 连接