Java Открытие внешних скриптов И предоставление ввода / получения вывода - PullRequest
1 голос
/ 05 января 2011

Хорошо, все еще работаю над научным проектом, включающим тестирование скорости передачи данных через Интернет на разных языках.Кажется, мой учитель не считает, что это достаточно сложно, и хочет, чтобы я запустил основную Java-программу для управления клиентами.

Я выяснил, как запускать внешние файлы (все еще возникают проблемы с пробелами вимя файла, хотя) и я в порядке с этим.Моя проблема в том, что мне нужно каким-то образом коммутировать открытому клиенту (у меня есть клиент Python, C, C ++, Java и Ruby), сколько раз нужно тестировать, и мне нужно получить набор данных, полученный в ходе тестирования.

В конце мне нужно выяснить, как отправлять входные данные в сценарии Python, C, C ++, Java и Ruby из java и собирать выходные данные из них для помещения в java.В качестве последнего средства я, вероятно, могу использовать текстовый файл в качестве посредника между основной Java-программой и каждым из клиентов.Это не очень элегантное решение, поэтому я бы предпочел его избежать.

Ответы [ 2 ]

1 голос
/ 05 января 2011

Возможно, вы ищете JNI - собственный интерфейс Java .JNI обязательно выполнит просьбу вашего учителя о трудностях.JNI позволяет коду Java вызывать код на других языках и получать ответы обратно, как если бы вы вызывали метод Java.Самая большая проблема, с которой я столкнулся при работе с JNI, заключается в том, что сбой в нативном (C, C ++ и т. Д.) Коде также приведет к сбою вашей Java-программы.JNI создаст для вашего приложения то, что в данный момент является внутренним кодом внешнего сценария, и, возможно, это будет гораздо сложнее, чем вам нужно.

Для более простого решения вы можете заглянуть в ProcessBuilder класс на Java.Например:

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 голосов
/ 05 января 2011

Вы могли бы рассмотреть возможность использования некоторого межъязыкового API для сообщения между запущенными экземплярами каждого из Java, C / C ++, Ruby и Python.

  • Распространение (кажется, что естьбез поддержки Ruby)
  • RabbitMQ (AMQP) Поддерживает все перечисленные языки, а затем некоторые.
  • DBus Поддерживает все перечисленные языки, а затем некоторые.
  • Apache Thrift Поддерживает все перечисленные языки и затем некоторые.
  • HTTP и Google ProtocolBuffers Поддерживает все перечисленные языки и затем некоторые.

Это будет немного сложнее, чем использование текстовых файлов в качестве посредника, но, вероятно, более производительным и расширяемым.

// Николас

...