Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Processbuilder输出流_Java_Sockets_Cmd - Fatal编程技术网

Java Processbuilder输出流

Java Processbuilder输出流,java,sockets,cmd,Java,Sockets,Cmd,我目前正在用java开发某种远程cmd,并使用ProcessBuilder运行cmd会话。但是我有一个问题,我可以得到cmd的输出,但是我不知道如何将命令发送到正在运行的cmd会话中以便执行它们 这是我的服务器代码: ServerSocket server = new ServerSocket(port); while(true){ Socket socket = server.accept();

我目前正在用java开发某种远程cmd,并使用ProcessBuilder运行cmd会话。但是我有一个问题,我可以得到cmd的输出,但是我不知道如何将命令发送到正在运行的cmd会话中以便执行它们

这是我的服务器代码:

ServerSocket server = new ServerSocket(port);
                while(true){
                    Socket socket = server.accept();
                    new Thread(() -> {
                        try {

                        ProcessBuilder processBuilder = new ProcessBuilder();
                        processBuilder.command("cmd.exe");
                        Process process = processBuilder.start();
                        Thread.sleep(100);
                        process.getOutputStream().write("dir".getBytes());

                        while(process.isAlive() && !socket.isClosed()) {
                            while(process.getInputStream().available() > 0) {
                                socket.getOutputStream().write(process.getInputStream().read());
                            }
                            while(process.getErrorStream().available() > 0) {
                                socket.getOutputStream().write(process.getErrorStream().read());
                            }
                            while(socket.getInputStream().available() > 0) {
                                System.out.println("input");
                                process.getOutputStream().write(socket.getInputStream().read());
                            }
                        }
                        System.out.println("EXIT");
                        socket.close();
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }).start();
                }
这是我的客户代码:

Socket s = new Socket(ip, Main.CMD_PORT);
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            while(!closed) {
                String line;
                if(s.getInputStream().available() > 0 && (line = br.readLine()) != null) textArea.append(line + "\n");
                if(buffer != "")  {
                    s.getOutputStream().write(buffer.getBytes());
                    buffer = "";
                }           
            }
            System.out.println("END");
            s.close();
            dispose();
缓冲区包含应执行的命令。 现在,当我同时运行这两个命令时,我会得到以下输出,但我无法运行命令

Microsoft Windows [Version 10.0.18362.657]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.

我现在自己把它修好了。我需要将套接字输入流读取到缓冲区,然后将其写入cmd.exe的输出流

try {

                        ProcessBuilder processBuilder = new ProcessBuilder();
                        processBuilder.redirectErrorStream(true);
                        processBuilder.command("cmd.exe");
                        Process process = processBuilder.start();
                        System.out.println("Console Started");
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        while(process.isAlive()) {
                            while(process.getInputStream().available() > 0) {
                                int i = process.getInputStream().read();
                                socket.getOutputStream().write(i);
                            }
                            while(socket.getInputStream().available() > 0) {
                                String line = br.readLine();
                                bw.write(line);
                                bw.newLine();
                                bw.flush();
                            }
                        }
                        process.destroy();
                        socket.close();
                        } catch(Exception e) {
                        }
Thread.sleep(100)是一种代码气味/反模式