2011-01-05 5 views
1

インターネットでさまざまな言語で送信されるデータの速度をテストするサイエンスプロジェクトで、依然として作業しています。私の先生は、これが十分に難しいとは思わないようで、クライアントをコントロールするためのメインJavaプログラムを実行したいと思っています。Java外部スクリプトを開いて入出力を行う

私は外部ファイルを実行する方法を考え出しましたが(ファイル名のスペースにはまだ問題があります)、それでいいです。私の問題は、オープンなクライアント(Python、C、C++、Java、およびRubyクライアント)にテストする回数を何とか通訳する必要があることです。テストで取得したデータセットを取得する必要があります。

最後に、私はPython、C、C++、Java、およびRubyスクリプトをjavaから入力し、それらの出力を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は.exesしか実行していないようです。 JNIは有望ですが、CおよびC++とのみ互換性があるようです。私はSWIG(http://www.swig.org/)を使ってJavaからC/C++をRuby/Pythonに移行することができました。しかし、これは非常に簡素化された解決策ではありません。うまくいけば、それはそれに来ないので、私は見続けるだろう – Curlystraw

0

は、Java、C/C++、RubyやPythonのそれぞれのインスタンスを実行している間のメッセージにはいくつかのクロス言語のAPIを使用して検討するかもしれません。

  • Spread(何のRubyサポートがありませんように思える)
  • RabbitMQ(AMQP)は、すべてのあなたのリストされている言語をサポートして、いくつか。
  • DBusリストされたすべての言語をサポートしてから一部をサポートします。
  • Apache Thriftリストされたすべての言語をサポートしてからサポートします。
  • HTTPとGoogle ProtocolBuffersリストされたすべての言語をサポートしてから一部をサポートします。

仲介者としてテキストファイルを使用するよりも少し複雑ですが、おそらくよりパフォーマンスが高く拡張性があります。

// Nicholas

関連する問題