Именованные каналы между программами Java и C / C ++ - PullRequest
2 голосов
/ 06 ноября 2010

Я думаю об использовании в Windows именованного канала для связи между двумя приложениями, написанными на Java и C. Обычно для этого я использую сокетное соединение, но теперь мне нужно отменить эту идею и найти новое решение.

Я читал, что именованный канал в java может быть виден только внутри JVM-это правда? Есть ли способ установить именованный канал между двумя приложениями, написанными на разных языках?

Если нет, то какую технологию Вы советуете?

Ответы [ 3 ]

3 голосов
/ 06 ноября 2010

Чтобы создать именованный канал Windows в Java, вам придется прибегнуть к использованию JNI для вызова собственных функций WINAPI.

Вы можете создать именованный канал в C ++ и использовать его в Java, открыв его как файл в пространстве имен канала после того, как он был создан.

2 голосов
/ 06 ноября 2010

Именованные каналы получить гораздо сложнее, чем использовать сокеты. Концептуально они проще. Однако сделать их надежными и разумно отказоустойчивыми гораздо сложнее, чем для розеток.

Я бы посоветовал вам пересмотреть сокеты, они предназначены для связи между процессами. Можете ли вы уточнить, почему вы не можете использовать сокеты? Причина, по которой я спрашиваю, состоит в том, что именованные каналы в действительности использовали сокеты поверх loopback.

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

Возможно, вы слышали о PipedInputStream и PipedOutputStream, и эти классы могут использоваться только в одном процессе (что делает их довольно бесполезными)

РЕДАКТИРОВАТЬ: Если вам нужен независимый вид наиболее распространенного и, возможно, наиболее разумного способа отправки данных, я предлагаю вам попробовать Google.

java sockets - 2,210,000 hits
java named pipes - 90,000 hits

Так что, возможно, сокеты в 25 раз более разумны, чем именованные каналы. (и более поддерживаемым, так как есть больше учебных пособий и людей, которые имеют опыт работы с ними)

0 голосов
/ 06 ноября 2010

Вы можете просто запустить внешний процесс в Java и подключиться к его каналам.

    // Execute command
    String command = "ls";
    Process child = Runtime.getRuntime().exec(command);

    // Get pipes from process
    InputStream in = child.getInputStream();
    OutputStream out = child.getOutputStream();
    InputStream error = child.getErrorStream();
...