使用 servlet 从 exe 返回值不起作用

Returning Value from exe using servlet not working

我正在使用 servlet 读取 exe 文件的值,如下所示:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

// Extend HttpServlet class
public class HelloWorld extends HttpServlet {

  public void service(HttpServletRequest rq, HttpServletResponse rs) throws IOException, ServletException {

       PrintWriter out = rs.getWriter();
      String filePath = "C:\Tomcat 8.0\webapps\ROOT\code\cpp\param.exe";
    if (new File(filePath).exists()) {
    try {
        ProcessBuilder pb = new ProcessBuilder(filePath,"10","13");
        pb.redirectError();
        pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
        pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        Process p = pb.start();
        InputStream is = p.getInputStream();
        int value = -1;

        while ((value = is.read()) != -1) {

            //out.println("here");
           // System.out.print((char) value);
            out.println(String.valueOf(value));

        }

        int exitCode = p.waitFor();

        out.println(filePath + " exited with " + exitCode);
    } catch (Exception e) {
        e.printStackTrace();
    }
} else {
    System.err.println(filePath + " does not exist");
}

  }
}

exe文件,实际上是cpp中的exe。该 exe 将 return 数字 10、13 的总和使用:

 ProcessBuilder pb = new ProcessBuilder(filePath,"10","13");

但我没有得到总和。我做错了什么?我得到的输出为

C:\Tomcat 8.0\webapps\ROOT\code\cpp\param.exe exited with 0

可惜不是总和。请帮帮我!!

不久前,我出于相同目的编写了一些代码,但使用运行时 class,也许它可以帮助您:

    public int runClient(String args[]) throws IOException, InterruptedException{
        Runtime runtime = Runtime.getRuntime();
        String options = "";
        for(String arg : args){
            options+=" "+arg;
        }
        String command ="./StartClient"; #change it with your file path
        command += options;
        System.out.println("Lauching: "+command);
        Process process = runtime.exec(command);

        BufferedReader input = new BufferedReader(new InputStreamReader(
                process.getInputStream()));

        String line = input.readLine();

        while(true){
            if(line==null){
                break;
            }
            System.out.println(line);

            line= input.readLine();
        }

        return process.waitFor();
    }

比较代码主要区别在于while循环,可能是你的程序立即跳出循环。

不确定,但可能是路径或环境问题。因为当您从命令行启动程序时,您有一个包含 PATH 变量的 标准 环境。但是我怀疑Tomcat要搭建新环境

如果您的 exe 文件(从它的名字来看,我假设它是一个 C++ 可执行文件)使用 DLL 文件并且以错误的 PATH 启动它无法找到它们。

如何确认:只需从 servlet 中打印路径:

System.out.println(System.getenv("PATH"));

然后在 cmd window 中,将路径设置为该值并尝试执行您的程序:C:\Tomcat 8.0\webapps\ROOT\code\cpp\param.exe 13 10

如果问题得到确认,如何解决:

  • 如果可能,静态重建param.exe
  • param.exe 包装在批处理文件中,其中第一行设置正确的 PATH 并从您的 servlet 启动批处理文件

    ProcessBuilder pb = new ProcessBuilder("CMD.EXE", "/C", batchPath + " 10 13");