2010-11-06 56 views
2

我想在windows中使用命名管道来在两个使用Java和C编写的应用程序之间进行通信。通常我使用套接字连接来执行此操作,但现在我必须取消该想法并找到新的解决方案。在Java和C/C++程序之间命名的管道

我读了java中的命名管道只能在JVM中可见 - 这是真的吗? 有没有一种方法可以在两种不同语言的应用程序之间建立命名管道?

如果不是,您建议哪种技术?

回答

3

为了创建在Java中的Windows命名管道,你必须求助于使用JNI调用本地WINAPI函数。

尽管如此,您仍然可以在C++中创建命名管道,并在创建管道命名空间后将其作为管道命名空间中的文件打开,从而在Java中使用它。

0

您可以简单地在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(); 
+2

虽然我觉得你提出的解决方案相当实用,但你所描述的不是命名管道。命名管道必须从外部寻址(在* nix系统的情况下通过文件系统)。 – 2011-08-05 08:42:36

2

命名管道比使用套接字要困难得多。从概念上讲,它们更简单。然而,使它们可靠和合理的容错性比插座要困难得多。

我建议你重新考虑套接字,这是为进程之间的通信而设计的。你能澄清为什么你不能使用套接字?我问的原因是命名管道实际上使用套接字来实现环回。

命名管道是一个操作系统构造。您可以在您的操作系统中创建命名管道,然后可以像访问Java和C或任何其他程序一样访问该管道。通过文件处理进程之间的通信非常困难(如果不是不可能的话)例如,除非您设计自己的流量控制协议,否则当您写入命名管道时,您不会知道任何东西正在读取它。 (很难在所有情况下测试)

你可能听说过的PipedInputStream和的PipedOutputStream和这些类只能在同一过程中使用(使它们毫无用处)

编辑:如果你想要一个独立的视图最常见也可能是最明智的方式发送数据我建议你试试谷歌。

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

所以也许套接字比命名管道更灵敏25倍。 (更多的支持,因为有更多的教程和有经验的人)

+0

我的老板说我不能使用套接字,所以我不能:)真正的是,我写了Java部分和我的朋友从工作做C/++ /德尔福部分。他的老板说套接字很难实现,并迫使我去思考别的东西......所以现在我选择命名管道。 – lipkerson 2010-11-06 10:09:25

+0

你写道,命名管道的实现很简单,但使其稳定是困难的...嗯在我的项目中有非常简单的数据交换结构:一个字符串和一个答案out,这就是所有。你是否仍然认为这很难做到这一点稳定? Thx重播:) – lipkerson 2010-11-06 10:12:38

+0

你的老板说你不能使用套接字?为什么?他的预算是多少?如果不起作用,他的风险减轻程度如何?或者如果你不能及时工作?映射到禁止使用套接字的业务需求是什么? – EJP 2010-11-06 11:37:57

相关问题