2010-11-06 54 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

相關問題