2011-01-05 49 views
1

好吧,仍在研究一个科学项目,其中涉及用不同语言通过互联网发送数据的速度测试。我的老师似乎并不认为这很困难,并且希望我运行一个主要的Java程序来控制客户端。Java打开外部脚本并给出输入/获得输出

我已经想出了如何运行外部文件(尽管在文件名中有空格仍然有问题),并且很好。我的麻烦是我需要以某种方式连接到已打开的客户端(我有Python,C,C++,Java和Ruby客户端)测试的次数,并且我需要获取通过测试获得的数据集。最后,我需要找到如何将输入发送到Java,Python,C,C++,Java和Ruby脚本,并从它们收集输出到Java中。作为最后的手段,我可​​能有一个文本文件充当主java程序和每个客户端之间的中介。这不是一个非常优雅的解决方案,所以我宁愿避免它。

回答

1

您可能正在寻找JNI - Java Native Interface。 JNI肯定会满足你老师对难度的要求。 JNI允许Java代码在其他语言中调用代码,并获得回应,就像调用Java方法一样。我知道的JNI最大的问题是本地(C,C++等)代码中的崩溃也会导致Java程序崩溃。 JNI会将您当前的应用程序的外部脚本内部代码制作成内容代码,而且可能比您需要的更困难。

对于更简单的解决方案,您可能需要查看Java中的ProcessBuilder类。例如:

ProcessBuilder pb = new ProcessBuilder("myshellScript.sh", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory("myDir"); 
Process p = pb.start(); 
InputStream is = p.getInputStream(); 
// use process p's input stream is to provide input to your process here 
OutputStream os = p.getOutputStream(); 
// use process p's output stream to get the results here 
+0

嗯,我已经看了这些,它似乎是唯一的ProcessBuilder运行.EXE文件。 JNI看起来很有前景,但它似乎只与C和C++兼容。我可以使用SWIG(http://www.swig.org/)从Java到C/C++到Ruby/Python。但是,这不是一个非常简化的解决方案。希望它不会来,所以我会继续寻找 – Curlystraw 2011-01-10 14:38:14

0

您可以考虑使用一些跨语言的API,以每个Java,C/C++,Ruby和Python的运行实例之间的消息。

  • Spread(好像没有Ruby支持)
  • RabbitMQ(AMQP)支持所有列出的语言,然后一些。
  • DBus支持所有列出的语言,然后一些。
  • Apache Thrift支持所有列出的语言,然后一些。
  • HTTP和Google ProtocolBuffers支持所有列出的语言,然后是一些。

这将是一个有点比使用文本文件作为中介较为复杂,但可能更高性能和可扩展性。

//尼古拉斯