2011-01-05 44 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支持所有列出的語言,然後是一些。

這將是一個有點比使用文本文件作爲中介較爲複雜,但可能更高性能和可擴展性。

//尼古拉斯