Как я могу отправить команду работающей Java-программе? - PullRequest
3 голосов
/ 25 июня 2009

У меня есть программа на Java, и я хочу отправить команду из моего приложения Win32. Обычно я бы использовал WM_COPYDATA, но какие у меня есть варианты с Java?

Ответы [ 5 ]

10 голосов
/ 25 июня 2009

Есть несколько способов взаимодействия между Java и Windows. Упорядочены по силе и сложности:

  • Для обработки оконных сообщений вы можете использовать Jawin - в нем даже есть демонстрация того, как обрабатывать оконные сообщения - или что-то подобное. Конечно, если вы связываете свою Java-программу с библиотекой, такой как Jawin, она никогда не будет работать на компьютере, отличном от Windows
  • Для простого взаимодействия между Win32 и Java мой любимый выбор - сокет, привязанный к прослушиванию только на localhost. Протокол может быть простым, но я бы предпочел простой текстовый протокол для упрощения отладки. Имейте в виду, что соединение с сокетом может прерваться, если пользователь завершит программу.
  • Вы можете использовать (локальные) веб-сервисы, как предложено в других сообщениях здесь. С обеих сторон убедитесь, что вы используете ваши библиотеки Webservice / XML для создания и анализа сообщений, слишком просто создать искаженный XML, если вы выполните конкатенацию строк.
  • Вы можете поместить функциональность своей программы Windows в компонент COM и использовать мост Java-COM-COM: Jacob или j-Interop являются популярными бесплатными библиотеками для этого, j-Integra кажется популярным выбором для компаний с устаревшими системами. .
  • Вы можете поместить функциональность вашей Java-программы в COM-компонент и использовать мост Sun-Java-ActiveX от Sun. Исходя из моего личного опыта, это довольно неловкий вариант: разработка моста Java-ActiveX остановилась с версии 1.4, установка ActiveX приводит к установке компонента Java где-то в каталоге JRE и отладке компонентов Java внутри контейнера ActiveX. довольно громоздко.

Sidenote: если вы имеете дело со строками с обеих сторон, всегда учитывайте, что Java обрабатывает строки как нечто совершенно отличное от байтовых массивов. Особенно если вы используете строки ANSI Windows, имейте в виду, что символы 81, 8D, 8F, 90 и 9D определены как неопределенные в кодовой странице Windows-1252, поэтому Java будет выдавать вопросительные знаки или исключения, если строки Windows содержат эти элементы. Поэтому, если это вообще возможно, используйте строки WChar на стороне Windows или ограничьтесь безопасными символами.

4 голосов
/ 25 июня 2009

Вам потребуется создать сетевой сервер, как описано в J16 SDiZ.

  • Один простой способ - использовать XML-RPC . Есть готовые библиотеки для Java и практически любого другого языка, и это просто. Мы используем это в нашем приложении. Но на самом деле подойдет любой сетевой протокол.
  • Для очень простых случаев вы также можете просто создать файл и опрашивать его со стороны Java.
  • Вы также можете использовать именованные каналы: http://www.coderanch.com/t/328057/Java-General-advanced/java/Use-Named-Pipe-IPC-between
  • Тогда есть также RMI , но это, вероятно, слишком много для вашей (простой) цели. Наконец, вы можете использовать JNI для прямого доступа к собственному механизму связи Windows.

Лично я бы использовал XML-RPC или какой-нибудь другой простой стандартизированный протокол.

3 голосов
/ 25 июня 2009

Нет, вы не можете.

Вы должны создать сетевой сервер и прослушать (локальный) сокет. Или, в качестве альтернативы, используйте JNI.

1 голос
/ 25 июня 2009

Вы можете использовать потоки ввода / вывода командной строки для отправки команд и получения ответов:

  • System.in, завернутый в BufferedReader и вызывающий readLine()
  • System.out.println() для написания ответов

Полагаю, в Win32 есть методы для захвата потоков ввода-вывода запускаемого вами приложения.

В основном, эквивалент Windows для Linux:

ls | grep java
1 голос
/ 25 июня 2009

Java и win32 используют много одинаковых технологий, поэтому обмен данными между двумя приложениями невозможен, нужно просто выбрать транспорт и протокол, общий для обоих приложений

Некоторые опции:

  1. Создание TCP-соединения между процессами и отправка пакетов в интерфейс обратной связи.
  2. Используйте все, что есть в Java для взаимодействия с собственным кодом (JNI?), Чтобы подписаться на пользовательские сообщения (в смысле слова win32)
  3. Используя собственный код, установите именованный канал между двумя процессами
  4. Чтение / запись в текстовый файл (не лучшая идея)

Надеюсь, это поможет

...