2009-03-11 12 views
24

Trên hệ thống Linux của chúng tôi, chúng tôi sử dụng các đường ống được đặt tên để liên lạc giữa các quá trình (nhà sản xuất và người tiêu dùng).Làm cách nào để mở một đường dẫn có tên Windows từ Java?

Để kiểm tra mã người tiêu dùng (Java), tôi muốn thực hiện (trong Java) một nhà sản xuất giả viết một đường ống có tên được kết nối với người tiêu dùng.

Bây giờ, thử nghiệm cũng sẽ hoạt động trong môi trường phát triển Windows. Vì vậy, tôi muốn biết cách tạo một đường ống có tên trong Windows từ Java. Trong Linux, tôi có thể sử dụng mkfifo (được gọi là sử dụng Runtime.exec()), nhưng làm cách nào để thực hiện điều này trên Windows?

Trả lời

22

Use Named Pipes to Communicate Between Java and .Net Processes

phần có liên quan trong liên kết

try { 
    // Connect to the pipe 
    RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\testpipe", "rw"); 
    String echoText = "Hello word\n"; 
    // write to pipe 
    pipe.write (echoText.getBytes()); 
    // read response 
    String echoResponse = pipe.readLine(); 
    System.out.println("Response: " + echoResponse); 
    pipe.close(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+2

Mã trên có hiệu quả với ai đó không? Tôi đã thử nó trên Windows 7 x64, Java 1.7.0_45 và kết quả là 'java.io.FileNotFoundException: \\. \ Pipe \ testpipe (Hệ thống không thể tìm thấy tệp được chỉ định) tại java.io.RandomAccessFile.open (Phương thức Gốc) tại java.io.RandomAccessFile. (RandomAccessFile.java:122) '. Nếu nó được tạo ra thuận tay như đã đề cập [trong bài đăng này] (http://answers.microsoft.com/en-us/windows/forum/windows8_1-files/windows-81-enterprise-64-bit-running-java-jdk/f67d1302-905e-4511-ba1b-0888b259258a)? –

+5

Tôi nhận được câu trả lời cho câu hỏi của mình ở trên: trong Java, bạn không thể tạo một đường ống có tên (trừ khi người ta sử dụng [JNA] (https://github.com/java-native-access/jna/blob/master/contrib /platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java)), chỉ để mở một câu trả lời hiện có (xem [câu trả lời này] (http://stackoverflow.com/a/2247022/267197) và [ bài đăng đó] (https://cdimascio.wordpress.com/2014/01/11/named-pipes-with-java/)). Rất cám ơn các câu trả lời dưới đây. –

+1

@dma_k Tôi gặp lỗi tương tự. Dường như không thể tạo một đường ống có tên bằng Java nhưng mã hoạt động với một đường ống hiện có đã được tạo trong một quy trình khác (ví dụ: quy trình .Net trong ví dụ được liên kết). – Michael

7

Trong cửa sổ, named pipes exist nhưng chúng cannot be created as files in a writeable filesystem và không có công cụ dòng lệnh. Họ sống trong một hệ thống tập tin đặc biệt và có thể được tạo ra chỉ bằng cách sử dụng API Win32.

Có vẻ như bạn sẽ phải sử dụng mã gốc hoặc chuyển từ đường ống sang ổ cắm cho IPC - có lẽ là giải pháp dài hạn tốt nhất, vì nó dễ di chuyển hơn nhiều.

0

có thể có thể sử dụng Cygwin tên ống - nếu tất cả các quá trình của bạn đang Cygwin.

+0

Để thực hiện việc này, bạn cần Java trên Cygwin. Có vẻ như tôi không chắc chắn lắm, mặc dù bạn có thể dùng nó với một trong những JRE không phải của Sun. – user314104

1

Có thể đọc và ghi vào tên ống có sẵn trong Java. Bạn không thể, với kiến ​​thức của tôi, tạo ra một đường ống có tên trong môi trường Windows. Linux là một câu chuyện khác nhau vì các đường ống được đặt tên có thể được tạo và sử dụng như các tệp.

liên kết có liên quan về tương tác với một đường ống hiện có: http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html

0

Bạn có thể tạo đường ống đặt tên sử dụng thư viện JNA https://github.com/java-native-access/jna

Nó được thể hiện rõ trong các thử nghiệm sau đây: https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java

API của JNA wrapper là giống như Win32 do đó bạn sẽ có thể sử dụng tất cả các tính năng và sức mạnh của các đường ống có tên trên Windows.