使用 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");
我正在使用 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");