簡體   English   中英

Java和C / C ++程序之間的命名管道

[英]Named pipes between Java and C/C++ programs

我想在Windows中使用命名管道在兩個用Java和C編寫的應用程序之間進行通信。通常我使用套接字連接來執行此操作,但是現在我必須取消這個想法並找到一個新的解決方案。

我讀到Java中的命名管道僅在JVM內部可見,這是真的嗎? 有沒有辦法在兩個使用不同語言的應用程序之間建立命名管道?

如果沒有,您建議使用哪種技術?

為了用Java 創建 Windows命名管道,您必須訴諸使用JNI來調用本地WINAPI函數。

不過,您可以在C ++中創建命名管道,並在Java中通過在創建命名管道之后將其作為文件在命名空間中打開來使用它。

與使用套接字相比,命名管道更難正確。 從概念上講,它們更簡單。 但是,使其可靠且具有合理的容錯能力要比插座難得多。

我建議您重新考慮套接字,這是為進程之間的通信而設計的。 您能否闡明為什么不能使用套接字? 我問的原因是實際上命名管道實際上使用了套接字而不是環回。

命名管道是OS構造。 您可以在操作系統中創建命名管道,然后可以像Java和C或任何其他程序將其作為文件一樣對其進行訪問。 通過文件進行的進程之間的通信很難正確處理(如果不是不可能的話),例如,您將不知道在寫入命名管道時,除非設計了自己的流控制協議,否則任何東西都可以讀取它。 (在所有情況下都很難測試)

您可能聽說過PipedInputStream和PipedOutputStream,這些類只能在同一進程中使用(使它們非常無用)

編輯:如果您想要最常見和可能最明智的方式來發送數據的獨立視圖,我建議您嘗試使用google。

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

因此,也許套接字比命名管道明智得多25倍。 (隨着更多的教程和有經驗的人的加入,它也將受到更多的支持)

您只需在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM